我有一个 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 类中,但是没有任何区别。
有什么想法吗?
答案 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__
来添加撇号)。