10.4 单元测试

10.4.1 UnitTest 单元测试模块

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。

把需要进行测试的测试用例放到一个测试模块里,就是一个完整的单元测试。如果单元测试通过,说明测试的这个函数在用例的检查范围内能够正常工作。如果单元测试不通过,要么函数有bug,要么测试条件输入不正确,总之,需要修复使单元测试能够通过。

例如有如下函数,进行单元测试:完整举例:10.3-unittest.py

def rounding(num):
    shi_wei = num // 10 % 10
    num = num // 100 * 100

    if shi_wei >= 5:
        num += 100

    return num

编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。

test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。

对每一类测试都需要编写一个test_xxx()方法。由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEqual()

import unittest

class TestRounding(unittest.TestCase):
    def test_gt(self):
        self.assertEqual(3500, rounding(3456))

    def test_lt(self):
        self.assertEqual(3400, rounding(3426))

    def test_type(self):
        self.assertIsInstance(rounding(1234), int)

一旦编写好单元测试,就可以运行单元测试。最简单的运行方式是在文件的最后加上两行代码:

if __name__ == '__main__':
    unittest.main()

运行结果如下:(不同开发环境显示结果稍有不同。)

...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

setUp与tearDown

可以在单元测试中编写两个特殊的setUp()tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行,用作对于测试对象的初始化和清除。

10.4.2 pytest 测试模块

pytest是一个非常成熟的全功能的 Python 测试框架,简单灵活,容易上手,支持参数化,能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试等。

安装pytest:

pip install pytest

安装结果:

C:\Users\liugu>pip show pytest
Name: pytest
Version: 6.2.1
Summary: pytest: simple powerful testing with Python
Home-page: https://docs.pytest.org/en/latest/
Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others
Author-email: None
License: MIT
Location: c:\python38\lib\site-packages
Requires: packaging, attrs, iniconfig, pluggy, colorama, py, atomicwrites, toml
Required-by:

pytest中的测试用例按照如下规则:

  • 测试文件以test_开头(以_test结尾也可以)
  • 测试类以Test开头,并且不能带有 init 方法
  • 测试函数以test_开头
  • 断言使用基本的assert即可

例如:test_func.py

import pytest

# content of test_sample.py
def func(x):
    return x + 1

def test_answer():
    assert func(3) == 5

在此目录下执行测试:

(base) C:\code\ch10>pytest
================================================ test session starts =================================================
platform win32 -- Python 3.7.4, pytest-5.2.1, py-1.8.0, pluggy-0.13.0
rootdir: C:\code\ch10
plugins: arraydiff-0.3, doctestplus-0.4.0, openfiles-0.4.0, remotedata-0.3.2
collected 1 item

test_func.py F                                                                                                  [100%]

====================================================== FAILURES ====================================================== 
____________________________________________________ test_answer _____________________________________________________ 

    def test_answer():
>       assert func(3) == 5
E       assert 4 == 5
E        +  where 4 = func(3)

test_func.py:8: AssertionError
================================================= 1 failed in 0.13s ==================================================

可以通过pytest生成测试报告(安装pytest-html模块),运行指定测试用例等功能。