这个Pytest函数,轻松实现动态参数化√

2386 篇文章 33 订阅
1297 篇文章 7 订阅

在这里插入图片描述

无论什么自动化,部分测试用例均会运用到参数化,参数化可以帮助我们覆盖更多的测试用例,减少重复代码逻辑,然而自动化中也有多种实现参数化的方法,比如UnitTest的DDT模式,Pytest的fixture,以及Pytest的parametrize均可以实现测试用例的参数化。

今天小编介绍新的一种方法,通过hook函数来实现测试用例的参数化,废话不多说,直接进入正文。

pytest_generate_tests

pytest_generate_tests钩子函数是Pytest框架中用来动态生成测试用例参数的钩子函数。通过它,我们可以在运行时动态地生成测试参数,从而避免手动编写重复的测试用例。

在conftest.py文件中编写对应的函数信息:

import pytest
def pytest_generate_tests(metafunc):
    if "data" in metafunc.fixturenames:
        metafunc.parametrize("data",
                             metafunc.module.test_data,
                             scope="function"
                             )

其中代码中data表示测试用例中对应的传参,类似fixture名称传入,metafunc表示当前测试用例的模块对象,scope表示测试用例的作用域,默认为function。

方法一

简单编写两条测试用例,然后通过pytest_generate_tests实现测试用例的参数化:

import requests
url = 'http://apis.juhe.cn/simpleWeather/query'
# 测试数据
test_data = [{
                "data":
                    {
                        "city": "上海",
                        "key": "xxxxxxxx"
                    }
        },
    {
        "data":
            {
                "city": "北京",
                "key": "xxxxxxx"
            }
    }
]
# 测试用例
def test_01(data):
  # 启动**data表示传入参数
    r = requests.post(url, **data)
    print(r.text)

编写完成后,直接运行程序,通过结果发现已经执行成功。

图片

方法二

通过上面的案例,小伙伴们可能懂了pytest_generate_tests如何运行的.

其实该函数主要提供的就是动态方便我们实现测试用例,上述方法很显然不动态,小编在介绍一种使用方法,场景是根据不同的命令行,传入不同的测试数据。

这个时候就想到了pytest的另一个函数pytest_addoption,可以实现自定义命令行参数后,再次动态实现我们的参数化内容。更改conftest.py文件内容,增加pytest_addoption函数内容:

import pytest
def pytest_addoption(parser):
    # 添加自定义参数--anjing
    parser.addoption(
        "--anjing", action="store", default="anjing", help="将'anjing'添加到pytest的配置参数中"
    )

def pytest_generate_tests(metafunc):
    if "data" in metafunc.fixturenames:
        # 获取命令行的参数信息
        result = metafunc.config.getoption("anjing")
        # 判断传参值,通过传参值进行不同传入参数
        if result == 'test':
            metafunc.parametrize("data",
                             metafunc.module.test_shanghai,
                             scope="function"
                             )
        if result == 'qa':
            metafunc.parametrize("data",
                                 metafunc.module.test_beijing,
                                 scope="function"
                                 )

同样根据刚才的测试用例,将测试数据进行分离,参数值为test的访问上海的参数,参数值为qa的我们访问北京的参数:

import requests
# 上海的参数
test_shanghai = [{
                "data":
                    {
                        "city": "上海",
                        "key": "xxxxxxxx"
                    }
        },
]
# 北京的参数
test_beijing = [{
    "data":
        {
            "city": "北京",
            "key": "xxxxxxx"
        }
}]
def test_01(data):
    '''线下数据'''
    url = 'http://apis.juhe.cn/simpleWeather/query'
    r = requests.post(url, **data)
    print(r.text)

编写完成后,我们直接验证命令行传入不同参数,实现了动态参数化的内容。如果没有传入参数的话,系统会出现报错的。

图片

图片

总结

小编通过两种方法介绍了pytest_generate_tests的使用方法和一般的使用场景。

当然该函数肯定不仅仅只有这两种方法来使用,具体的使用方法可以根据对应的需求或者项目进行来完成,不同的需求不同的使用方法,如果有更好的使用方法可以下方留言,大家一起沟通交流。感谢您的阅读,希望本篇文章可以给您带来帮助。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【保证100%免费】
在这里插入图片描述

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值