1

我有以下测试:

@pytest.mark.parametrize(
    "nums",
    [[3, 1, 5, 4, 2], [2, 6, 4, 3, 1, 5], [1, 5, 6, 4, 3, 2]]
)
def test_cyclic_sort(nums):
    pass


@pytest.mark.parametrize(
    "nums, missing",
    [([4, 0, 3, 1], 2)]
)
def test_find_missing_number(nums, missing):
    pass

我想自定义测试名称以包含输入数组。我已经阅读了pytest docsthis questionthis question,但没有人回答以下问题:

  1. 传递给 id 函数的是什么?在我上面的代码中,第一个测试需要一个参数,第二个测试需要两个。
  2. pytest 文档对 id 使用顶级函数,而我想将我的测试放在一个类中并使用@staticmethod. 尝试TestClass.static_method从内部引用静态方法TestClass会导致 PyCharm 出错;这样做的正确语法是什么?

编辑: 创建https://github.com/pytest-dev/pytest/issues/8448

4

1 回答 1

1

当为关键字使用 callable 时ids,将使用单个参数调用它:被参数化的测试参数的值。可调用ids返回一个字符串,该字符串将在方括号中用作测试名称后缀。

如果测试对多个值进行参数化,则仍将使用单个参数调用该函数,但每次测试将多次调用该函数。生成的名称将与破折号相连,例如

"-".join([idfunc(val) for val in parameters])

例如:

test_something[val1-val2-val3]

这是 pytest 源中的加入

要使用静态方法,此语法有效:

class TestExample:

    @staticmethod
    def idfunc(val):
        return f"foo{val}"

    @pytest.mark.parametrize(
        "x, y",
        [
            [1, 2],
            ["a", "b"],
        ],
        ids=idfunc.__func__,
    )
    def test_vals(self, x, y):
        assert x
        assert y

idfunc这将生成两个测试,如上所述调用四次。

TestExample::test_vals[foo1-foo2]
TestExample::test_vals[fooa-foob]
于 2021-03-15T02:59:32.660 回答