如何调用 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

**通过节点标识运行测试**

每个收集到的测试都被分配一个唯一的 nodeid,它由模块文件名后跟类名、函数名和来自参数化的参数等说明符组成,用 :: 字符分隔。

要运行模块中的特定测试:

pytest test_mod.py::test_func

另一个在命令行中指定测试方法的示例:

pytest test_mod.py::TestClass::test_method

通过标记表达式运行测试

pytest -m slow

将运行所有使用 @pytest.mark.slow 装饰器修饰的测试。

有关更多信息,请参阅标记

从包中运行测试

pytest --pyargs pkg.testing

这将导入 pkg.testing 并使用其文件系统位置来查找并运行测试。

获得关于版本、选项名称和环境变量的帮助

pytest --version   # 显示 pytest 导入自哪里
pytest --fixtures  # 显示可用的内置函数参数
pytest -h | --help # 显示命令行和配置文件选项的帮助信息

分析测试执行的时间

要获取执行时间超过1.0秒的最慢的10个测试持续时间的列表:

pytest --durations=10 --durations-min=1.0

默认情况下,pytest不会显示持续时间太短(\<0.005秒)的测试,除非在命令行上使用-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

Calling pytest from Python code

你可以直接从Python代码中调用 pytest

Python
retcode = pytest.main()

这与从命令行调用 "pytest" 类似。它不会引发 SystemExit 异常,而是返回 退出代码 <exit-codes>。你可以传递选项和参数:

Python
retcode = pytest.main(["-x", "mytestdir"])

你还可以向 pytest.main 指定额外的插件:

Python
# content of myinvoke.py
import pytest
import sys


class MyPlugin:
    def pytest_sessionfinish(self):
        print("*** test run reporting finishing")


if __name__ == "__main__":
    sys.exit(pytest.main(["-qq"], plugins=[MyPlugin()]))

运行此代码将显示已添加MyPlugin并调用了其hook:

$ python myinvoke.py
*** 测试运行报告完成

调用 pytest.main() 将导致导入您的测试以及它们导入的任何模块。由于 Python 导入系统的缓存机制,从同一进程中多次调用 pytest.main() 不会反映在这些调用之间的文件更改。因此,不建议在同一进程中多次调用 pytest.main()(例如,为了重新运行测试)。

results matching ""

    No results matching ""