配置

Configuration

命令行选项和配置文件设置

Command line options and configuration file settings

您可以通过使用通用帮助选项获取关于命令行选项和 INI 风格配置文件中的值的帮助:

pytest -h   # 打印选项 _和_ 配置文件设置

这将显示已安装插件注册的命令行和配置文件设置。

配置文件格式

Configuration file formats

许多 pytest 设置 可以在 配置文件 中设置,按照约定,这些配置文件位于您代码库的根目录。

以下是 pytest 支持的配置文件的快速示例:

pytest.ini

pytest.ini

pytest.ini 文件优先于其他文件,即使是空的文件。

另外,可以使用隐藏版本 .pytest.ini

# pytest.ini 或 .pytest.ini
[pytest]
minversion = 6.0
addopts = -ra -q
testpaths =
    tests
    integration

pyproject.toml

pyproject.toml

Added in version 6.0.

pyproject.toml 文件在包含 tool.pytest.ini_options 表时会被考虑用于配置。

# pyproject.toml
[tool.pytest.ini_options]
minversion = "6.0"
addopts = "-ra -q"
testpaths = [
    "tests",
    "integration",
]

Note

可能有人会疑问为何使用 [tool.pytest.ini_options] 而不是 [tool.pytest],这与其他工具的情况不同。

原因是 pytest 团队打算在未来充分利用丰富的 TOML 数据格式进行配置,因此保留 [tool.pytest] 表用于此目的。目前,ini_options 表被用作现有 .ini 配置系统与未来配置格式之间的桥梁。

tox.ini

tox.ini

tox.ini 文件是 tox 项目的配置文件,也可以用于保存 pytest 配置,只要它们包含 [pytest] 部分。

# tox.ini
[pytest]
minversion = 6.0
addopts = -ra -q
testpaths =
    tests
    integration

setup.cfg

setup.cfg

setup.cfg 文件是通用配置文件,最初由 distutils``(现已弃用)和 :std:doc:`setuptools <setuptools:userguide/declarative_config>` 使用,也可以用于保存 pytest 配置,只要它们包含 ``[tool:pytest] 部分。

# setup.cfg
[tool:pytest]
minversion = 6.0
addopts = -ra -q
testpaths =
    tests
    integration

Warning

不建议使用 setup.cfg,除非用于非常简单的用例。.cfg 文件使用与 pytest.initox.ini 不同的解析器,这可能导致难以追踪的问题。 尽可能建议使用后者文件或 pyproject.toml 来保存您的 pytest 配置。

初始化:确定 rootdir 和 configfile

Initialization: determining rootdir and configfile

pytest 为每次测试运行确定一个 rootdir,这取决于命令行参数(指定的测试文件、路径)以及配置文件的存在。确定的 rootdirconfigfile 会在启动时作为 pytest 头部的一部分打印出来。

以下是 pytest 使用 rootdir 的总结:

  • 在收集期间构造 nodeids;每个测试会被分配一个唯一的 nodeid,该 nodeidrootdir 为根,考虑完整路径、类名、函数名和参数化(如有)。

  • 被插件用作存储项目/测试运行特定信息的稳定位置;例如,内部的 cache 插件会在 rootdir 中创建一个 .pytest_cache 子目录以存储其跨测试运行状态。

rootdir 用于修改 sys.path/PYTHONPATH 或影响模块的导入方式。有关更多细节,请参见 pytest 导入机制和 sys.path / PYTHONPATH

--rootdir=path 命令行选项可用于强制指定一个特定目录。 请注意,与其他命令行选项不同,--rootdir 不能与 pytest.ini 中的 addopts 一起使用,因为 rootdir 已经用于 查找 pytest.ini

查找 rootdir

Finding the ``rootdir``

以下是从 args 中查找 rootdir 的算法:

  • 如果命令行中传入了 -c,则将其用作配置文件,并将其目录作为 rootdir

  • 确定指定的 args 的共同祖先目录,这些路径被识别为文件系统中存在的路径。如果没有找到这样的路径,则共同祖先目录设置为当前工作目录。

  • 在祖先目录及其上层查找 pytest.inipyproject.tomltox.inisetup.cfg 文件。如果匹配到一个文件,它将成为 configfile,其目录将成为 rootdir

  • 如果未找到配置文件,则从共同祖先目录向上查找 setup.py 来确定 rootdir

  • 如果未找到 setup.py,则在每个指定的 args 及其上层查找 pytest.inipyproject.tomltox.inisetup.cfg。如果匹配到一个文件,它将成为 configfile,其目录将成为 rootdir

  • 如果未找到 configfile 且未传递配置参数,则使用已经确定的共同祖先作为根目录。这允许在不属于某个包且没有特定配置文件的结构中使用 pytest。

如果没有给出 args,pytest 将在当前工作目录下收集测试,并从那里开始确定 rootdir

文件仅在满足以下条件时才会匹配为配置:

  • pytest.ini:将始终匹配并优先,即使是空的。

  • pyproject.toml:包含 [tool.pytest.ini_options] 表。

  • tox.ini:包含 [pytest] 部分。

  • setup.cfg:包含 [tool:pytest] 部分。

最后,如果没有找到其他匹配项,则 pyproject.toml 文件将被视为 configfile,即使它不包含 [tool.pytest.ini_options] 表(这一点是在 8.1 中添加的)。

文件将按照上述顺序考虑。来自多个 configfile 候选的选项永远不会合并 - 第一个匹配的胜出。

配置文件还确定 rootpath 的值。

Config 对象(可以通过钩子或 pytestconfig 夹具访问)将随后携带这些属性:

  • config.rootpath:确定的根目录,保证存在。它用作构建测试地址(“nodeids”)的参考目录,也可以被插件用于存储每次测试运行的信息。

  • config.inipath:确定的 configfile,可能为 None``(出于历史原因命名为 ``inipath)。

Added in version 6.1: config.rootpathconfig.inipath 属性。它们是较旧的 config.rootdirconfig.inifilepathlib.Path 版本,后者的类型为 py.path.local,并仍然存在以保持向后兼容。

示例:

pytest path/to/testdir path/other/

将确定共同祖先为 path,然后按以下方式检查配置文件:

# 首先查找 pytest.ini 文件
path/pytest.ini
path/pyproject.toml  # 必须包含 [tool.pytest.ini_options] 表以匹配
path/tox.ini         # 必须包含 [pytest] 部分以匹配
path/setup.cfg       # 必须包含 [tool:pytest] 部分以匹配
pytest.ini
... # 一直到根目录

# 现在查找 setup.py
path/setup.py
setup.py
... # 一直到根目录

Warning

自定义 pytest 插件命令行参数可能包含路径,如 pytest --log-output ../../test.log args。在这种情况下,args 是强制性的, 否则 pytest 会使用 test.log 的文件夹来确定 rootdir (另请参见 #1435)。 也可以使用点 . 来引用当前工作目录。

内置配置文件选项

Builtin configuration file options

有关完整的选项列表,请参阅 参考文档

语法高亮主题自定义

Syntax highlighting theme customization

pytest 使用的语法高亮主题可以通过两个环境变量进行自定义: