首页 > 其他分享 >pytest + yaml 框架 -24.单个用例中参数化功能实现

pytest + yaml 框架 -24.单个用例中参数化功能实现

时间:2023-04-14 10:13:54浏览次数:41  
标签:24 username name parameters yaml 用例 参数 test

前言

早期版本参数化功能实现只支持在config 中全局的地方写parameters 关键字,只实现了基本的功能。
v1.2.1 版本对parameters 参数化功能做了进一步的细分,支持在case 用例中针对单个用例的参数化了。

parameters 参数化

用例参数化的实现,我设计了2种实现方式

参数化方式1:

  config:
     name: post示例
     fixtures: username, password
     parameters:
       - [test1, '123456']
       - [test2, '123456']

参数化方式2:

  config:
     name: post示例
     parameters:
       - {"username": "test1", "password": "123456"}
       - {"username": "test2", "password": "1234562"}

使用 fixtures 功能实现参数化

基本实现原理参考 pytest 框架的参数化实现

import pytest
@pytest.mark.parametrize("test_input,expected",
                         [ ["3+5", 8],
                           ["2+4", 6],
                           ["6 * 9", 42]
                         ])
def test_eval(test_input, expected):
    assert eval(test_input) == expected

在上面的用例中,只需要关注参数化的2个变量test_input, expected 也就是在测试用例中传的2个值,可以理解为用例的2个fixture参数
还需要关注测试数据,测试数据结构必须是list,里面是可以迭代的数据,因为有2个变量,所以每组数据是2个值。

在yaml文件中

  • 参数化需要的变量写到config的fixtures 位置
  • 参数化需要的数据写到 parameters

示例
test_params.yml

# 作者-上海悠悠 微信/QQ交流:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/

config:
  name: post示例
  fixtures: username, password
  parameters:
    - [test1, '123456']
    - [test2, '123456']

teststeps:
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: ${username}
      password: ${password}
  extract:
      url:  body.url
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$..username, '${username}']
    - eq: [body.json.username, '${username}']

运行yaml文件

pytest test_params.yml

会自动生成2个测试用例

parameters 实现参数化

第二种实现方式,可以不用在fixtures 中传变量,但是 parameters 测试数据必须是字典类型,从字典的 key 中动态读取变量名称
test_params_2.yml

# 作者-上海悠悠 微信/QQ交流:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/
config:
  name: post示例
  parameters:
    - {"username": "tes1", "password": "123456"}
    - {"username": "tes2", "password": "123456"}

teststeps:
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: ${username}
      password: ${password}
  extract:
      url:  body.url
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$..username, '${username}']
    - eq: [body.json.username, '${username}']

运行yaml文件

pytest test_params.yml

以上2种实现参数化方式效果是一样的

用例中添加参数化

config中添加参数化,只适合当前yaml 文件中只有一个用例的情况,如果yaml中有多个用例,会对每个用例都参数化了。
现在新的v1.2.1版本,可以支持针对单个用例的参数化实现

如下用例,会生成7个用例

config:
  name: post示例


teststeps:
  name: xx
  print: "xx"

teststeps2:
  name: xx
  fixtures: name
  parameters: [1, 2, 3]
  print: ${name}

test_2:
  name: yy
  print: "yy"

test_3:
  name: yy
  parameters:
    - {"x": 1, "y": 2}
    - {"x": 2, "y": 3}
  print: ${x}--${y}

如果 用例是包含有多个步骤的情况,那么参数化写到步骤中的第一个步骤即可(写到后面步骤无法识别)

config:
  name: post示例


test_steps:
-
  name: step1
  fixtures: name
  parameters: [1, 2, 3]
  print: ${name}
-
  name: step2
  print: "xx"


test_2:
-
  name: yy
  print: "yy"

test_3:
-
  name: yy
  parameters:
    - {"x": 1, "y": 2}
    - {"x": 2, "y": 3}
  print: ${x}--${y}

函数返回参数化数据

参数化的数据,也可以通过函数来获取数据源

conftest.py 文件

from pytest_yaml_yoyo import my_builtins


def params():
    """返回参数化需要的数据"""
    return [
        {"username": "tes1", "password": "123456"},
        {"username": "tes2", "password": "123456"}
    ]

my_builtins.params = params

test_parms.yml 文件内容

config:
  name: 参数化引用函数示例
  parameters: ${params()}

teststeps:
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: ${username}
      password: ${password}
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$..username, '${username}']
    - eq: [body.json.username, '${username}']

parameters 数据源必须是符合参数化的格式。

标签:24,username,name,parameters,yaml,用例,参数,test
From: https://www.cnblogs.com/yoyoketang/p/17317418.html

相关文章

  • BZOJ 2243 [SDOI2011] 染色 (树链剖分)
    题目地址:BZOJ2243普通的树链剖分,用线段树维护区间段数与最左边和最右边的颜色。然后当合并区间的时候判断一下左儿子的右端与右儿子的左端是否相同,若相同,则将和减去1.同样,在迭代求值的过程中,也要记录下上条链的最顶端的颜色。代码如下:#include<iostream>#include<strin......
  • HDU 2473 Junk-Mail Filter(并查集的删除操作)
    题目地址:HDU2473这题以前碰到过,没做出来。。现在又做了做,还是没做出来。。、、这题涉及到并查集的删除操作。想到了设一个虚节点,但是我把虚节点设为了要删除的点的父节点,一直是栈溢出,目测是无限递归了。看了看别人的做法,原来只要建一个映射就可以了,虚节点是作为的新的映射,每......
  • AP6608高效率1.2MHz 2-24V 2A升压转换IC
    FEATURES•Integrated80mΩPowerMOSFET•2Vto24VInputVoltage•1.2MHzFixedSwitchingFrequency•Internal4ASwitchCurrentLimit•AdjustableOutputVoltage•InternalCompensation•Upto28VOutputVoltage•AutomaticPulseFrequencyModulatio......
  • P2490 [SDOI2011]黑白棋
    题意:一个1*n的棋盘上有k个棋子,一半是黑一半是白,并且是白黑白黑白黑...白黑的形式,A每次最多可以将d个白棋子向右移动,B每次最多可以将d个黑棋子向左移动,不能不移动棋子,谁最后无法移动棋子谁就输了,A先手,问有多少种布局可以使得A获胜SolutionNim-K博弈+动态规划可以把棋子之间的间......
  • 第24届中国环博会丨计讯物联豪华新品首秀,邀您共见卓越
    2023年4月19日-23日,第24届中国环博会在上海新国际博览中心正式拉开帷幕。本届展会将荟集全球顶级污水处理、给水排水、固体废弃物处理、资源回收利用、大气污染治理、室内空气污染治理、场地修复、环境监测、环境服务业等环境污染治理领域的前沿技术与最新解决方案。  计讯......
  • 24-springcloud-config-1-配置中心
    配置中心:  用于解决服务配置管理问题;1、传统配置方式:配置信息分散到系统各个角落方式,配置文件或者在代码中;2、集中式配置中心:将应用系统中对配置信息的管理作为一个新的应用功能模块,进行集中统一管理,并且提供额外功能;3、分布式配置中心:在分布式、微服务架构中,独立的配置......
  • Deployment.yaml
    apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploynamespace:defaultspec:replicas:3selector:matchLabels:app:nginxminReadySeconds:5strategy:type:RollingUpdate#指定更新策略:RollingUpdate和RecreaterollingUpdate:......
  • Calling Circles UVA - 247
    如果两个人相互打电话(直接或间接),则说他们在同一个电话圈里。例如,a打给b,b打给c,c打给d,d打给a,则这4个人在同一个圈里;如果e打给f但f不打给e,则不能推出e和f在同一个电话圈里。输入n(n≤25)个人的m次电话,找出所有电话圈。人名只包含字母,不超过25个字符,且不重复 对于一个有向图,Flo......
  • abc247_f Cards 题解
    Cards题意有\(N\)张卡片,每张卡片上都写有两个数字,第\(i\)张卡片上的数字分别为\(P_i,Q_i\)。同时,\(P=(P_1,P_2,\dots,P_N)\)和\(Q=(Q_1,Q_2,\dots,Q_N)\)都是\((1,2,\dots,N)\)的全排列。我们需要在\(N\)张卡片中选出一些卡片,并且\(1,2,\dots,N......
  • 242.有效的字母异位词——学习笔记
    题目:给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。示例1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:false提示:1<=s.length,......