python unittest模块使用
学习完本篇,你将会
- 编写python单元测试用例
- 独立编写加减乘数的测试用例,同时满足一定条件可以跳过用例
简单认识单元测试
- 通过比较上述的两种方法,可以看出测试类一虽然可以测试,单测试添加测试用例部方便(目前是尝试2,3,如果再添加需要增加很多代码),测试类二添加测试用例方面,可以随时添加。
- 测试类二中,unittest可以直接把TestCount中以“test”命令的脚本直接识别为测试方法,并且执行它们
- 通过也印证了在pycharm含有test命名的函数,执行并不是按照我们要求的顺序执行
unittest简介以及安装
- 单元测试(unit testing):指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,单元就是人为规定的最小的被测功能模块。
- Python单元测试框架(The Python unit testing framework):简称为PyUnit,是Kent Beck和Erich Gamma这两位所设计的 Junit 的Python版本。
- unittest环境要求: PyUnit可以在Python 1.5.2及更高版本上运行。
- unittest安装:python1.5.2以上的版本,python自带unittest模块,查看python是否包含unittest模块,通过D:\Python27\Lib\unittest,看是否含有unittest,如果没有需要下载安装,或者copy unittest模块。
Unittest中一些重要概论
- Test Case:Test Case的实例就是一个测试用例。一个完成的是测试用例的流程包含:1、测试前环境的搭建(setUp)、实现测试过程的代码(run),以及测试后环境的还原(tearDown)。
- Test Suit:验证一个功能往往需要多个用例,这些用例集合在一起叫测试套。Test Suit用来组装多个用例。可以通过addTest加载TestCase到TestSuite中,从而返回一个TestSuit实例。
- Test Runner:测试执行也是单元测试中非常重要的一个概念,一般的单元测试框架都会提供一个丰富的执行策略和执行结果。在unittest单元测试框架中,通过TextTestRunner类提供的run()方法来执行test suit/test case。
- Test Fixture:一个测试用例环境搭建和销毁,就是一个fixture。比如测试用例想访问数据库,可以通过setUp中连接数据库,在tearDown中关闭数据库即可。
Unittest例子
调用Unittest框架的TestSuit()类来创建测试套件,通过它所提供的addTest()方法来添加测试用例测试test_add2()。调用
断言方法
方法 | 检查 |
assertEqual(a,b) | a=b |
assertNoEqual(a,b) | a!=b |
assertTrue(x) | bool(x) is True |
assertFalse(x) | bool(x) is False |
assertIs(a,b) | a is b |
assertIsNot(a,b) | a is not b |
assertIsNone | a is None |
assertIsNoNone(x) | a is not None |
assertIn(a,b) | a in b |
assertNotIn(a,b) | a not in b |
assertIsInstance(a,b) | isinstance(a,b) |
assertIsInstance(a,b) | not is instance(a,b) |
断言实例一
- 语法:assertEqual(first,second,msg)
说明:用例先执行setUp前置条件,再执行测试用例test_case,再执行tearDown条件恢复。
arrertEqual:比较两个数的值是否相等,如果不相等输出msg中定义的提示信息,并执行以下结果:
断言实例二
- 语法:assertTrue(表达式,msg)
说明:用例先执行setUp前置条件,再执行测试用例test_case,再执行tearDown条件恢复。
arrertTrue:比较Bool是否为Ture,如果不是输出msg中定义的提示信息,并执行以下结果:
断言实例三
- 语法:assertIn(first,second,msg=None)
unittest组织单元测试用例
例一
TestSuit:TestSuit类中addTest()方法把不同测试类中的测试方法组装到测试套件中。通过运行测试套件,来执行所有的测试用例
通过运行可得知每次setUp以及tearDown都会被执行,如果用例很多初始化执行以及恢复条件都是一样,可以通过继承的方式可大大提高编写用例效率
例二
TestLoader:用来加载TestCase到TestSuite中的,其中有几个 loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例;
discover自动发现用例
通过上述suite方式提供构造用例,如果用例数少,比较方便,但自动化设计一般情况下用例数都达到成百上千条用例,这个时候就比较麻烦。unittest提供一个单元测试框架自动识别测试用例,TestLoad类中提供了discover方法来自动识别测试用例。
- 语法:discover(start_dir,pattern='test&.py',top_level_dir = None)
1.start_dir:要测试的模块名或测试用例目录
2.pattern='test.py':表示用例文件名的匹配原则。此处匹配文件名以“test”开头的“.py”类型的文件,星号“”表示任意多个字符
3.top_level_dir = None:测试模块的顶层目录,如果没有顶层目录,默认为None。
用例执行顺序
- 通过运行发现,使用unittest.mian()
的方式,无论运行多少次都按照一定方式来执行,而且每次顺序都是一样,而通过unittest.TestSuite的方式是按照加载的顺序执行。 - 通过默认的方式运行是按照ASCII的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。因此没有按照用例从上到下的顺序执行。而通过unittest.TestSuite是按照加载的顺序执行。
fixtures学习
- fixtures可以理解为夹心饼干外层的两片饼干,这里两片饼干就是setUp/tearDown,中间的心就是测试用例
- setUpModule/tearDownModule:在整个模块的开始与结束时被执行
- setUpClass/tearDownClass:在测试类开始与结束时被执行
- setUp/tearDown:在测试用例的开始与结束时被执行
测试