Unittest测试框架
一、Unitest测试框架
- unittest 是python 的单元测试框架, unittest 单元测试提供了创建测试用例,并且提供了丰富的断言方法,测试套件以及批量执行的方案,最终生成测试结果。作为单元测试的框架, unittest 也是可以对程序最小模块的一种敏捷化的测试。
- unittest 和 Junit 都是单元测试?区别在于: unittest 是基于功能测试的单元测试,是基于 UI 界面的功能性测试,而 Junit 是白盒单元测试框架。
- 解决了单个脚本重复的操作(导包,获取浏览器驱动,关闭浏览器)
1、测试固件
1.1 setUp()
- 在执行测试用例脚本之前进行初始化环境的方法。
1.2 tearDown()
- 测试用例执行后,进行清理环境工作。
2、unittest 基本使用
-
测试文件以 test_ 开头(以 _test 结尾也可以)
-
测试类以 Test 开头,并且不能带有 __init__() 方法
-
测试函数以 test_ 开头
1 from selenium import webdriver 2 import time 3 import unittest 4 from selenium.webdriver.common.by import By 5 6 7 class TestUnit1(unittest.TestCase): 8 # 获取浏览器的驱动 9 def setUp(self): 10 # 1、self 就是类的引用/实例 11 # 2、全局变量的定义:self.变量名 12 self.driver = webdriver.Firefox() 13 self.driver.maximize_window() 14 self.url = "https://www.baidu.com/" 15 self.driver.get(self.url) 16 time.sleep(3) 17 18 # 在百度中搜索信息 19 # 测试用例的命名: test_ 20 def test_search1(self): 21 self.driver.find_element(By.ID,"kw").send_keys("世界杯") 22 self.driver.find_element(By.ID,"su").click() 23 time.sleep(3) 24 25 def test_search2(self): 26 self.driver.find_element(By.ID,"kw").send_keys("NBA") 27 self.driver.find_element(By.ID,"su").click() 28 time.sleep(3) 29 30 # 关闭浏览器 31 def tearDowm(self): 32 self.driver.quit() 33 34 # 一个入口 35 if __name__ == "__main__": 36 unittest.main()
3、测试套件(suit)
- 把不同文件下的测试用例组织起来形成的测试用例组。
- 把需要一次性执行的测试用例,放在一个套件中,就可以一次性运行。
3.1方式一:套件对象.addTest(测试类名('⽅法名'))
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method1'))
3.2方式二:将⼀个测试类中的所有⽅法进⾏添加
套件对象.addTest(unittest.makeSuite(测试类名)) 缺点: makeSuite() 不会提示!
suite.addTest(unittest.makeSuite(TestDemo1))
suite.addTest(unittest.makeSuite(TestDemo1))
1 #因为HTMLTestRunner是Python标准库的unittest模块的扩展,不能通过pip安装,只能下载放到python目录lib文件夹下2022.12.16 2 import time 3 import unittest,HTMLTestRunner 4 from selenium import webdriver 5 from selenium.webdriver.common.by import By 6 7 8 class baidu_search_test(unittest.TestCase): 9 '''这是百度测试搜索模块测试用例''' 10 #(-> None它是一个对函数的类型注解,简单表示方法什么都不返回。这个类型注解是在Python3.5介绍进来的,它是可选的,如果删掉,对执行完全没有影响) 11 def setUp(self) -> None: #所有用例执行之前都会调用这个方法,初始化工作 12 self.driver = webdriver.Firefox() 13 self.driver.get('https://www.baidu.com') 14 self.driver.maximize_window() 15 time.sleep(1) 16 def tearDown(self) -> None: #每条用例执行后都执行清理工作 17 time.sleep(1) 18 self.driver.quit() 19 #普通的测试方法 执行顺序按ascill码来 20 def test_cat(self): 21 '''测试搜索猫猫''' 22 self.driver.find_element(By.ID,'kw').send_keys('猫猫') 23 time.sleep(2) 24 self.driver.find_element(By.ID,'su').click() 25 time.sleep(2) 26 self.assertEqual(self.driver.title,'猫猫_百度搜索','搜索失败') 27 #第二种判断 28 # if self.driver.title == '猫猫_百度搜索': 29 # print('搜索猫猫成功。') 30 # else: 31 # print('搜索失败,当前页面已经截图保存。') 32 # self.driver.get_screenshot_as_file('g:/baidu_test1.png') 33 def test_panda(self): 34 '''测试搜索熊猫''' 35 self.driver.find_element(By.ID,'kw').send_keys('熊猫') 36 time.sleep(2) 37 self.driver.find_element(By.ID,'su').click() 38 time.sleep(2) 39 self.assertEqual(self.driver.title, '熊猫_百度搜索', '搜索失败') 40 # if self.driver.title == '熊猫_百度搜索': 41 # print('搜索熊猫成功。') 42 # else: 43 # print('搜索失败,当前页面已经截图保存。') 44 # self.driver.get_screenshot_as_file('g:/baidu_test2.png') 45 def test_tiger(self): 46 '''测试搜索老虎''' 47 self.driver.find_element(By.ID,'kw').send_keys('老虎') 48 time.sleep(2) 49 self.driver.find_element(By.ID,'su').click() 50 time.sleep(2) 51 # self.assertEqual(self.driver.title, '老虎_百度搜索', '搜索失败') 52 if self.driver.title == '老虎_百度搜索1': 53 print('搜索老虎成功。') 54 else: 55 print('搜索失败,当前页面已经截图保存。') 56 self.driver.get_screenshot_as_file('d:/baidu_test3.png') 57 if __name__== '__main__': 58 #创建测试套件对象 59 suite = unittest.TestSuite() 60 suite.addTest(unittest.makeSuite(baidu_search_test)) # 套件对象.addTest(unittest.makeSuite(测试类名)) 61 runner = unittest.TextTestRunner() #实例化运⾏对象 62 runner.run(suite)
3.3测试用例执行顺序
- 普通的测试方法 执行顺序按ascill码来,如按照test_后面的名称排序,0 ~ 9, A ~ Z,a ~ z。如果第一个字母相同,就看第二个字母,依次执行。
4、断言
- 在自动化脚本中来判断实际结果和预期结果是否一致情况。
- 就百度为例,如何判断查询成功?网页标题是搜索信息,或者页面中出现某个元素。
- assertEqual(预期结果,实际结果,msg = “实际结果于预期结果不一致时输出的内容”)。
5、HTML 报告生成
- 在测试用例较多时,就需要统计测试用例的执行结果。
- HTML 报告和错误截图都是用来分析测试用例批量执行后的结果的,错误截图可以帮助我们更清晰的看到错误具体出现的页面以及错误状况。
- 报告常用BeauifulReport或者HTMLTestRunner(注意:HTMLTestRunner是Python标准库的unittest模块的扩展,不能通过pip安装,只能下载放到python目录lib文件夹下)
1 #因为HTMLTestRunner是Python标准库的unittest模块的扩展,不能通过pip安装,只能下载放到python目录lib文件夹下2022.08.22 2 import time 3 import unittest,HTMLTestRunner 4 from selenium import webdriver 5 from selenium.webdriver.common.by import By 6 7 8 class baidu_search_test(unittest.TestCase): 9 '''这是百度测试搜索模块测试用例''' 10 #(-> None它是一个对函数的类型注解,简单表示方法什么都不返回。这个类型注解是在Python3.5介绍进来的,它是可选的,如果删掉,对执行完全没有影响) 11 def setUp(self) -> None: #所有用例执行之前都会调用这个方法,初始化工作 12 self.driver = webdriver.Firefox() 13 self.driver.get('https://www.baidu.com') 14 self.driver.maximize_window() 15 time.sleep(1) 16 def tearDown(self) -> None: #每条用例执行后都执行清理工作 17 time.sleep(1) 18 self.driver.quit() 19 #普通的测试方法 执行顺序按ascill码来 20 def test_cat(self): 21 '''测试搜索猫猫''' 22 self.driver.find_element(By.ID,'kw').send_keys('猫猫') 23 time.sleep(2) 24 self.driver.find_element(By.ID,'su').click() 25 time.sleep(2) 26 self.assertEqual(self.driver.title,'猫猫_百度搜索','搜索失败') 27 #第二种判断 28 # if self.driver.title == '猫猫_百度搜索': 29 # print('搜索猫猫成功。') 30 # else: 31 # print('搜索失败,当前页面已经截图保存。') 32 # self.driver.get_screenshot_as_file('g:/baidu_test1.png') 33 def test_panda(self): 34 '''测试搜索熊猫''' 35 self.driver.find_element(By.ID,'kw').send_keys('熊猫') 36 time.sleep(2) 37 self.driver.find_element(By.ID,'su').click() 38 time.sleep(2) 39 self.assertEqual(self.driver.title, '熊猫_百度搜索', '搜索失败') 40 # if self.driver.title == '熊猫_百度搜索': 41 # print('搜索熊猫成功。') 42 # else: 43 # print('搜索失败,当前页面已经截图保存。') 44 # self.driver.get_screenshot_as_file('g:/baidu_test2.png') 45 def test_tiger(self): 46 '''测试搜索老虎''' 47 self.driver.find_element(By.ID,'kw').send_keys('老虎') 48 time.sleep(2) 49 self.driver.find_element(By.ID,'su').click() 50 time.sleep(2) 51 # self.assertEqual(self.driver.title, '老虎_百度搜索', '搜索失败') 52 if self.driver.title == '老虎_百度搜索1': 53 print('搜索老虎成功。') 54 else: 55 print('搜索失败,当前页面已经截图保存。') 56 self.driver.get_screenshot_as_file('d:/baidu_test3.png') 57 if __name__== '__main__': 58 #创建测试套件对象 59 suite = unittest.TestSuite() 60 suite.addTest(baidu_search_test('test_panda')) #类名(方法名称) 61 suite.addTest(baidu_search_test('test_tiger')) #类名(方法名称) 62 report = open('D:\pythoncode\project02/test_report/baidu_test_report.html','w',encoding='utf-8') 63 runner = HTMLTestRunner.HTMLTestRunner(stream=report,title='百度测试报告',description='这是百度的测试报告') 64 runner.run(suite)
原创不易,转载请说明出处http://www.cnblogs.com/yyym 谢谢!