如何为使用metafunc生成的测试用例添加xfail标记?
给指定YAML测试用例标记xfail的几种方法
方法一:通过文件名约定自动标记
如果允许给需要xfail的YAML文件命名时加标识(比如文件名带_xfail后缀),可以直接在生成测试用例的逻辑里判断并添加标记:
def pytest_generate_tests(metafunc): if "yamlpath" in metafunc.fixturenames: params = [] names = [] for filename in os.listdir(YAML_FILES_FOLDER): if filename.endswith(('.yaml', '.yml')): testname = filename.split('.')[0] filepath = YAML_FILES_FOLDER / filename # 给带_xfail的测试用例添加xfail标记 param = pytest.param(filepath, marks=pytest.mark.xfail(reason="预期失败")) if "_xfail" in filename else filepath params.append(param) names.append(testname) metafunc.parametrize("yamlpath", params, ids=names)
只要文件名包含_xfail,对应的测试用例就会被自动标记为xfail。
方法二:从YAML文件内部读取标记
如果不想修改文件名,可以在YAML文件中新增配置字段(比如xfail: true),通过读取文件内容判断后添加标记:
import yaml def pytest_generate_tests(metafunc): if "yamlpath" in metafunc.fixturenames: params = [] names = [] for filename in os.listdir(YAML_FILES_FOLDER): if filename.endswith(('.yaml', '.yml')): testname = filename.split('.')[0] filepath = YAML_FILES_FOLDER / filename # 读取YAML内容 with open(filepath, 'r') as f: yaml_data = yaml.safe_load(f) # 根据YAML内的标记判断是否添加xfail marks = pytest.mark.xfail(reason=yaml_data.get('xfail_reason', '预期失败')) if yaml_data.get('xfail') else [] param = pytest.param(filepath, marks=marks) params.append(param) names.append(testname) metafunc.parametrize("yamlpath", params, ids=names)
对应的YAML文件示例:
xfail: true xfail_reason: "该用例依赖未实现的功能" # 其他测试内容...
方法三:维护xfail测试名称列表
如果需要更灵活的控制,可以单独维护一个需要标记的测试名称列表,匹配时添加标记:
# 定义需要标记为xfail的测试名称(即YAML文件名去掉后缀) XFAIL_TESTS = ["test_login_error", "test_payment_timeout"] def pytest_generate_tests(metafunc): if "yamlpath" in metafunc.fixturenames: params = [] names = [] for filename in os.listdir(YAML_FILES_FOLDER): if filename.endswith(('.yaml', '.yml')): testname = filename.split('.')[0] filepath = YAML_FILES_FOLDER / filename # 匹配列表中的测试名称添加xfail标记 marks = pytest.mark.xfail(reason="预期失败") if testname in XFAIL_TESTS else [] param = pytest.param(filepath, marks=marks) params.append(param) names.append(testname) metafunc.parametrize("yamlpath", params, ids=names)
只需把需要xfail的测试名加到XFAIL_TESTS列表即可。
内容的提问来源于stack exchange,提问作者magnusmaehlum
相关产品推荐
相关产品推荐

