在前几篇文章中,我们已经深入了解了 Pytest
的核心特性,包括简洁的语法、强大的 Fixture、灵活的参数化以及可定制的钩子函数。今天,我们将探索 Pytest
生态系统中另一个至关重要的组成部分——插件 (Plugins)。Pytest
拥有一个庞大且活跃的插件生态系统,这些插件能够极大地扩展 Pytest
的功能,帮助我们更高效地进行自动化测试,并生成更丰富的测试报告。
回顾:定制与扩展你的测试能力
正如我们在第五篇中学习到的,钩子函数允许我们在 Pytest
的执行流程中插入自定义逻辑,从而定制框架的行为。而插件则是在此基础上更进一步,它们通常会封装一组相关的钩子函数和 Fixture,提供更高级、更便捷的功能,无需我们从零开始编写复杂的代码。
Pytest
插件生态:丰富的扩展选择
Pytest
社区贡献了大量的优秀插件,涵盖了自动化测试的各个方面。无论是生成美观的测试报告、进行测试覆盖率分析、并行执行测试用例,还是提供 Mocking 功能,你几乎都能找到相应的 Pytest
插件来满足你的需求。
常用的Pytest
插件介绍和使用
以下是一些常用的 Pytest
插件及其基本使用方法:
-
pytest-html
:生成漂亮的 HTML 测试报告-
功能:
pytest-html
插件可以生成易于阅读和分享的 HTML 格式的测试报告,其中包含了测试用例的执行状态、持续时间、日志信息等。 -
安装:
pip install pytest-html
-
使用命令行选项指定报告文件的路径:运行结束后,你将在指定的路径下找到生成的文件。
pytest --html=report.html
-
可以通过预览HTML文件,查看报告;但是这个报告页面不好看;后面我们会介绍专门的第三方报告,
Allure
-
-
pytest-cov
:测试覆盖率报告pytest-cov
插件可以生成测试覆盖率报告,帮助你了解你的测试代码覆盖了多少被测代码。
首先编写代码如下,里面包含一些基本的数学运算,文件名为math_operations.py
def add(a,b):
return a+b
def subtract(a,b):
return a-b
def multiply(a,b):
return a*b
def divide(a,b):
if b == 0:
raise ZeroDivisionError
return a/b
现在编写对应的测试代码,文件名为test_math_operations.py
from math_operations import add, subtract, multiply
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
def test_subtract():
assert subtract(2, 1) == 1
assert subtract(2, 3) == -1
def test_multiply():
assert multiply(2, 3) == 6
assert multiply(0, 5) == 0
- 安装:
pip install pytest-cov
- 使用:
运行 Pytest
测试时,添加命令行选项指定要分析覆盖率的源代码目录:
pytest --cov=math_operations
输出内容如下,可以看到再输出的报告中;显示了覆盖率只有70%,这意味着我们的测试覆盖了其中的3个方法,但有1个方法没有被测试到。
================================================ tests coverage =================================================
________________________________ coverage: platform win32, python 3.13.2-final-0 ________________________________
Name Stmts Miss Cover
----------------------------------------
math_operations.py 10 3 70%
----------------------------------------
TOTAL 10 3 70%
=============================================== 3 passed in 0.05s ===============================================
你可以结合--cov-report
选项来生成不同格式的报告,常用的报告格式包括
- term:在终端中显示覆盖率报告
- html:生成HTML格式的覆盖率报告,可以在浏览器中查看
- xml:生成XML格式的报告,适合CI工具
例如 HTML 报告:
pytest --cov=math_operations --cov-report=html
执行命令后,可以看到生成了一个htmlcov
文件夹,预览里面的Index.html就可以看到报告了
-
排除不必要的文件
有的时候我们不想把某些文件纳入到覆盖率检查里面,这个时候可以通过
.coveragerc
配置文件或者命令行参数来排除这些文件。以下是一个简单的.coveragerc
文件示例:
[coverage:run]
omit =
*/tests/*
*/venv/*
这个意思就是,会排除所有tests
和venv
文件夹的文件
-
pytest-xdist
:并行执行测试用例-
功能:
pytest-xdist
插件允许你并行执行测试用例,从而显著缩短测试执行时间,尤其是在测试用例数量较多的项目中。 -
安装:
pip install pytest-xdist
-
运行
Pytest
测试时,添加命令行选项指定要使用的 worker 数量:pytest -n 2 # 使用 2 个 worker 并行执行测试 pytest -n auto # 自动检测 CPU 核心数并使用
-
-
pytest-ordering
:控制测试用例的执行顺序 (不推荐过度使用)-
功能:
pytest-ordering
插件允许你通过@pytest.mark.run
标记来控制测试用例的执行顺序。注意:过度依赖测试用例的执行顺序通常不是好的实践,测试用例应该尽可能独立。 -
安装:
pip install pytest-ordering
-
使用:
在测试函数或类上使用标记指定执行顺序,n为整数,数值越小越先执行。
import pytest @pytest.mark.run(order=2) def test_add(): assert add(1, 2) == 3 assert add(-1, 1) == 0 @pytest.mark.run(order=4) def test_subtract(): assert subtract(2, 1) == 1 assert subtract(2, 3) == -1 @pytest.mark.run(order=1) def test_multiply(): assert multiply(2, 3) == 6 assert multiply(0, 5) == 0 @pytest.mark.run(order=3) def test_divide(): assert divide(6, 3) == 2 try: divide(6, 0) except ZeroDivisionError: pass 输出内容如下;可以看到会按照order的从小到大的顺序执行 07_Plugins_test.py::test_multiply PASSED 07_Plugins_test.py::test_add PASSED 07_Plugins_test.py::test_divide PASSED 07_Plugins_test.py::test_subtract PASSED
-
-
pytest-rerunfailures
:失败用例自动重试-
功能:
pytest-rerunfailures
插件可以在测试用例失败时自动重新运行它们,这对于处理一些间歇性失败的测试场景非常有用。 -
安装:
pip install pytest-rerunfailures
-
运行
Pytest
测试时,添加--reruns
命令行选项指定重试次数:接受一个正整数,表示失败重跑的次数;是一个必填参数pytest --reruns 2
-
还可以添加
--reruns-delay
参数,接受一个正整数,表示重跑之间的延迟秒数;是一个可选参数pytest --reruns 2 --reruns-delay 5
-
-
pytest-sugar
:改进测试输出的显示-
功能:
pytest-sugar
插件可以使Pytest
的终端输出更加美观和易于阅读,例如显示更详细的进度条和失败信息。 -
安装:
pip install pytest-sugar
-
使用: 安装后,
pytest-sugar
会自动生效,无需额外的命令行选项。
-
安装和配置 Pytest
插件
安装 Pytest
插件通常只需要使用 pip install <plugin_name>
命令。安装完成后,Pytest
会自动发现并加载这些插件。
某些插件可能需要额外的配置,可以通过以下方式进行配置:
- 命令行选项: 大部分插件会提供自己的命令行选项,例如
--html
、--cov
、-n
等。 pytest.ini
文件: 一些插件允许在pytest.ini
文件中进行更细致的配置。你可以查阅插件的官方文档了解具体的配置方法。
开发自定义 Pytest 插件
(入门)
如果你需要更高级的功能,或者想将你的测试扩展逻辑分享给其他人,你可以开发自己的 Pytest
插件。一个简单的 Pytest
插件通常包含一个或多个实现了 Pytest
钩子函数的 Python 模块。
要开发一个自定义插件:
-
创建一个 Python 文件: 你的插件代码可以放在一个单独的
.py
文件中。 -
实现
Pytest
钩子函数: 在你的文件中定义以pytest_
开头的函数,实现你需要的钩子逻辑。 -
让
Pytest
能够找到你的插件:-
如果你的插件是项目特定的,可以将包含钩子函数的文件命名为
conftest.py
并放在你的测试目录或其父目录中。Pytest
会自动加载conftest.py
文件中的钩子函数。 -
如果你的插件是可复用的,你可以将其打包并发布到
PyPI
上,其他用户可以通过pip install
安装。
-
总结
Pytest
的插件生态系统为我们提供了丰富的工具,能够极大地扩展 Pytest
的功能,简化我们的测试工作流程,并生成更有价值的测试报告。通过灵活地选择和配置合适的插件,我们可以打造出更强大、更高效的自动化测试解决方案。在接下来的文章中,我们将学习如何在 Pytest
中集成 Selenium,进行 Web 应用程序的自动化测试。请继续关注!