目录
命令行选项和配置文件设置
您可以通过使用一般帮助选项来获取有关命令行选项和INI风格配置文件中的值的帮助:
pytest -h # prints options _and_ config file settings
这将显示已安装插件注册的命令行和配置文件设置。
配置文件格式
许多pytest设置可以在配置文件中设置,按照惯例,这些配置文件存放在您的仓库的根目录中。
以下是pytest支持的配置文件的一个快速示例:
pytest.ini
pytest.ini文件具有优先权,即使它是空的。
另外,也可以使用隐藏版本的.pytest.ini文件。
# pytest.ini or .pytest.ini
[pytest]
minversion = 6.0
addopts = -ra -q
testpaths =
tests
integration
-
通常,
pytest.ini
放在仓库的根目录下,而.pytest.ini
是一个隐藏文件,两者功能相同,但后者在某些环境下可能更为隐蔽。 -
[pytest]
:这是配置文件的节(section)标识符,告诉pytest接下来的配置是专门为其设计的。 -
minversion = 6.0
:这一行指定了运行这些测试所需的最小pytest版本。如果安装的pytest版本低于6.0,pytest将拒绝运行测试,并显示一条错误消息,告知用户需要升级pytest。 -
addopts = -ra -q
:addopts
允许你添加一些默认的命令行选项,这些选项会在每次运行pytest时自动使用。在这个例子中,-ra
表示在测试运行结束后显示所有失败和跳过的测试(即使其他测试也失败了),-q
表示更安静的输出模式,只显示测试进度和结果摘要。 -
testpaths =
:testpaths
选项用于指定pytest应该搜索测试文件的目录。在这个例子中,pytest将在tests
和integration
这两个目录下搜索测试文件。如果你没有指定testpaths
,pytest将默认在当前目录及其子目录中搜索名为test_*.py
或*_test.py
的文件,以及任何包含pytest_
前缀的目录。
pyproject.toml
从版本6.0开始引入。
当pyproject.toml
文件中包含tool.pytest.ini_options
表时,pytest会考虑使用它进行配置。
# pyproject.toml
[tool.pytest.ini_options]
minversion = "6.0"
addopts = "-ra -q"
testpaths = [
"tests",
"integration",
]
在这个pyproject.toml
文件的例子中,我们为pytest配置了几个选项:
minversion = "6.0"
:指定了运行测试所需的最小pytest版本为6.0。addopts = "-ra -q"
:为pytest添加了默认的命令行选项。-ra
表示在测试结束后显示所有失败和跳过的测试,-q
表示更安静的输出模式。testpaths = ["tests", "integration"]
:指定了pytest应该搜索测试文件的目录列表。在这个例子中,pytest将在tests
和integration
这两个目录下搜索测试文件。列表中的每个路径都是一个字符串,被方括号[]
包围,多个路径之间用逗号,
分隔。
注意
有人可能会好奇,为什么使用[tool.pytest.ini_options]
而不是像其他工具那样直接使用[tool.pytest]
。
原因是pytest团队打算在未来充分利用TOML数据格式的丰富性来进行配置,因此保留了[tool.pytest]
表以供将来使用。目前,ini_options
表被用作现有.ini配置系统和未来配置格式之间的桥梁。这样,pytest可以在不破坏现有用户配置的情况下,逐步向更先进的配置系统过渡。
tox.ini
tox.ini
文件是 tox 项目的配置文件,如果它们包含 [pytest]
部分,则也可以用于存放 pytest 的配置。
# tox.ini
[pytest]
minversion = 6.0
addopts = -ra -q
testpaths =
tests
integration
setup.cfg
setup.cfg
文件是通用配置文件,最初由 distutils(现已弃用)和 setuptools 使用,如果它们包含 [tool:pytest]
部分,则也可以用于存放 pytest 的配置。
# setup.cfg
[tool:pytest]
minversion = 6.0
addopts = -ra -q
testpaths =
tests
integration
警告
除非是非常简单的用例,否则不建议使用 setup.cfg
来存放 pytest 配置。.cfg
文件使用与 pytest.ini
和 tox.ini
不同的解析器,这可能会导致难以追踪的问题。如果可能的话,建议使用 pytest.ini
、tox.ini
或 pyproject.toml
文件来存放你的 pytest 配置。
初始化:确定根目录和配置文件
pytest 为每次测试运行确定一个根目录(rootdir),这个根目录取决于命令行参数(指定的测试文件、路径)以及配置文件的存在与否。在启动过程中,pytest 会将确定的根目录和配置文件作为 pytest 头部信息的一部分打印出来。
以下是 pytest 使用根目录(rootdir)的简要概述:
-
在收集过程中构建 nodeid:pytest 在收集测试时,会为每个测试分配一个唯一的 nodeid。这个 nodeid 是以根目录为根,并考虑到完整路径、类名、函数名和参数化(如果有的话)来构建的。这有助于在测试报告中清晰地标识每个测试项,并允许用户通过 nodeid 精确地选择和执行特定的测试。
-
作为插件存储项目/测试运行特定信息的稳定位置:插件可以使用根目录作为一个稳定的位置来存储与项目或测试运行相关的特定信息。例如,pytest 的内部缓存插件会在根目录下创建一个
.pytest_cache
子目录,用于存储跨测试运行的状态信息。这样,即使在不同的测试运行之间,插件也能够保持和访问其所需的数据,从而提供更高效和一致的测试体验。
根目录(rootdir)不会用于修改 sys.path
/PYTHONPATH
或影响模块的导入方式。有关更多详情,请参阅 pytest 的导入机制和 sys.path
/PYTHONPATH
的文档。
可以使用 --rootdir=path
命令行选项来强制指定一个特定的目录作为根目录。但请注意,与其他命令行选项不同,--rootdir
不能在 pytest.ini
文件中的 addopts
部分使用,因为 pytest 在查找 pytest.ini
文件时已经使用了根目录来确定其位置。这意味着,--rootdir
必须在命令行中直接指定,而不能通过配置文件间接设置。
查找根目录(Finding the rootdir)
以下是 pytest 从命令行参数中查找根目录的算法:
-
如果使用了 -c 选项:如果命令行中使用了
-c
选项来指定配置文件,那么使用该配置文件的位置作为根目录。 -
确定指定路径的公共祖先目录:对于命令行中指定的、且在文件系统中实际存在的路径参数,确定它们的公共祖先目录。如果没有找到这样的路径,则将公共祖先目录设置为当前工作目录。
-
在祖先目录及其上级目录中查找配置文件:在公共祖先目录及其上级目录中查找
pytest.ini
、pyproject.toml
、tox.ini
和setup.cfg
文件。如果找到其中任何一个文件,那么该文件成为配置文件(configfile),其所在目录成为根目录(rootdir)。 -
如果未找到配置文件,则向上查找
setup.py
:如果在公共祖先目录及其上级目录中未找到上述配置文件,则继续向上查找setup.py
文件以确定根目录。 -
如果未找到
setup.py
,则在每个指定参数及其上级目录中查找配置文件:对于命令行中指定的每个参数(作为路径),在其及其上级目录中查找pytest.ini
、pyproject.toml
、tox.ini
和setup.cfg
文件。如果找到其中任何一个文件,那么该文件成为配置文件,其所在目录成为根目录。 -
如果未找到配置文件且未传递配置参数:如果既没有找到配置文件,也没有通过命令行参数传递配置信息,那么使用之前已经确定的公共祖先目录作为根目录。这允许 pytest 在不属于包结构且没有特定配置文件的目录结构中使用。
如果没有给出任何参数,pytest 将在当前工作目录下收集测试,并从那里开始确定根目录。
只有在以下情况下,文件才会被视为配置文件并进行匹配:
-
pytest.ini
:始终会匹配,并且即使该文件为空,也会优先使用。pytest.ini
是 pytest 的主要配置文件,用于自定义 pytest 的行为。 -
pyproject.toml
:如果该文件包含了一个[tool.pytest.ini_options]
表格,那么它将被视为 pytest 的配置文件。pyproject.toml
是 Python 项目的一个通用配置文件,pytest 通过特定的部分来读取配置信息。 -
tox.ini
:如果该文件包含了一个[pytest]
部分,那么它也将被视为 pytest 的配置文件之一。tox.ini
主要是用于配置 tox 工具,但 tox 支持 pytest 作为其测试后端,因此可以在tox.ini
中指定 pytest 的相关配置。 -
setup.cfg
:如果该文件包含了一个[tool:pytest]
部分,那么它也会被 pytest 识别为配置文件。setup.cfg
是 Python 项目的另一个常见配置文件,用于配置多种工具,包括 pytest。通过[tool:pytest]
部分,可以在setup.cfg
中为 pytest 指定配置选项。
最后,如果没有找到其他匹配项,pyproject.toml
文件将被视为配置文件,即使它不包含 [tool.pytest.ini_options]
表格(这一行为是在 8.1 版本中添加的)。
配置文件的考虑顺序遵循上述说明。来自多个候选配置文件的选项永远不会合并——第一个匹配项胜出。
配置文件还决定了 rootpath
的值。在 pytest 的上下文中,rootpath
通常指的是包含配置文件的目录,即根目录(rootdir)。
Config 对象(可通过钩子(hooks)或 pytestconfig fixture访问)随后将携带以下属性:
-
config.rootpath:确定的根目录,保证存在。它用作构建测试地址(“nodeids”)的参考目录,并且插件也可以使用它来存储每次测试运行的信息。
-
config.inipath:确定的配置文件路径,可能是
None
(出于历史原因,它被命名为inipath
)。
在版本 6.1 中新增了 config.rootpath
和 config.inipath
属性。它们是旧版 config.rootdir
和 config.inifile
的 pathlib.Path 版本,后者是 py.path.local
类型,为了向后兼容而仍然存在。这意味着现在你可以使用更现代的 pathlib
API 来处理路径,而 pytest 会同时维护这两种版本的路径属性以支持旧代码。
示例:
pytest path/to/testdir path/other/
会首先确定这些路径的公共祖先目录(在这个例子中是 path
),然后按照以下顺序检查配置文件:
# first look for pytest.ini files
path/pytest.ini
path/pyproject.toml # must contain a [tool.pytest.ini_options] table to match
path/tox.ini # must contain [pytest] section to match
path/setup.cfg # must contain [tool:pytest] section to match
pytest.ini
... # all the way up to the root
# now look for setup.py
path/setup.py
setup.py
... # all the way up to the root
警告
自定义的 pytest 插件命令行参数可能会包含一个路径,比如 pytest --log-output ../../test.log args
。在这个例子中,args
是必须的,否则 pytest 会使用 test.log
文件所在的文件夹来确定根目录(rootdir)(也请参考 #1435)。此外,使用点(.
)来表示当前工作目录也是可能的。
内置配置文件选项
要获取完整的选项列表,请查阅参考文档reference documentation。
语法高亮主题自定义
pytest 使用的语法高亮主题可以通过两个环境变量来自定义:
- PYTEST_THEME 设置要使用的 pygments 样式pygment style。
- PYTEST_THEME_MODE 设置此样式的亮度模式为亮色或暗色。