自动化数据驱动?最全接口自动化测试yaml数据驱动实战,看这一篇就够了

news2024/11/19 16:48:35

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

我们在做自动化测试的时候,通常会把配置信息和测试数据存储到特定的文件中,以实现数据和脚本的分离,从而提高代码的易读性和可维护性,便于后期优化。

而配置文件的形式更是多种多样,比如:ini、yaml、json、toml、py、xml、properties 等。

Python接口自动化测试:https://www.bilibili.com/video/BV16G411x76E/

YAML是一种轻量级的文本格式,可以用于存储结构化数据,非常适合用作测试数据。

在使用YAML数据驱动进行自动化测试时,通常需要准备一个或多个YAML文件,其中包含了测试用例的数据和预期结果。测试脚本会读取这些文件,并根据文件中的数据来执行对应的测试步骤,然后验证实际结果与预期结果是否一致。

下面我们就来详探接口自动化测试中的 YAML 数据驱动

1、什么是 YAML

YAML:YAML Ain’t a Markup Language,翻译过来就是YAML 不是一种标记语言。

它是一种以数据为中心的标记语言,比 XML 和 JSON 更适合作为配置文件。

YAML 的配置文件后缀为.yml 或.yaml,如:caituotuo.yml 或 caituotuo.yaml。

YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲等。

2、YAML 语法

1)基本语法
使用缩进表示层级关系;
缩进不允许使用 tab,只允许空格(官方说法不允许使用 tab,当然如果你使用 tab 在某些地方也是可以的,例如在 PyCharm 软件上);
缩进的空格数不重要,只要相同层级的元素左对齐即可;
大小写敏感;
前面加上 #表示注释;

req:
  username: xxxxxx # 这是姓名
  gender: Boy
  ip: ******
  blog: www.xxxxxx.com
res:
  status: 1
  code: 200

2)数据类型
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值,又称字面量

纯量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、Null、日期等,纯量直接写在键值对的 value 中即可。

字符串:
默认情况下字符串是不需要使用单引号或双引号的

username: 张三

当然使用双引号或者单引号包裹字符也是可以的

username: 'Hello world 张三'
username: "Hello world 张三"

字符串可以拆成多行,每一行会被转化成一个空格

# 字符串可以拆成多行,每一行会被转化成一个空格 '测试 张三'
username3: 测试
  张三

布尔值:

boolean:
  - TRUE  #true,True都可以
  - FALSE  #false,False都可以
  
# {'boolean': [True, False]}

数字:

float:
  - 3.14
  - 6.8523015e+5  #可以使用科学计数法
int:
  - 123
  - 0b1010_0111_0100_1010_1110    #二进制表示
  
# {'float': [3.14, 685230.15], 'int': [123, 685230]}

Null:

null:
  nodeName: 'node'
  parent: ~  #使用~表示null
  parent2: None  #使用None表示null
  parent3: null  #使用null表示null
  
# {None: {'nodeName': 'node', 'parent': None, 'parent2': 'None', 'parent3': None}}

时间和日期:

date:
  - 2023-04-18    #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
  - 2023-04-18T15:09:30+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
  
# {'date': [datetime.date(2023, 4, 18)], 'datetime': [datetime.datetime(2023, 4, 18, 15, 9, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))]}

对象
使用 key:[空格]value 的形式表示一对键值对(空格不能省略),例如:blog: caituotuo.top。

行内写法:

key: {key1: value1, key2: value2, ...}

普通写法,使用缩进表示对象与属性的层级关系:

key: 
    child-key: value
    child-key2: value2

数组
以 - 开头的行表示构成一个数组。

普通写法:

name:
    - 测试
    - 张三
    -

YAML 支持多维数组,可以使用行内表示:

key: [value1, value2, ...]

数据结构的子成员是一个数组,则可以在该项下面缩进一个空格:

username:
      -
        - 测试张三
        - 张三
        --
        - A
        - B
        - C
        
# {'username': [['测试张三', '张三', '张'], ['A', 'B', 'C']]}

相对复杂的例子:

companies 属性是一个数组,每一个数组元素又是由 id、name、price 三个属性构成

companies:
    -
        id: 1
        name: zhangshan
        price: 300W
    -
        id: 2
        name: 测试张三
        price: 500W
       
# {'companies': [{'id': 1, 'name': 'zhangshan', 'price': '300W'}, {'id': 2, 'name': '测试张三', 'price': '500W'}]}

数组也可以使用 flow 流式的方式表示:

companies2: [ { id: 1,name: zhangshan,price: 300W },{ id: 2,name: 测试张三,price: 500W } ]

复合结构
以上三种数据结构可以任意组合使用,以实现不同的用户需求,例如:

platform:
  - A1
  - A2
  - A3
sites:
  A1: 测试张三
  A2: 测试李四
  A3: xxxxxx.com
  
# {'platform': ['A1', 'A2', 'A3'], 'sites': {'A1': '测试张三', 'A2': '测试李四', 'A3': 'xxxxxx.com'}

3、引用

& 锚点和 * 别名,可以用来引用。

举个例子:
& 用来建立锚点 defaults,<< 表示合并到当前数据,* 用来引用锚点

defaults: &defaults
  adapter: postgres
  host: localhost

development:
  database: myapp_development
  <<: *defaults

test:
  database: myapp_test
  <<: *defaults

等价于:

defaults:
  adapter: postgres
  host: localhost

development:
  database: myapp_development
  adapter: postgres
  host: localhost

test:
  database: myapp_test
  adapter: postgres
  host: localhost

4、组织结构

一个 YAML 文件可以由一个或多个文档组成,文档之间使用 — 作为分隔符,且整个文档相互独立,互不干扰,如果 YAML 文件只包含一个文档,则 — 分隔符可以省略。

---
website:
  name: 测试张三
  url: xxxxxx.com
---
website: { name: 测试张三,url: www.xxxxxx.com }
---
A1: 测试张三
---
A2: 测试张三
f7 = "./files/多文档.yml"
with open(f7, "r", encoding="UTF-8") as f:
    content = yaml.safe_load_all(f)
    for i in content:
        print(i)

5、实战

封装思路
将 YAML 相关操作封装成 CommonUtil 公共模块,之后直接引入调用即可。

相关功能:
读取 yaml 文件数据;
将 yaml 数据转换成 json 格式;
可以动态设置参数;

这里要说一下动态设置参数
在自动化测试中,肯定不能把所有的参数都写死,因此就会用到参数化,例如:提取前一个接口的返回值作为后一个接口的入参,这里通过 Python 中的 Template 模块进行动态参数的设置

yaml 文件中通过 $变量名的形式设置变量

username: $username

给变量附上具体的值

with open(yaml_path, "r", encoding="UTF-8") as f:
	text = f.read()
# Template(text).safe_substitute(key_value)
Template(text).safe_substitute({"username": "测试张三"}) # username为变量名

完整代码

import os
from string import Template
import yaml


class YamlUtil:
    @staticmethod
    def yaml_util(yaml_path, key_value=None):
        """
        读取yml文件 设置动态变量
        :param yaml_path: 文件路径
        :param key_value: 动态变量 如:{"username": "测试张三"} yaml中的变量:$username
        :return:
        """
        try:
            with open(yaml_path, "r", encoding="UTF-8") as f:
                text = f.read()
                if key_value is not None:
                    re = Template(text).safe_substitute(key_value)
                    json_data = yaml.safe_load(re)
                else:
                    json_data = yaml.safe_load(text)
            return json_data
        except FileNotFoundError:
            raise FileNotFoundError("文件不存在")
        except Exception:
            raise Exception("未知异常")

    @staticmethod
    def multiple(yaml_path):
        """
        多文档
        :param yaml_path: yaml文件路径
        :return: list
        """
        json_data = []
        try:
            with open(yaml_path, "r", encoding="UTF-8") as f:
                content = yaml.safe_load_all(f)
                for i in content:
                    json_data.append(i)
            return json_data
        except FileNotFoundError:
            raise FileNotFoundError("文件不存在")
        except Exception:
            raise Exception("未知异常")


if __name__ == '__main__':
    f1 = "./files/初体验.yml"
    print(YamlUtil().yaml_util(f1))

    f2 = "./files/纯量.yml"
    print(YamlUtil().yaml_util(f2))

    f3 = "./files/数组.yml"
    print(YamlUtil().yaml_util(f3))

    f4 = "./files/复合结构.yml"
    print(YamlUtil().yaml_util(f4))

    f5 = "./files/引用.yml"
    print(YamlUtil().yaml_util(f5))

    f6 = "./files/参数化.yml"
    print(YamlUtil().yaml_util(f6, {"username": "测试张三"}))

    f7 = "./files/多文档.yml"
    for i in YamlUtil().multiple(f7):
        print(i)
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

奋斗是人生的必由之路,不经历风雨怎能见彩虹。无论前方的路有多么崎岖,只要坚定信念,努力拼搏,成功就不再遥远。

世上没有绝境,只有不肯努力奋斗的人。每个人都有潜力和机会去创造自己的未来,只要勇于追梦、坚持不懈,成功就在向你招手。

成功需要勇气、决心和毅力。当你出发去追逐自己的梦想时,一定会遭遇挫折与困难。但只要你不屈不挠,积极面对,就可以战胜一切困难,达成心中所想。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS学习第十九节——TF静态坐标变换

1.坐标msg消息 订阅发布模型中数据载体 msg 是一个重要实现&#xff0c;首先需要了解一下&#xff0c;在坐标转换实现中常用的 msg:geometry_msgs/TransformStamped和geometry_msgs/PointStamped 前者用于传输坐标系相关位置信息&#xff0c;后者用于传输某个坐标系内坐标点的…

js面试题

在全局作用域下声明了一个变量 arr, 它的初始值是一个空数组 第二段代码&#xff0c;循环计数器变量i的初始值为0&#xff0c;循环条件是i的值小于2&#xff0c; 也就是说当i的值为0或者1时&#xff0c; 循环条件才能成立 才能够进入到循环体 当i的值为2时循环条件不成立&…

ConcurrentLinkedQueue

唯一一个使用cas实现的线程安全并发效率高的集合。 一、为什么叫松散队列&#xff1f; 链表是松散的&#xff0c;链表节点并不都是有效的&#xff0c;允许存在无效节点valnull&#xff0c;但是只有最后一个节点才能nextnull 为什么线程安全需要把链表做成松散的。就是因为入队…

蓝精灵协会 (The Smurfs‘ Society) 宣布与著名艺术家展开一系列的合作,打造传奇 PFP 系列

4 月 18 日&#xff0c;The Smurfs Society 将推出第一个由 Smurfs 品牌支持的官方 PFP 系列。该系列建立在链上游戏的基础之上&#xff0c;该游戏聚集了超过 85,000 名玩家&#xff0c;并在设计、创意和与著名艺术家的合作方面设立了新标准。 而最近&#xff0c;蓝精灵官方&am…

2023-04-21 学习记录--C/C++-实现升序降序(选择法)

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、选择法 —— 升序 ⭐️ &#xff08;一&#xff09;、思路 从左到右&#xff0c;除最后一个数 依次作为 “当前数” 与 其右…

STM32F4_模数转换器(ADC)详解

目录 1. ADC是什么 2. ADC主要特性 3. ADC框图 3.1 ADC开关控制 3.2 ADC时钟 3.3 通道选择 3.4 单次转换模式和连续转换模式 3.5 时序图 3.6 模拟看门狗 4 温度传感器 5. ADC中断 6. ADC初始化结构体 6.1 ADC相关实验配置 7. 相关寄存器 7.1 ADC控制寄存器&…

Deep Neural Network for YouTube Recommendation论文精读

这篇论文 Deep Neural Networks for YouTube Recommendations 是google的YouTube团队在推荐系统上DNN方面的尝试&#xff0c;发表在16年9月的RecSys会议。本文所介绍的YouTube的推荐系统主要包括Deep Candidate Generation model和Deep Ranking model两个部分&#xff1a;Deep …

AWS EC2使用过程总结

步骤1&#xff1a;开通AWS账号 需要一个邮箱、一个信用卡账号&#xff1b;有第一年的免费试用&#xff0c;EC2每个月免费试用750小时&#xff1b;注册完成后&#xff0c;得到实例管理平台&#xff1a; 步骤2&#xff1a;开通EC2实例 步骤3&#xff1a;开通网关和安全组&…

【Python小技巧】一步到位升级到pandas 2.0.0正式版

文章目录 前言一、Pandas是什么&#xff1f;二、Pandas 2.0.0的升级特性三、升级安装Pandas 2.0.0正式版总结 前言 工欲善其事必先利其器&#xff0c;大数据、AI时代&#xff0c;目前Python 最新版本是3.11 &#xff0c;而Pandas也刚刚完成大升级&#xff0c;进入 2.0.0时代。…

ChatGPT 中的人类反馈强化学习 (RLHF) 实战

目录 1 前言2 人类反馈强化学习 (RLHF)2.1 奖励模型 (RM)2.2 近端策略优化算法 (PPO) 3 总结4 参考 团队博客: CSDN AI小组 相关阅读 ChatGPT 简介大语言模型浅探一关于 ChatGPT 必看的 10 篇论文从 ELMo 到 ChatGPT&#xff1a;历数 NLP 近 5 年必看大模型 1 前言 在当今数字…

整型、浮点型与字符串相互转换(C/C++)

文章目录 1. 整型、浮点型 -> 字符串2. 字符串 -> 整型3.字符串 -> 浮点型 1. 整型、浮点型 -> 字符串 A. 函数原型&#xff1a;   B. 分析  通常整型转换一般都是准确的&#xff0c;但是浮点型进行转换的时候因为精度问题有效数字位可能会出现一些偏差.   C. …

pushmall推贴共享电商2023年4月计划

Pushmall推贴共享电商2023年4月计划 2023年 二月份优化完成 1、商圈套餐卡&#xff1a;商品、优惠券、活动优化&#xff1b; 2、会员预充值一卡通&#xff1a;指定商家会员卡充值优惠&#xff1b; 3、商家海报&#xff1a;店铺海报、商品海报、商圈卡海报优化。 4、首页重新布…

SpringBoot(5)整合缓存

Springboot整合缓存 缓存SpringBoot内置缓存整合Ehcache缓存数据淘汰策略整合Memcached缓存SpringBoot整合jetcache缓存纯远程方案纯本地方案本地远程方案方法缓存远程方案的数据同步数据报表 SpringBoot整合j2cache缓存 缓存 企业级应用主要作用是信息处理&#xff0c;当需要…

【STM32】基础知识 第六课 内核 架构

【STM32】基础知识 第六课 内核 & 架构 F1 系统架构F4 系统架构F7 系统架构H7 系统架构 F1 系统架构 4 个主动单元 4 个被动单元 主动单元被动单元Cortex M3 内核 DCode 总线 (D-Bus)内部 FLASHCortex M3 内核系统总线 (S-Bus)内部 SRAM通用 DMA1FSMC通用 DMA2AHB 到 AP…

PCA主成分分析 从零理解

一、PCA的目的 假设我们有一堆观测到的数据。 数据的格式是observation*feature&#xff0c;每一行是一个观测&#xff08;也就是图里的一个点&#xff09;&#xff0c;每一列是这个数据的某个特征&#xff08;即一个维度&#xff09;。 假设数据矩阵是A&#xff0c;有m个观测…

辉煌优配|刚刚!“中字头”再度爆发

今天早盘&#xff0c;A股全体持续震动收拾&#xff0c;上证50指数跌破2700点整数关口&#xff0c;沪深300亦失守4100点。 盘面上&#xff0c;国防军工、种业、中字头、电气设备等板块涨幅居前&#xff0c;前期抢手的人工智能、半导体、信创、软件服务等板块全线回调。北上资金净…

零售店铺管理系统有哪些作用?选择零售管理系统要注意这4大问题

零售店铺管理系统主要是帮助实体零售店提高销售效率、降低成本、提升服务质量和客户满意度。 对于零售店铺来说&#xff0c;选择一款合适的零售店铺管理系统&#xff0c;可以有效提高其管理效率和精准度&#xff0c;同时也有利于自家店铺在市场竞争中占据优势。 一、零售店铺管…

Keil系列教程02_新建基础软件工程

1写在前面 目前Keil的四款产品&#xff08;软件&#xff09;&#xff1a;MDK-ARM、C51、C251、C166&#xff0c;在用法上极为相似&#xff0c;包括本文讲述的新建软件工程。 本文以目前&#xff08;2018年10月&#xff09;最新Keil MDK-ARM V5.26、STM32F103标准外设库为例&am…

晨控CK-FR208-PN与西门子PLC工业Profinet协议通讯指南

晨控CK-FR208-PN是一款支持标准工业Profinet协议的多通道工业RFID读写器&#xff0c;读卡器工作频率为13.56MHZ&#xff0c;支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读写。 读卡器同时支持标准工业通讯协议Profinet&#xff0c;方便用户通集成到PLC等…

电子模块|外控集成 LED 光源 WS2812模块---软件驱动stm32版

电子模块|外控集成 LED 光源 WS2812模块---软件驱动stm32版 模块简介单线归零码通讯方式24bit 数据结构 stm32 驱动 模块简介 WS2812是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同&#xff0c;每个元件即为一个像素点。像素点内部包含了智…