unittest里discover用法_上手unittest读这篇文章就够了

引言本文主要介绍了如下内容单元测试的定义;python中如何写基础的unittest单元测试;详解unittest中的基础知识点:断言、测试固件、suite、如何控制用例执行顺序、如何把测试结果输出到文件;详解unittest中的高级知识点:@unittest.skip、@unittest.expectedFailure、failfast、参数化;什么是单元测试单元测试是用来对一个模块、一个函数或...
摘要由CSDN通过智能技术生成

引言

本文主要介绍了如下内容

  • 单元测试的定义;
  • 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

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

输出:

5bc16c0e40cd5d469922cde497cedae0.png

可以看到一共运行了4个测试,失败了1个,并且给出了失败原因,2 != 3.0,也就是说我们的divide方法是有问题的。上图的左侧显示了用例的运行状态,右侧显示了具体的用例运行信息。

备注:在unitest.main()中加verbosity参数可以控制输出的错误报告的详细程度,用命令行的方式运行脚本会发现区别。

0 (静默模式): 你只能获得总的测试用例数和总的结果 ;

1 (

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值