通过修改hook函数后 方法动态的生成测试用例
# 通过 方法动态的生成测试用例
def pytest_generate_tests(metafunc: "Metafunc") -> None:
if "param1" in metafunc.fixturenames:
metafunc.parametrize("param1",
metafunc.module.mydatas,
ids=metafunc.module.myids,
scope='function')
测试用例里边怎么才能应用到hook函数里边修改的函数?
把之前的参数化的内容删掉,方法参数列表里面有param1 ,hook函数就能检测到。
check_div(self, param1):
你在测试用例里面直接打印param1,param1就是你传入的参数列表。
param1[0] 代表 a, param1[1] 代表b, param1[2] 代表 result 。
- 你报错的原因是,“param1” 是个字典,所以不能通过索引取获取元素。
- 我看到你的数据里面有"add",所以猜测是想数据参数化到每个测试case上。
思路是:动态生成用例时通过case名匹配,将case名匹配的参数化数据设置到对应的case上
以下是具体的实现例子。
步骤1:yaml文件
test_add: #每个测试case名
big: [10,20,30]
small: [0.2,0.3,0.5]
test_div:
big: [10,2,5]
步骤2:yaml数据读取及整理,使其与动态生成用例的myids,mydatas匹配
with open('a.yaml') as f:
datas = yaml.safe_load(f)
myids,mydatas={},{}
for key,data in datas.items():
myids[key] = data.keys()
mydatas[key] = data.values()
步骤3:hook函数设置动态生成用例
def pytest_generate_tests(metafunc: "Metafunc") -> None:
name = metafunc.function.__name__ # 获取当前case名
if "param1" in metafunc.fixturenames:
metafunc.parametrize("param1",
metafunc.module.mydatas.get(name), # 根据当前case名获取对应的数据
ids=metafunc.module.myids.get(name),
scope='function')
步骤4:case编写
def test_add(self,param1):
print(param1[0],param1[1],param1[2]) # 取出数据
1 个赞
with open('../datas/calc.yaml') as f:
datas = yaml.safe_load(f)
myids, mydatas = {}, {}
for key, data in datas.items():
myids[key] = data.keys()
mydatas[key] = data.values()
def test_param(param1):
print(f"param = {param1[0],param1[1],param1[2]}")
print("动态生成测试用例")
# 通过 方法动态的生成测试用例
def pytest_generate_tests(metafunc: "Metafunc") -> None:
name = metafunc.function.__name__ # 获取当前case名
if "param1" in metafunc.fixturenames:
metafunc.parametrize("param1",
metafunc.module.mydatas.get(name), # 根据当前case名获取对应的数据
ids=metafunc.module.myids.get(name),
scope='function')
按照你说的这个方法传参 还是报错
你的部分case在yaml中找不到数据
有两种方式解决,
第一种,将yaml中找不到的case数据
编写case的时候把param1,去掉;因为这个case不需要用上参数化
第二种,在动态生成用例的时候,加个逻辑判断避免这个错误;
def pytest_generate_tests(metafunc: "Metafunc") -> None:
name = metafunc.function.__name__ # 获取当前case名
if "param1" in metafunc.fixturenames and name in metafunc.module.mydatas.keys():
提示找不到param1 ,要是却掉的话怎么动态生成用例呢
动态生成用例里面不用变
我举个例子
def test_ss(param1):# 如果yaml里面没有test_ss则这里面的param1就不需要了,删掉就好了
print()