pytest
是Python的一个单元测试框架,相比于Python自带的unittest
框架,pytest
使用更加方便快捷,而且有丰富的插件可以实现测试报告、分布式测试等高级特性,我们可以基于pytest
实现自己的自动化测试框架。这篇笔记我们介绍pytest
的使用方法。
官方文档:https://docs.pytest.org/en/7.4.x/
我这里使用的是最新的Python3.11版本,使用pip
命令即可安装pytest
框架:
pip install pytest
注:推荐使用venv
环境。
这里我们以一个最简单的例子演示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.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等方式传入测试参数。
pytest
框架中我们可以使用pytest-html
插件生成测试报告,我们需要先安装该插件。
pip install pytest-html
安装插件后,我们可以使用类似如下命令执行单元测试并生成测试报告;
pytest --html=./report/report.html --self-contained-html
其中,--html
参数指定了测试报告文件的生成位置,我们这里指定为工程目录下的report
文件夹内。--self-contained-html
能够生成单HTML文件(其中自包含了CSS等),避免了生成多个文件的麻烦,推荐使用该参数。
测试报告结果如下图。