pytest 单元测试

pytest是Python的一个单元测试框架,相比于Python自带的unittest框架,pytest使用更加方便快捷,而且有丰富的插件可以实现测试报告、分布式测试等高级特性,我们可以基于pytest实现自己的自动化测试框架。这篇笔记我们介绍pytest的使用方法。
官方文档:https://docs.pytest.org/en/7.4.x/
安装pytest框架
我这里使用的是最新的Python3.11版本,使用pip命令即可安装pytest框架:
pip install pytest
注:推荐使用venv环境。
pytest简单使用
这里我们以一个最简单的例子演示pytest如何使用。
|_venv
|_.pytest_cache
|_test_demo.py
工程路径下,.pytest_cache是pytest框架和其插件使用的缓存文件目录,其中的文件是自动生成的,我们不需要将其提交到版本控制中;test_demo.py是我们编写的单元测试代码。
test_demo.py
def test_a():
arr = (11, 22)
assert arr[0] * 2 == arr[1]
pytest约定文件名以test_开头或_test结尾,测试类以Test开头,测试方法以test开头。我们这里使用的文件名为test_demo.py,单元测试方法为test_a(),因此可以被pytest框架识别并执行。
此时我们可以在工程根目录执行pytest命令,即可看到类似如下输出:
====== test session starts ======
platform win32 -- Python 3.11.4, pytest-7.4.0, pluggy-1.3.0
rootdir: D:\workspace-python\demo
collected 1 item
test_demo.py . [100%]
====== 1 passed in 0.00s ======
从输出内容中我们可以看到单元测试执行成功了,我们可以尝试将代码中的断言修改为错误的情况,再次执行查看效果。
执行测试用例
前面我们通过pytest命令的方式执行了单元测试,实际上我们还可以指定一些命令行参数。
pytest -vs test_demo.py
-s:输出调试(print()等)信息-v:输出更多信息test_demo.py:运行指定的文件(如果指定目录名,则运行某个目录下的所有文件),这里我们运行test_demo.py文件,如果不指定该参数则运行工程中所有文件
实际上pytest框架还可以通过代码中的main()函数调用执行。
import pytest
if __name__ == '__main__':
pytest.main()
pytest.main()中可以通过数组方式指定命令行参数,例如pytest.main(['-vs'])。
pytest.ini配置文件
除了在命令或pytest.main()中指定命令行参数,也可以在pytest.ini配置文件中用addopts指定。pytest.ini是pytest框架的配置文件,通常放在工程根目录中,下面是一个例子。
|_venv
|_.pytest_cache
|_test_demo.py
|_pytest.ini
pytest.ini
[pytest]
addopts = -vs
pytest.ini中有很多可配置项,使用命令启动框架或是主函数启动都会读取该配置文件,具体我们可以参考官方文档。
前置和后置执行
@pytest.fixture()装饰器可以用来实现单元测试函数的前置和后置执行,下面是一个例子。
import pytest
@pytest.fixture()
def my_fixture():
print('前置执行')
yield
print('后置执行')
def test_a(my_fixture):
print('单元测试执行')
代码中,日志会按照“前置”、“单元测试”、“后置”的顺序执行。
参数化测试
pytest支持参数化测试,下面是一个例子。
import pytest
@pytest.mark.parametrize('args', [1, 2, 3])
def test_a(args):
print(args)
代码中,@pytest.mark.parametrize的第一个参数是参数名,第二个参数需要为可迭代对象,其中的每个值都会在单元测试函数中以指定参数名传入。上面代码例子中,test_a()函数会分别以1、2、3为入参执行3次。实际开发中,我们可以用CSV等方式传入测试参数。
生成HTML测试报告
pytest框架中我们可以使用pytest-html插件生成测试报告,我们需要先安装该插件。
pip install pytest-html
安装插件后,我们可以使用类似如下命令执行单元测试并生成测试报告;
pytest --html=./report/report.html --self-contained-html
其中,--html参数指定了测试报告文件的生成位置,我们这里指定为工程目录下的report文件夹内。--self-contained-html能够生成单HTML文件(其中自包含了CSS等),避免了生成多个文件的麻烦,推荐使用该参数。
测试报告结果如下图。
