在前几篇文章中,我们已经深入了解了 Pytest
的核心特性和强大的插件生态。今天,我们将聚焦于如何通过 命令行选项 和 配置文件 (pytest.ini
) 来精细地控制Pytest
的行为,让你可以根据不同的测试需求灵活地运行和管理你的测试用例。
回顾:灵活地定制测试流程
正如我们在第五篇和第六篇中学习到的,Pytest
提供了钩子函数和插件机制来扩展和定制测试流程。而命令行选项和配置文件则是在更高层次上控制 Pytest
整体行为的关键工具,它们允许你在不修改代码的情况下,调整测试的运行方式和报告输出。
通过命令行选项控制 Pytest
的行为
Pytest
提供了丰富的命令行选项,你可以在运行 pytest
命令时添加这些选项来改变其默认行为。以下是一些常用的命令行选项及其功能:
-
指定测试文件或目录 (
pytest <path>
):-
功能: 默认情况下,
Pytest
会在当前目录及其子目录中查找符合命名约定的测试文件 (test_*.py
和*_test.py
)。你可以通过在pytest
命令后指定路径来限制Pytest
搜索的范围。 -
命令:
pytest test_example.py # 只运行 test_example.py 文件中的测试 pytest tests/unit # 只运行 tests/unit 目录及其子目录中的测试 pytest tests/integration/test_api.py # 运行指定路径下的测试文件
-
-
运行带有特定标记的测试 (
pytest -m <mark>
):-
功能: 使用
-m
选项可以只运行那些被特定标记 (@pytest.mark.*
) 标记的测试用例。 -
你在
pytest.ini
中注册了smoke
和regression
标记)pytest -m smoke # 只运行标记为smoke的测试 pytest -m "regression" # 只运行标记为regression的测试 pytest -m "smoke and regression" # 只运行同时标记为smoke和regression的测试 pytest -m "smoke or regression" # 运行标记为smoke或regression的测试 pytest -m "not smoke" # 运行所有标记不是smoke的测试
-
-
显示详细的测试输出 (
pytest -v
):- 功能:
-v
选项会增加测试输出的详细程度,显示每个测试函数的名称。 pytest -v
- 功能:
-
单独运行某些用例 (
pytest -k
):- 功能:
-k
选项会单独运行某些用例 pytest -k "add"
;匹配所有名称中包含add的用例
- 功能:
-
生成 JUnit XML 报告 (
pytest --junitxml=<path>
):-
功能:
--junitxml
选项可以将测试结果导出为 JUnit XML 格式的文件,这种格式常用于持续集成 (CI) 系统。 -
命令
pytest --junitxml=report.xml
-
-
生成 HTML 报告 (
pytest --html=<path>
):-
功能:
--html
选项 (由pytest-html
插件提供) 可以生成漂亮的 HTML 测试报告。 -
命令:
pytest --html=report.html
-
-
并行执行测试 (
pytest -n <numprocesses>
):-
功能:
-n
选项 (由pytest-xdist
插件提供) 可以并行执行测试用例,加快测试速度。 -
命令:
pytest -n 2 # 使用 2 个 worker 并行执行测试 pytest -n auto # 自动检测 CPU 核心数并使用
-
-
其他常用命令行选项:
-x
: 在第一个失败的测试用例处停止执行。--maxfail=<num>
: 在指定数量的测试用例失败后停止执行。--collect-only
: 只收集测试用例,不执行。--pdb
: 在测试失败时进入 Python 调试器。--trace
: 在测试执行期间显示更详细的跟踪信息。--durations=<n>
: 显示执行时间最长的n
个测试用例。--capture=no
: 禁用输出捕获,直接显示测试中的 print 语句。–lf, –last-failed
只重新运行上次运行失败的用例(或者没有失败的话会全部跑)–ff, –failed-first
运行所有测试,但首先运行上次运行失败的测试(会导致重新测试一遍)
使用 pytest.ini
文件进行配置
pytest.ini
文件是一个 INI 格式的配置文件,你可以将其放在你的测试项目的根目录下,用于配置Pytest
的行为。Pytest
在启动时会自动查找并加载该文件。
-
pytest.ini
文件的作用和位置:pytest.ini
文件允许你定义全局的Pytest
配置,这些配置会影响整个测试项目的执行。- 通常放在项目的根目录下,也可以放在测试目录的父级目录中。
-
配置标记 (
markers
):-
功能: 在
[pytest]
部分的markers
选项中,你可以注册自定义的标记。这有助于Pytest
更好地理解和处理你的自定义标记,并避免警告信息。 -
举个例子:
# pytest.ini markers 自定义mark标签名 addopts 运行时添加的参数(空格分割) python_fles 自定义测试文件命名规则 python_classes = Test_* 自定义测试类命名规则 python_functions = test_*check_* 自定义测试方法命名规则 norecursedirs = result logs datas test_demo* 运行时忽略某些文件夹[pytest] addopts = -vs --alluredir=./result
-
-
配置插件选项:
-
功能: 许多
Pytest
插件允许你在pytest.ini
文件中配置它们的行为。你需要查阅每个插件的官方文档来了解其支持的配置选项。 -
举个例子 (配置
pytest-html
插件的报告标题):# pytest.ini [pytest] html_report_title = My Awesome Test Report
-
-
配置测试路径 (
testpaths
):-
功能:
testpaths
选项允许你指定Pytest
应该搜索测试文件的目录。这可以帮助你更精确地控制Pytest
查找测试的范围,避免搜索不必要的目录。 -
举个例子 :
# pytest.ini [pytest] testpaths =tests/unittests/integration
-
-
配置忽略的路径 (
ignore
):-
功能:
ignore
选项允许你指定Pytest
应该忽略的目录或文件。 -
举个例子 :
# pytest.ini [pytest] ignore =legacy_teststemp_files
-
总结
通过灵活地使用 Pytest
的命令行选项和配置文件 (pytest.ini
),你可以精确地控制测试的执行方式、报告生成以及插件的行为。命令行选项适用于临时性的调整,而 pytest.ini
文件则用于定义项目级别的全局配置。掌握这些配置方法,将使你能够更好地管理和运行你的 Pytest
自动化测试套件,提高测试效率和可维护性。