如何调用 pytest¶
另请参阅
通常,pytest 使用命令 pytest
调用(有关 调用 pytest 的其他方式,请参见下文)。 这将执行当前目录及其子目录中所有名称符合 test_*.py
或 \*_test.py
形式的文件中的所有测试。 更一般而言,pytest 遵循 标准测试发现规则。
指定要运行的测试¶
Pytest 支持多种从命令行或从文件中运行和选择测试的方法(有关 从文件读取参数,请参见下文)。
在模块中运行测试
pytest test_mod.py
在目录中运行测试
pytest testing/
按关键字表达式运行测试
pytest -k 'MyClass and not method'
这将运行包含与给定字符串表达式(不区分大小写)匹配的名称的测试,其中可以包括使用文件名、类名和函数名作为变量的 Python 运算符。 上面的示例将运行 TestMyClass.test_something
,但不会运行 TestMyClass.test_method_simple
。 在 Windows 上运行时,在表达式中使用 ""
而不是 ''
按集合参数运行测试
传递相对于工作目录的模块文件名,后跟类名和函数名等说明符(用 ::
字符分隔),以及参数化中的参数(用 []
括起来)。
要运行模块中的特定测试
pytest tests/test_mod.py::test_func
要运行类中的所有测试
pytest tests/test_mod.py::TestClass
指定特定的测试方法
pytest tests/test_mod.py::TestClass::test_method
指定测试的特定参数化
pytest tests/test_mod.py::test_func[x1,y2]
按标记表达式运行测试
要运行所有使用 @pytest.mark.slow
装饰器装饰的测试
pytest -m slow
要运行所有使用带注释的 @pytest.mark.slow(phase=1)
装饰器装饰的测试,并将 phase
关键字参数设置为 1
pytest -m "slow(phase=1)"
有关更多信息,请参见 标记。
从包中运行测试
pytest --pyargs pkg.testing
这将导入 pkg.testing
并使用其文件系统位置查找并运行测试。
从文件读取参数
在 8.2 版本中添加。
以上所有内容都可以使用 @
前缀从文件中读取
pytest @tests_to_run.txt
其中 tests_to_run.txt
包含每行一个条目,例如
tests/test_file.py
tests/test_mod.py::test_func[x1,y2]
tests/test_mod.py::TestClass
-m slow
也可以使用 pytest --collect-only -q
生成此文件,并根据需要进行修改。
获取有关版本、选项名称、环境变量的帮助¶
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.005 秒),除非在命令行中传递 -vv
。
管理插件的加载¶
提前加载插件¶
您可以使用 -p
选项在命令行中显式提前加载插件(内部和外部)
pytest -p mypluginmodule
该选项接收一个 name
参数,可以是
完整的模块点式名称,例如
myproject.plugins
。 此点式名称必须可导入。插件的入口点名称。 这是注册插件时传递给
importlib
的名称。 例如,要提前加载 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
,而是返回 退出代码。 如果您没有传递任何参数,main
将从进程的命令行参数 (sys.argv
) 中读取参数,这可能是不希望的。 您可以显式传入选项和参数
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 导入系统的缓存机制,从同一进程对 pytest.main()
进行后续调用将不会反映调用之间对这些文件的更改。 因此,不建议从同一进程多次调用 pytest.main()
(例如,为了重新运行测试)。