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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 前言本文主要分享做简单的UI自动化测试简介、为何要做UI自动化测试、什么情况下适合做UI自动化测试以及其他的心得体会,希望能给各位同行带来思想上的碰撞。1、about自动化测试定义:把人为驱动的测试转化为机器执行的一种过程,重点在于持续集成这个概念;优势:节约人力和时间成本;测试金字塔:如上图所示,敏捷大师Mike Cohn提出该概念,然后由Martin Fowler大师在此基础上提出了测试分层概念,以区别于传统的自动化测试。2、自动化测试分层单元自动化测试(数据处理层):指对软件中最小的可测试单元进行检查和验证,一般需要借助单元测试框架,如java的Junit、TestNG,python的u...
            0 0 1364
            分享
          • 在软件测试工作中,为充分利用现有的时间和资源条件,提高测试效率和测试充分性,当前有多种方法辅助测试人员完成测试工作,推进项目进度,其中最普遍的莫过于白盒测试和黑盒测试,白盒测试和黑盒测试的概念和常用方法在已有理论研究中都有充分的论述,但是具体应用场景则需要测试人员根据测试任务特征和时间安排合理选用。作为一名非计算机科班出身的技术小白,两年有余的业务验收测试和系统功能测试收效明显,从最开始只能看着需求和业务规则,结合个人感觉盲写案例,到现在已经可以根据项目特征和业务场景,混搭等价类划分、边界值分析和逻辑覆盖、基本路径各种方法写案例做测试。基于个人工作经历和测试经验,以下对白盒测试、黑盒测试和灰盒...
            0 1 3391
            分享
          • 获取到一个上传项目信息的接口1)需求请求签名2)调用同一接口间隔时间不能小于1秒测试步骤1)模拟实际用户,使用阶梯型线程加压进行模拟,这里使用的是阶梯式加压 jp@gc-Stepping Thread Group (deprecated)2)添加用户参数组件3)添加JSR223取样器获取接口需要的请求签名信息JSR223取样器允许执行JSR223脚本代码用于创建/更新所需的某些变量,相比于BeanShell 取样器,JSR223取样器+groovy脚本具有可大大提高性能的功能(编译),同时支持更多的脚本语言下面是获取请求签名代码import hashlib import t...
            0 0 632
            分享
          • 在我们日常测试app或者小程序的时候,经常要遇到抓包的情况,我们常用的抓包工具是fiddler或者charles,这两个工具抓http类型的包还好,但是抓https类型的日志是需要root手机的,现在的真机不是开发者是不好root的,那么这个时候模拟器就可以上场啦。做模拟器的有很多品牌,我最习惯也最常用的是夜神模拟器(雷电模拟器不太好用)首先,模拟器可以设置手机。型号,可以设置性能,屏幕尺寸等基本参数,方便页面展示,这个对于ui方面的测试有一定的帮助,可以看下页面有没有明显的拉伸或者重叠等。也可以在模拟器上面跑关于app的页面自动化这些,也是非常方便调试的,跑不通或者有报错的地方可以直接修改。...
            1 1 10627
            分享
          • Bug定位要求:基本要求:定位出bug是前端bug还是后端bug更高要求:bug所属模块、bug的代码级别(不要求)Bug定位的价值:找到BUG的本质(找到必现路径)提升开发修复BUG的效率提升自身的逻辑思维与技术能力Bug定位的时间安排:优先需要进行所有测试用例的执行,找到bug,并提交bug在不耽误执行进度的前提下,可以花费时间来尽可能定位出bugBug定位的技巧:1)逻辑分析分析所有可能,逐个排查找到最短复现路径例如:玩CF游戏,从高处落下,没有掉血的情况---bug定位:可能因素逐一列出:姿势、地势、高度...针对可能因素逐一进行分析,每次控制变量,只改变其中一个因素最终确定出影响因素...
            0 0 745
            分享
      • 51testing软件测试圈微信