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模块),运行指定测试用例等功能。