如何调用 pytest¶
通常,pytest 是通过命令 pytest
调用的(参见下面 调用 pytest 的其他方法 )。这将在当前目录及其子目录中所有文件名遵循 test_*.py
或 *_test.py
形式的文件中执行所有测试。更一般地,pytest 遵循 标准测试发现规则。
指定要运行的测试¶
pytest 支持多种方式来运行和从命令行中选择测试。
在模块中运行测试
pytest test_mod.py
在目录中运行测试
pytest testing/
借助 keyword 表达式运行测试
pytest -k "MyClass and not method"
这将运行包含匹配给定 字符串表达式 (不区分大小写)的名称的测试,其中可能包括使用文件名、类名和函数名作为变量的 Python 算子。上面的例子将运行 TestMyClass.test_something
而不是 TestMyClass.test_method_simple
。
借助 node ID 运行测试
每个收集的测试都被分配一个唯一的 nodeid
,它由模块文件名和类名、函数名和参数化参数等说明符组成,用 ::
字符分隔。
在模块中运行特定的测试:
pytest test_mod.py::test_func
在命令行中指定测试方法的另一个示例:
pytest test_mod.py::TestClass::test_method
借助 marker 表达式运行测试
pytest -m slow
将运行所有带有 @pytest.mark.slow
标记装饰的测试。
更多细节见 marks。
运行包中的测试
pytest --pyargs pkg.testing
这将导入 pkg.testing
,并使用其文件系统位置从中查找和运行测试。
获取关于版本、选项名称、环境变量的帮助¶
pytest --version # shows where pytest was imported from
pytest --fixtures # show available builtin function arguments
pytest -h | --help # show help on command line and config file options
分析测试执行持续时间¶
在 6.0 版本发生变更.
要获得超过 1.0 秒的最慢的 10 个测试持续时间的列表:
pytest --durations=10 --durations-min=1.0
默认情况下,pytest 不会显示太小的测试持续时间(<0.005s),除非在命令行中传递 -vv
。
管理插件的加载¶
提前加载插件¶
你可以用 -p
选项显式地在命令行中提前加载插件(内部和外部):
pytest -p mypluginmodule
该选项接收 name
参数,它可以是:
完整的模块名,例如
myproject.plugins
。这个虚线的名字必须是可以输入的。插件的入口点名称。这是插件注册时传递给
setuptools
的名称。例如,要提前加载 pytest-cov 插件,你可以使用:pytest -p pytest_cov
禁用插件¶
要在调用时禁用加载特定的插件,请使用 -p
选项和前缀 no:
。
示例:要禁用加载插件 doctest
,该插件负责从文本文件执行 doctest 测试,请像这样调用 pytest:
pytest -p no:doctest
调用 pytest 的其他方法¶
通过 python -m pytest
调用 pytest¶
你可以从命令行通过 Python 解释器调用测试:
python -m pytest [...]
这几乎等同于调用命令行脚本 pytest [...]
只是通过 python
调用也会将当前目录添加到 sys.path
中。
从 Python 代码调用 pytest¶
你可以直接从 Python 代码调用 pytest
:
retcode = pytest.main()
这就像从命令行调用 “pytest” 一样。它不会引发 SystemExit
,而是返回 退出代码。你可以传入选项和参数:
retcode = pytest.main(["-x", "mytestdir"])
你可以为 pytest.main
指定额外的插件:
# content of myinvoke.py
import sys
import pytest
class MyPlugin:
def pytest_sessionfinish(self):
print("*** test run reporting finishing")
if __name__ == "__main__":
sys.exit(pytest.main(["-qq"], plugins=[MyPlugin()]))
运行它会显示 MyPlugin
被添加并且它的钩子被调用:
$ python myinvoke.py
*** test run reporting finishing
备注
调用 pytest.main()
将导致导入您的测试和它们导入的任何模块。由于 python 的 import 系统的缓存机制,从同一进程中对 pytest.main()
的后续调用将不会反映调用之间对那些文件的更改。因此,不建议从同一个进程多次调用 pytest.main()
(例如,为了重新运行测试)。