• 0
  • 0
分享
  • 这个Pytest函数,轻松实现动态参数化——软件测试圈
  • 曼倩诙谐 2023-10-08 10:27:45 字数 2965 阅读 1416 收藏 0

  前言

  无论什么自动化,部分测试用例均会运用到参数化,参数化可以帮助我们覆盖更多的测试用例,减少重复代码逻辑,然而自动化中也有多种实现参数化的方法,比如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)

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

1-1.png

  方法二

  通过上面的案例,小伙伴们可能懂了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)

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

1-2.png1-3.png

  总结

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

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


作者:测试安静    

来源:http://www.51testing.com/html/42/n-7797842.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 心里有数,也要留一手,和盘托出,不是一场好戏。底牌哪能随便乱漏?我们做人做事啊,千万要记得留有余地,留有余粮,以备不时之需。留有情面,两人之间就有了润滑的空间。留有神秘,两人之间就有了空间想象。留有距离,两人之间就有了美。留有底牌,两人之间就有了互相学习的机会。看透了,就没意思了。戏曲,歌剧,一出好戏,总是分好几出,好几场,好几段。有生旦净末丑,有咏叹调,有慢板,有快板……没有了这样的曲折蜿蜒,起伏跌宕,哪有那么美妙的歌曲?印象深刻的歌剧?适度,是人生智慧之一,积少成多,是客观现实之一,人们对自清醒地认识,就是知道自己不是无所不能,知道自己不是啥都能干,就是知道自己的局限性和渺小,狂妄份子貌似...
            1 1 995
            分享
          • 1. 需求符合度测试各级菜单名称显示是否按照需求说明书规定的设计,并且没有遗漏和多余;各级菜单所完成的功能是否按照需求说明书规定的设计,并且没有遗漏和多余;各级菜单的操作顺序和操作方式是否按照需求说明书规定的设计,并且正确。2. 页面测试页面元素对齐方式是否符合规范的要求,或者操作方便性文字的字体,标点符号是否统一有误错别字和乱码焦点是否定位在默认操作项上按TAB键是否有正常切换焦点(自上而下,自左而右)标题是否正确无误,关注以下部分:①是否和菜单一级;②同一个case的多个页面标题是否一致时间格式是否正确(特别是海外版,如果时间输入栏有掩码,要检查掩码的正确性)是否正确支持常用的显示比例: ...
            0 0 1673
            分享
          • 读者提问:一句话需求怎么测 ?阿常回答:帮产品做需求实例化1、什么是需求实例化2、为何做需求实例化3、怎么做需求实例化一、什么是需求实例化需求实例化,即用实例来说明需求。实例化需求的核心概念:1、用例子来分析和澄清需求。2、这些例子随后会转化为测试用例。3、最后再通过测试验证需求。二、为何做需求实例化哎,这还不是被逼的嘛!需求只说一句话,既没有背景也没有上下文,这句话到底想传达什么意思,就不是很明确了。用实例的方式说明需求,使得产研测三方能够进行有效的交流沟通,使得大家对于本条需求要交付哪些东西能够快速达成共识。三、怎么做需求实例化一)澄清价值1、澄清业务背景2、系统的上下文3、澄清...
            0 0 1002
            分享
          • 接着测试设计的思路来讲讲一、如何运用测试设计的方法   1、测试设计方法有很多,主要有以下几种:    2、不同阶段如何运用的测试设计方法   在项目或是产品的测试过程中,在不同的测试阶段,存在不同的测试方法。以开发阶段划分,测试过程可以分为单元测试、集成测试、系统测试和验收测试。Ø 单元测试     单元测试是对程序模块进行正确性的检验。如果单元测试目标是达到100%判定覆盖率,那测试设计方法就要采用判定逻辑的逻辑覆盖方法,通过分析和设计,达到...
            1 2 1486
            分享
          •   前言  在这个行业,到了35+还没有干到高级测试开发或者架构师的水平,那就真是的不好干了,因为这个年龄,面对的竞争不是20多岁小年轻可以比的。  如果你25岁了,中间有10年的时间,保持敬畏心,持续学习,10年时间你觉得自己可以达到什么程度的大佬?  但是话说回来,你也一定听说过做点点点做了五六年,最后找不到工作,扔下一句,测试行业就是吃青春饭的,这上哪说理去?  简单来说,就是年龄上去了,但是能力没有上去。  你不是具备10年工作经验的测试工程师,你只不过是一年的工作经验用了10年。  我以以下三点进行一个深度的解析:  1,谈谈二十五岁做软件测试怎么样?  2,软件测试前景怎么样?  ...
            0 0 986
            分享
      • 51testing软件测试圈微信