Pytest的参数化之fixture

使用fixture实现参数化

  那么下面我们再看一下fixture是如何实现参数化的?它为什么能实现参数化?

  • fixture提供了这么一个机制,fixture装饰的函数拥有一个内置的对象request,同时fixture中还有一个params参数是用来传递参数化数据的
  • 还是用登录的案例进行验证:
    import pytest
    
    username = [
        {
            "case": "登录成功",
            "name": "zhangsan",
            "pwd": 123
        },
        {
            "case": "账号不存在",
            "name": "lisi",
            "pwd": 234
        },
        {
            "case": "账号或密码错误",
            "name": "wangwu",
            "pwd": 345
        },
        {
            "case": "账号或密码不能为空",
            "name": "",
            "pwd": ""
        },
    ]
    
    @pytest.fixture(params=username)
    def parm_data(request):
        return request.param  # 返回request的params数据,这里存放的就是参数化数据
    
    
    def test_login(parm_data):
        name = parm_data.get("name")
        pwd = parm_data.get("pwd")
        print(f"user:{name},pwd:{pwd}")
        # 调用登录接口,传入name和pwd即可,代码省略

     

    在上面的代码中,我们定义了一个fixture,把参数化的数据传入了params,同时给fixture设置了返回request.param。在测试函数中,我们把定义好的fixture传入即可。通过fixture我们就能拿到每次迭代的参数化数据了!

    执行结果:

    在执行结果中用例名称没有显示出来,在fixture中也执行ids来进行传递参数,与parametrize一样
    @pytest.fixture(params=username,ids=[data.get("case") for data in username])

    加上上面代码后的执行结果如下:

    注:可以看到左侧的用例标题和右侧的输出都很完美,没有问题!不过要记得conftest.py中的Hook函数同样也是需要
posted @ 2023-04-14 14:59  A熙  阅读(55)  评论(0)    收藏  举报