记录在 pytest 函数中的参数顺序(它们的命名?)在哪里?

Where is the order of parameters (naming of them?) in a pytest function documented?

这似乎是一个非常基本的问题,但我查看了 https://docs.pytest.org/en/6.2.x/reference.html,我认为它是 pytest 的参考,但找不到答案。

所以我想将 pytest.fixture(setup/teardown 使用 yield)与 pytest.mark.parametrize 结合起来......我意识到它们都必须包括在内测试函数中的参数。

一个简单的实验表明,它们在参数列表中的排列顺序似乎并不重要,所以我目前的工作假设是它永远不重要,而且,也没有(可选)这些方法中的命名参数。

很高兴知道这是否真的记录在某处,以及我是否做对了。

据我所知,这没有明确说明,但隐含地遵循 documentation:

When pytest goes to run a test, it looks at the parameters in that test function’s signature, and then searches for fixtures that have the same names as those parameters. Once pytest finds them, it runs those fixtures, captures what they returned (if anything), and passes those objects into the test function as arguments.

旁注: 我通常建议查看此文档 - 它最近已重新编写并且非常全面 IMO)

夹具总是按名称查找,因此原则上它们在参数列表中出现的顺序无关紧要。 正如观察到的那样,pytest.mark.parametrize 中给出的参数也是如此。

一般来说,独立的fixture的执行顺序是无所谓的,如果有的话,要么是bug,要么是fixture不兼容。

有一个警告:如果您将 fixtures 与 unittest.mock.patchunittest.mock.patch.object 装饰器(pytest 支持)引入的位置参数一起使用,则 fixture 参数应始终最后通过:

from unittest.mock import patch

@patch("module.class")
def test_correct(mocked_class, capsys):
   ...

@patch("module.class")
def test_incorrect(capsys, mocked_class):
   ...
# fails because "mocked_class" is seen as an unknown fixture

考虑到位置参数的工作原理,这并不奇怪。
避免这种情况的一种方法是使用 pytest-mock,它提供 mocker fixture:

def test_correct(mocker, capsys):
   mocked_class = mocker.patch("module.class")
   ...

def test_correct2(capsys, mocker):
   mocked_class = mocker.patch("module.class")
   ...