什么是unittest?
unittest 是 Python 自带的类 Junit 单元测试框架
unittest 支持测试用例/测试用例集的查找、组装,还可以在测试用例/测试用例集内共享数据,也支持根据条件筛选测试用例执行,以及自动化生成测试报告。
unittest 核心组成:
Test Fixture
做测试用例的准备清理工作;
python 通过 setUp()、tearDown()、setUpClass()、tearDownClass() 这 4 个钩子函数(Hook)来实现测试的准备和清理工作
Test Case
是unittest的最小单元,就是一个测试用例
Test Suite
测试套件,相当于测试用例集,包含一个或多个测试用例
Test Loader
用来提供classer类和模块中生成测试用例集,
Test Runner
是测试执行器,用来进行测试用例的执行和测试结果的输出
运行原理:
Test Cases包括一个或多个TestCase类,其中有具体的测试过程,在测试类中使用Text Fixture来进行测试开始前的准备和结束后的清理
Test Suite包括一个或多个TestSuite类,其中Test Suite中包括一个或多个Test Case,通过addTest或者addTests方法把一个个的测试用例或者测试用例集组成一个新的测试用例集
TestLoader类加载本地或从外部文件中定义好的TestCase或者TestSuites
TestRunner包含了TestTestRuner类, 提供了运行测试的标准平台,运行通过unitest.main()或者python -m unittest xxx.py运行
Test Results Collector包括Test Results类,为测试结果提供一个标准容器,它存储运行的测试用例状态,例如errors,failures,skipped。
测试的结果可以直接在Console输出,也可以为通过其他形式输出,例如Test,result,output
TestFixture包括如下4个方法:
setUp()方法在每一个测试用例执行测试前都会执行
setUpclass()方法仅在整个测试类开始执行前执行,setUpclass方法必须使用@classmethod来装饰
setUp()和setUpClass通常用来进行测试前的准备工作,例如访问数据库获得测试用例需要的数据等
tearDown()方法在每一个测试用例执行后都会执行
tearDownClass()方法仅在整个测试类结束执行后执行.tearDownClass()方法必须使用@classmethod来装饰
tearDown()和tearDownClass()通常用来进行测试后的清理工作,例如结束后删除测试产生的数据,将被测试系统恢复至之前的状态等
运行指定文件夹下的测试用例
可以利用unittest的main函数来指定module运行
unittest.main(module='__main__', defaultTest=None, argv=None, testRunner=None, testLoader=unittest.defaultTestLoader, exit=True, verbosity=1, failfast=None, catchbreak=None, buffer=None, warnings=None
参数含义:
module指定待运行的module,默认是main
defaultText 单个测试的名字或者多个测试名字的组合 必须是iterable
argv 传递给程序的一组变量,如果没有指定,那么系统默认是用sys.argv
testRunner指定unittest的test runner,可以是test runner类本身或者test runner类实例,默认情况下,main函数会调用sys.exit(),并且会在屏幕上显示测试娙错误或者成功的提示;
testLoader 必须是TestLoader类实例,默认是defaultTestLoader
exit默认是True,即测试运行完调用sys.exit(),在交互模式下使用时可指定为False
verbosity:用于控制显示在console里的log等级,有0、1、2三种,一般默认等级1,其中等级2显示的log最详细
动态查找测试用例运行
除去直接使用unittest.main方法加载module运行外,unittest还支持通过TestLoader下的discover方法去查找测试用例
unittest.TestLoader.discover(start_dir, pattern='test*.py', top_level_dir=None)
参数如下
start_dir起始文件夹的路径
pattern匹配模式:默认搜索所有以test开头的测试文件,并把文件中以“”test“开头的测试用例挑选出来
top_level_dir根目录,测试模块必须从根目录导入,如果start_dir的位置不是根目录,name必须显示指定top_level_dir
按需组装测试用例
testSuite的组装,可以用discover,也可以用unittest.TestSuite.addTest()方式来添加测试用例到TestSuite
忽略测试用例执行
在测试用例上面加上装饰器即可
@unittest.skip()执行时直接忽略掉被装饰的测试用例
@unittest.skipif()如果skipif里的条件成立,执行时直接忽略掉被装饰的测试勇气
@unittest.skipUnless()永久在执行时忽略被装饰的测试用例,除非skipUnless里的条件成立;
@unittest.expectedFailure期望被装饰的测试用例是失败的,如果是失败的,则此条测试用例将被标记为测试通过
文章内容输出来源:拉钩教育测试开发入门与实战