使用pytest_generate_tests时如何为pytest.param设置动态marks参数
解决方案
你当前的问题是构造了字符串格式的标记路径,而非pytest要求的_pytest.mark.structures.MarkDecorator类型的标记实例,通过getattr动态获取pytest.mark下对应名称的属性即可解决。
修正后核心代码
def pytest_generate_tests(metafunc): ###################################################################### # cm变量从yaml文件中读取定义,值为标记名称的字符串 ###################################################################### cm = "custom_marker" # 动态获取标记对象,而非构造字符串 marker = getattr(pytest.mark, cm) final_param = pytest.param((1,2), marks=marker)
常用扩展场景
- 多个标记的情况:如果yaml中配置了多个标记,直接构造标记对象列表传入即可
# 假设从yaml读取到标记列表 cm_list = ["custom_marker1", "custom_marker2", "slow"] markers = [getattr(pytest.mark, cm) for cm in cm_list] final_param = pytest.param((1,2), marks=markers) - 带参数的标记:如果标记需要传参(比如
skipif这类带参数的标记),可以在YAML中存储标记的参数配置,按如下方式处理# 假设从yaml读取到的带参标记配置 marker_conf = { "name": "skipif", "args": [__import__("sys").version_info < (3,8)], "kwargs": {"reason": "Python版本低于3.8不支持该用例"} } marker = getattr(pytest.mark, marker_conf["name"])(*marker_conf["args"], **marker_conf["kwargs"])
注意事项
记得提前在pytest.ini/pyproject.toml中注册所有自定义标记,避免pytest运行时抛出未知标记的警告,示例pytest.ini配置如下:
[pytest] markers = custom_marker1: 第一种自定义标记的说明 custom_marker2: 第二种自定义标记的说明 slow: 标记运行耗时较长的用例
内容的提问来源于stack exchange,提问作者user8615607
相关产品推荐
相关产品推荐

