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_cachepytest框架和其插件使用的缓存文件目录,其中的文件是自动生成的,我们不需要将其提交到版本控制中;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.inipytest框架的配置文件,通常放在工程根目录中,下面是一个例子。

|_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()函数会分别以123为入参执行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等),避免了生成多个文件的麻烦,推荐使用该参数。

测试报告结果如下图。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap