unittest是Python语言的单元测试框架,在Python的官方文档中,对unitest单元测试框架进行了详细的介绍。 https://docs.python.org/3/library/unittest.html
unittest单元测试框架提供了创建测试用例、测试套件和批量执行测试用例的方案。在python安装成功后,unittest单元测试框架就可以直接导入使用,它属于标准库。作为单元测试的框架,unittest单元测试框架也是对程序的最小模块进行的一种敏捷化测试。
利用单元测试框架,可以创建一个类,该类继承unittest的TestCase,这样可以把每个TestCase看成是一个最小单元,由测试套件组织起来,运行时直接执行即可,同时可引入测试报告。
- 测试固件
在unittest单元测试框架中,测试固件用于处理初始化的操作,例如,在对百度的搜索进行测试之前,首先需要打开浏览器并且进入百度首页;测试结束后,需要关闭浏览器。测试固件提供了两种执行方式,一种是每次执行一个测试用例,测试固件都会被执行到;另外一种是不管有多少个测试用例,测试固件只执行一次。
测试固件每次都执行
import unittest class DemoTest(unittest.TestCase): def setUp(self): #1 print('start') def tearDown(self): #3 print('end') def test_add_story(self): #2 print('测试用例1执行') def test_edit_story(self): print('测试用例2执行') if name == 'main': unittest.main(verbosity=2)
执行结果:
执行顺序是先执行setUp方法,再执行具体的测试用例test_add_story, 最后执行tearDown方法,这个过程执行两次,如果在一个测试类中有N个测试用例,那么也就意味着着打开N次浏览器,关闭N次浏览器,而关闭和打开浏览器都会占用一定的资源和时间,很显然,性能不好,执行时间长
from selenium import webdriver import unittest import time as t class DemoTest(unittest.TestCase):def setUp(self): #1
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(30)
def tearDown(self): #3
t.sleep(5)
self.driver.quit()
def test_add_story(self): #2
print('执行新增需求测试用例')
…………def test_delete_story(self):
print("执行删除需求测试用例")
…………def _add_data_to_name_and_description(self, name, description):
………… if name == 'main': # unittest.main(verbosity=2) suite = unittest.TestSuite() suite.addTest(DemoTest("test_add_story")) suite.addTest(DemoTest("test_edit_story")) suite.addTest(DemoTest("test_delete_story")) #执行测试 runner = unittest.TextTestRunner() runner.run(suite)
unittest的main()方法执行用例的顺序是按照测试类、测试方法的名字的ASCII顺序来执行测试方法。如果想要控制执行顺序,有以下两种方式:
- 通过TestSuite按照顺序添加想要执行的方法,上面的代码用的就是此方法
- 顺应testunit的执行顺序,就是通过控制方法名字来实现
测试固件只执行一次
钩子方法setUp和tearDown虽然经常使用,但是在UI自动化测试中,一个系统的测试用例一般多达五百多条,打开和关闭五百次浏览器,会消耗大量的资源和时间。在unittest单元测试框架中可以使用另外一个测试固件来解决这一问题,它就是setUpClass和tearDownClass方法。该测试固件方法是类方法,需要在方法上面加装饰器@classmethod。使用该测试固件,不管多少个测试用例,测试固件只执行一次,也就是说不管多少个测试用例,执行的时候,浏览器只被打开一次和关闭一次。