使用参数化数据驱动,完成加减乘除测试用例的自动生成,请教一下怎么把参数传入用例

通过修改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 。


老师我这样传参数 报错

  1. 你报错的原因是,“param1” 是个字典,所以不能通过索引取获取元素。
  2. 我看到你的数据里面有"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()

明白了 多谢