unittest是一个python版本的junit,junit是java中的单元测试框架
UI 功能单元测试
该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果
(1)测试固件(框架里面的固定方法)
setup 方法,测试环境和数据的准备工作
tearDown 做测试用例执行完之后的清理工作
(2)测试用例
一个用例是一个方法 ,def 名字以test_ 开头
(3)测试套件
把测试用例组织到一起进行一个整体的测试
必须以继承的方式来使用,Python也是一种面向对象的语言
- from selenium import webdriver
- import unittest
- import time
- import os
- from selenium.common.exceptions import NoAlertPresentException
- from selenium.common.exceptions import NoSuchElementException
-
- class Baidu1(unittest.TestCase):
- # 测试固件
- def setUp(self):
- print("-----setUp-----")
- self.driver = webdriver.Chrome()
- self.url = "https://www.baidu.com/"
- self.driver.maximize_window()
- time.sleep(3)
-
- def tearDown(self):
- print("-----tearDown-----")
- self.driver.quit()
- # 测试用例
- # 忽略测试用例的执行
- # @unittest.skip("skipping")
- def test_hao(self):
- driver = self.driver
- url = self.url
- driver.get(url)
- driver.find_element_by_link_text("hao123").click()
- time.sleep(6)
-
- def test_hbaidu(self):
- driver = self.driver
- url = self.url
- driver.get(url)
- # self.assertEqual("突如其来的假期_百度搜索", driver.title, msg="实际结果和预期结果不一致" )
- self.assertTrue("百度一下,你就知道" == driver.title, msg="不一致!!!")
- driver.find_element_by_id("kw").send_keys("突如其来的假期")
- driver.find_element_by_id("su").submit()
- time.sleep(5)
- print(driver.title)
- # self.assertEqual(driver.title, "突如其来的假期_百度搜索", msg="实际结果和预期结果不一致" )
- time.sleep(6)
-
- def saveScreenAsPhoto(self, driver, file_name):
- if not os.path.exists("./image"):
- os.makedirs("./image")
- now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
- driver.get_screenshot_as_file("./image/" + now + "-" + file_name)
- time.sleep(3)
-
- if __name__ == "__main__":
- unittest.main()
(1)unittest.TestSuite
addTest(脚本名称.类名称.方法名) 一个方法一个方法的添加
makesuit:
unittest.makeSuite(脚本名称.类名称)可以把一个类中所有的测试方法添加到测试套件中
TestLoader:
unittest.TestLoader().loadTestsFromTestCase 把一个类中所有的测试方法创建成一个测试套件返回
(2)把一个文件夹下所有测试脚本的测试用例都执行一遍
discover

- import unittest
- from src20211230 import testbaidu2
- from src20211230 import testbaidu1
-
- def creatSuit():
- # 要把不同的测试脚本的类中的需要执行的方法放在一个测试套件中
- # suit = unittest.TestSuite()
- # suit.addTest(testbaidu1.Baidu1("test_hao"))
- # suit.addTest(testbaidu2.Baidu2("test_hao"))
- # suit.addTest(testbaidu2.Baidu2("test_haidusearch"))
- # return suit
-
- #如果我需要把一个测试脚本中年所有的测试用例都添加到suit中,怎么做?
- # makeSuit
- # suit = unittest.TestSuite()
- # suit.addTest(unittest.makeSuite(testbaidu1.Baidu1))
- # suit.addTest(unittest.makeSuite(testbaidu2.Baidu2))
- # return suit
- # TestLoader
- # suit1 = unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1)
- # suit2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2)
- # suit = unittest.TestSuite([suit1, suit2])
- # return suit
- # 可以把一个文件夹下面所有的测试脚本中的测试用例放入测试套件
- discover = unittest.defaultTestLoader.discover("../src20211230", pattern="testbaidu*.py", top_level_dir=None)
- return discover
- if __name__ == "__main__":
- suit = creatSuit()
- # verbersity= 0, 1, 2
- # 数字1代表运行后的提示信息粗略 2代表运行失败后会详细写出哪里出现错了 0只会把错误的打印出来
- runner = unittest.TextTestRunner(verbosity=2)
- runner.run(suit)
0~9 A~Z a~z
测试方法名称
对于不想运行的测试用例打标签:
@unittest.skip("skipping")
测试用例的要素都有哪些?
测试步骤、测试数据、测试环境、预期结果
测试的最终结果其实就是判断实际结果和预期结果(符合需求标准)是否相符
断言:判断实际结果和预期结果是否相符合,(眼睛和大脑)
- self.assertEqual(arg1,arg2,msg = '') # 预判表达式arg1,arg2相等
- self.assertNotEqual(arg1,arg2,msg = '') # 预判表达式arg1,arg2不相等
- self.assertTrue(arg1,msg = '') # 预判表达式arg1为真
- self.assertFalse(arg1,msg = '') # 预判表达式arg1为假
运行一个测试套件,里面有上百个测试用例如何集中并且清晰的查看测试用例执行结果?
生成HTML报告的步骤:
curpath = sys.path[0] # 写在if __name__=="__main__" 中
- # 当前路径下resultreport文件夹不存在的时候,就创建一个
- if not os.path.exists(curpath+'/resultreport'):
- os.makedirs(curpath+'/resultreport')
- now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
- filename = curpath + '/resultreport/'+ now + 'resultreport.html'
- # 使用HTMLTestRunner 要导入包import HTMLTestRunner
- with open(filename, 'wb') as fp:
-
- runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"测试报告",
- description=u"用例执行情况", verbosity=2)
- suite = createsuite()
- runner.run(suite)
目的:保留测试结果现场
./image “ . ”代表当前文件所在的路径下
- try:
- self.assertEqual(driver.title, u"百度一下,你就知道", msg="不相等")
- except:
- self.saveScreenShot(driver, "hao.png") # 出现异常就调用截图函数进行截图
错误截图API:get_screenshot_as_file()
- # 截图函数
- def saveScreenShot(self, driver, file_name): # 参数:驱动,截图名字
- if not os.path.exists("./image"):
- os.makedirs("./image")
- now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
- driver.get_screenshot_as_file("./image/"+now+"-"+file_name)
- time.sleep(3)
数据驱动就是 用测试数据来驱动测试用例代码执行
(1)安装ddt
(2)导包
from ddt import ddt, unpack, data, file_data

(3)数据驱动的方式
@data(value) 一次性传一个参数,括号中写参数
@data(value1,value2.....)一次性传多个参数,需要用@unpack映射
@file_data("json文件")
@data(*解析数据的方法(txt/csv文件))