unittest 测试框架
一、unittest 编写规范
1、unittest 介绍
unittest,也可以称为PyUnit,类似于JUnit,用于python项目中,可以用来创建全面的测试套件,可以用于单元自动化测试(模块)、接口自动化测试(接口)、功能自动化测试(UI)等等。
官方文档:https://docs.python.org/3.6/library/unittest.html
unittest具备创建测试用例、测试套件、测试夹具的能力,包括的组件如下:
- Test Fixture(测试夹具):通过使用测试夹具,可以定义在单个或者多个测试执行之前的准备工作和测试执行后的清理工作。
- Test Case(测试用例):一个测试用例是在unittest中执行测试的最小单元。它通过unittest提供的assert方法来验证一组特定的操作或输入以后得到的具体响应。unittest提供了一个名为TestCase的基础类,可以用来创建测试用例。
- Test Suite(测试套件):一个测试套件是多个测试用例的集合,是针对被测程序的对应功能和模块创建的一组测试,一个测试套件内的测试将一起执行。
- Test Runner(测试执行器):测试执行器负责测试执行调试并且生成测试结果给用户。测试执行器可以使用图形界面、文本界面或者特定的返回值来展示测试执行结果。
- Test Report(测试报告):测试报告用来展示所有执行用例的成功或者失败状态的汇总,执行失败的测试步骤的预期结果与实际结果,还有整体运行状况及运行时间的汇总。注意,unittest本身是没有相应的内置模块来生成友好的报告,但我们可以借用unittest的扩展库HTMLTestRunner来实现,需要单独下载并放到python安装目录下。
2、unittest 编写规范
测试模块需导入 unittest 框架: import
测试类必须继承 unittest.TestCase; 建议以Test开头
测试方法必须以"test _"开头
二、unittest 测试框架结构
setUp()方法
一个测试用例是从setUp()方法开始执行的,用这个方法在每个测试执行前去执行一些初始化的任务。比如创建浏览器实例,访问URL,加载测试数据和打开日志文件等。此方法没有参数,不返回任何值。当定义一个setUp()方法,测试执行器在每次执行测试方法之前优先执行该方法。
tearDown()方法
类似于setUp()方法在每个测试方法之前被调用,TestCase类也会在测试执行完成后调用tearDown()方法来清理所有的初始化值。一旦测试被执行,在setUp()中定义的值将不再需要,所以最好的在完成的时候清理掉。
setUpClass()方法
必须使用@classmethod 装饰器, 所有case运行之前只运行一次
tearDownClass() 方法
必须使用@classmethod装饰器, 所有case运行完之后只运行一次
unittest.skip():装饰器
当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。
@unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.expectedFailure(): expectedFailure()测试标记为失败。
三、unittest 测试用例
1、unittest 会自动识别以test开头的方法为测试用例
2、执行顺序为test后面字母顺序执行;例如: test_a、test_b、test_c
四、unittest 执行测试用例4中方法
1、unittest.main()
2、加入到容器中执行
# 构造测试集
suite = unittest.TestSuite()
suite.addTest(TestClass("test_method1"))
suite.addTest(TestClass("test_method2"))
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
3、同时测试多个类
suite1 = unittest.TestLoader().loadTestsFromTestCase(TestClass1)
suite2 = unittest.TestLoader().loadTestsFromTestCase(TestClass2)
suite = unittest.TestSuite([suite1,suite2])
unittest.TextTestRunner(verbosity=2).run(suite)
4、通过discover方式加载某路径下的所有测试用例
test_dir = './TestCase'
discover= unittest.defaultTestLoader.discover(case_dir=test_dir,pattern='test*.py')
runner=unittest.TextTestRunner()
runner.run(discover)
-case_dir:这个是待执行用例的目录。
5、通过 HTMLTestRunner 执行所有的测试用例
#导入用例
def case_all():
case_pash = 'F:PythonInterface_automation'
discover = unittest.defaultTestLoader.discover(case_pash,pattern='ceshi*.py')
#添加用例,在case_path的路径下,所有以ceshi开头的文件都当做用例文件执行
return discover
if __name__ == '__main__':
fp = open(report_repash, "wb") # 保存报告文件
print(fp)
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=title + ':',)
runner.run(case_all()) # 执行用例
fp.close()
五、unittest 执行测试用例执行过程总结
六、最简单的Demo
运行结果: