pytest 参数化测试的自定义名称

MLu*_*MLu 6 python pytest python-3.x

我有一个pytest测试,它使用@pytest.mark.parametrize装饰器进行参数化,使用自定义函数load_test_cases()从 yaml 文件加载测试用例。

class SelectTestCase:
    def __init__(self, test_case):
        self.select = test_case['select']
        self.expect = test_case['expect']

    def __str__(self):        # also tried __repr__()
        # Attempt to print the 'select' attribute in "pytest -v" output
        return self.select


def load_test_cases(path):
    with open(path, "rt") as f:
        test_cases = yaml.safe_load_all(f)
        return [ SelectTestCase(test_case) for test_case in test_cases ]


@pytest.mark.parametrize("test_case", load_test_cases("tests/select-test-cases.yaml"))
def test_select_prefixes(test_case):
    # .. run the test
Run Code Online (Sandbox Code Playgroud)

它运行良好,只是运行时的测试pytest -v显示为test_case0test_case1等参数。

tests/test_resolver.py::test_select_prefixes[test_case0] PASSED  [ 40%]
tests/test_resolver.py::test_select_prefixes[test_case1] PASSED  [ 60%]
tests/test_resolver.py::test_select_prefixes[test_case2] PASSED  [ 80%]
tests/test_resolver.py::test_select_prefixes[test_case3] PASSED  [100%]
Run Code Online (Sandbox Code Playgroud)

我希望看到显示select的属性,例如

tests/test_resolver.py::test_select_prefixes["some query"] PASSED  [ 40%]
tests/test_resolver.py::test_select_prefixes["another query"] PASSED  [ 60%]
Run Code Online (Sandbox Code Playgroud)

我尝试向SelectTestCase__str__()类添加和__repr__()方法,但没有任何区别。

知道怎么做吗?

MrB*_*men 9

您可以使用ids 参数定义参数化测试名称的外观。这可以是字符串列表,也可以是一个将当前参数作为参数并返回要在测试名称中显示的 ID 的函数。

因此,在您的情况下,使用str该函数就足够了,因为您已经实现了__str__参数(类型为SelectTestCase)。如果你只是写:

@pytest.mark.parametrize("test_case", load_test_cases("tests/select-test-cases.yaml"),
                         ids=str)
def test_select_prefixes(test_case):
    # .. run the test
Run Code Online (Sandbox Code Playgroud)

你会得到想要的行为,例如

tests/test_resolver.py::test_select_prefixes[some query] PASSED  [ 40%]
tests/test_resolver.py::test_select_prefixes[another query] PASSED  [ 60%]
Run Code Online (Sandbox Code Playgroud)

除了撇号(您可以通过__str__相应调整来添加)。