如何修改Pytest中@pytest.mark.parametrize的参数打印行为?
解决pytest参数化长字符串显示冗长的问题
当使用@pytest.mark.parametrize传入长字符串作为测试参数时,控制台输出的测试名称会包含完整的长字符串,导致内容过于冗长。以下两种方法可以修改显示逻辑,只展示字符串的末尾部分:
方法一:自定义测试用例ID(针对单个测试)
直接在parametrize装饰器中通过ids参数自定义每个测试用例的显示名称,截取字符串末尾指定长度的内容:
def get_short_case_id(str1, str2): # 截取每个字符串的最后10个字符,长度不足则显示完整内容 short_str1 = str1[-10:] if len(str1) > 10 else str1 short_str2 = str2[-10:] if len(str2) > 10 else str2 return f"{short_str1}-{short_str2}" @pytest.mark.parametrize( "long_string_p1, long_string_p2", [(a, b) for a, b in zip(list_str_1, list_str_2)], # 为每个参数组合生成短ID ids=[get_short_case_id(a, b) for a, b in zip(list_str_1, list_str_2)] ) def test_with_long_strings(long_string_p1, long_string_p2): assert long_string_p1 != long_string_p2
执行后控制台输出示例:
test_example.py::test_with_long_strings[ng string1-ng string2] PASSED
方法二:全局修改参数显示逻辑(所有测试生效)
在项目根目录的conftest.py中添加pytest_generate_tests钩子函数,全局处理所有参数化的字符串参数,自动截取末尾内容:
def pytest_generate_tests(metafunc): for param_name in metafunc.fixturenames: if param_name in metafunc.parametrize: param_values = metafunc.parametrize[param_name].args[0] new_ids = [] for item in param_values: if isinstance(item, tuple): # 处理多参数组合的情况 short_parts = [] for part in item: if isinstance(part, str): short_part = part[-10:] if len(part) > 10 else part short_parts.append(short_part) else: short_parts.append(str(part)) new_ids.append("-".join(short_parts)) elif isinstance(item, str): new_ids.append(item[-10:] if len(item) > 10 else item) else: new_ids.append(str(item)) # 替换原有的测试ID metafunc.parametrize(param_name, param_values, ids=new_ids)
这个方法会对所有使用参数化的测试用例生效,无需逐个修改测试代码。
内容的提问来源于stack exchange,提问作者Janet
相关产品推荐
相关产品推荐

