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

时间:2020-09-10 04:53:38

标签: python python-3.x pytest

我有一个 pytest 测试,该测试使用自定义函数@pytest.mark.parametrize的{​​{1}}装饰器进行了参数化,该自定义函数从yaml文件中加载了测试用例。

load_test_cases()

除了使用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 pytest -v等参数显示使用test_case0运行的测试外,它运行良好。

test_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%] 属性,

select

我试图将tests/test_resolver.py::test_select_prefixes["some query"] PASSED [ 40%] tests/test_resolver.py::test_select_prefixes["another query"] PASSED [ 60%] __str__()方法添加到 SelectTestCase 类中,但是没有任何区别。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您可以使用ids parameter定义参数化测试名称的外观。这可以是字符串列表,也可以是将当前参数作为参数并返回要在测试名称中显示的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

您将获得所需的行为,例如

tests/test_resolver.py::test_select_prefixes[some query] PASSED  [ 40%]
tests/test_resolver.py::test_select_prefixes[another query] PASSED  [ 60%]

除了撇号(您可以通过相应地修改__str__来添加撇号)。