引言
本文主要介绍了如下内容
- 单元测试的定义;
- python中如何写基础的unittest单元测试;
- 详解unittest中的基础知识点:断言、测试固件、suite、如何控制用例执行顺序、如何把测试结果输出到文件;
- 详解unittest中的高级知识点:@unittest.skip、@unittest.expectedFailure、failfast、参数化;
什么是单元测试
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。
比如对于函数abs(),我们可以编写的测试用例为:
(1)输入正数,比如1、1.2、0.99,期待返回值与输入相同
(2)输入复数,比如-1、-1.2、-0.99,期待返回值与输入相反
(3)输入0,期待返回0
(4)输入非数值类型,比如None、[]、{}、期待抛出TypeError
把上面这些测试用例放到一个测试模块里,就是一个完整的单元测试。
unittest工作原理
unittest中最核心的四部分是:TestCase,TestSuite,TestRunner,TestFixture
(1)一个TestCase的实例就是一个测试用例。测试用例就是指一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
(2)而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
(3)TestLoader是用来加载TestCase到TestSuite中的。
(4)TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法
(5)测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
综上,整个流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。核心类图关系如下:
![861dd4779a5d6f0ca736619739c1a3ff.png](https://i-blog.csdnimg.cn/blog_migrate/0129f733145cf36d7e337fc62272a79e.jpeg)
unittest的基本使用方法
1)import unittest
2)定义一个继承自unittest.TestCase的测试用例类
3)定义setUp和tearDown,在每个测试用例前后做一些辅助工作。
4)定义测试用例,名字以test开头
5)一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。
6)调用unittest.main()启动测试
下面举个实例,来看看unittest如何测试一个简单的函数
测一个简单的加减乘除接口
mathfunc.py文件代码如下:
def add(a, b): return a + bdef minus(a, b): return a - bdef multi(a, b): return a * bdef divide(a, b): return a / b
test_mathfunc.py文件代码如下:
import unittestclass TestMathFunc (unittest.TestCase): def test_add(self): self.assertEqual (3, add (1, 2)) def test_minus(self): self.assertEqual (1, minus (3, 2)) def test_multi(self): self.assertEqual (6, multi (3, 2)) def test_divide(self): self.assertEqual (2, divide (6, 2))if __name__ == '__main__': unittest.main ()
在pycharm中运行该用例,
![39205fcdb28d35a232fed84553c2eb85.png](https://i-blog.csdnimg.cn/blog_migrate/e8c6a12836384cb53bb440c141bd9825.jpeg)
输出:
![5bc16c0e40cd5d469922cde497cedae0.png](https://i-blog.csdnimg.cn/blog_migrate/e216a37164312a075be3cf86ad2a28c8.jpeg)
可以看到一共运行了4个测试,失败了1个,并且给出了失败原因,2 != 3.0,也就是说我们的divide方法是有问题的。上图的左侧显示了用例的运行状态,右侧显示了具体的用例运行信息。
备注:在unitest.main()中加verbosity参数可以控制输出的错误报告的详细程度,用命令行的方式运行脚本会发现区别。
0 (静默模式): 你只能获得总的测试用例数和总的结果 ;
1 (