自动化数据驱动?最全接口自动化测试yaml数据驱动实战

 

前言

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

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

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 软件上);
缩进的空格数不重要,只要相同层级的元素左对齐即可;
大小写敏感;
前面加上 #表示注释;

  1. req:

  2. username: xxxxxx # 这是姓名

  3. gender: Boy

  4. ip: ******

  5. blog: www.xxxxxx.com

  6. res:

  7. status: 1

  8. code: 200

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

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

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

username: 张三
  • 1

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

  1. username: 'Hello world 张三'

  2. username: "Hello world 张三"

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

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

  2. username3: 测试

  3. 张三

布尔值:

  1. boolean:

  2. - TRUE #true,True都可以

  3. - FALSE #false,False都可以

  4. # {'boolean': [True, False]}

数字:

  1. float:

  2. - 3.14

  3. - 6.8523015e+5 #可以使用科学计数法

  4. int:

  5. - 123

  6. - 0b1010_0111_0100_1010_1110 #二进制表示

  7. # {'float': [3.14, 685230.15], 'int': [123, 685230]}

Null:

  1. null:

  2. nodeName: 'node'

  3. parent: ~ #使用~表示null

  4. parent2: None #使用None表示null

  5. parent3: null #使用null表示null

  6. # {None: {'nodeName': 'node', 'parent': None, 'parent2': 'None', 'parent3': None}}

时间和日期:

 
  1. date:

  2. - 2023-04-18 #日期必须使用ISO 8601格式,即yyyy-MM-dd

  3. datetime:

  4. - 2023-04-18T15:09:30+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

  5. # {'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, ...}

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

  1. key:

  2. child-key: value

  3. child-key2: value2

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

普通写法:

  1. name:

  2. - 测试

  3. - 张三

  4. - 三

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

key: [value1, value2, ...]

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

  1. username:

  2. -

  3. - 测试张三

  4. - 张三

  5. - 张

  6. -

  7. - A

  8. - B

  9. - C

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

相对复杂的例子:

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

  1. companies:

  2. -

  3. id: 1

  4. name: zhangshan

  5. price: 300W

  6. -

  7. id: 2

  8. name: 测试张三

  9. price: 500W

  10. # {'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 } ]

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

  1. platform:

  2. - A1

  3. - A2

  4. - A3

  5. sites:

  6. A1: 测试张三

  7. A2: 测试李四

  8. A3: xxxxxx.com

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

3、引用

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

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

  1. defaults: &defaults

  2. adapter: postgres

  3. host: localhost

  4. development:

  5. database: myapp_development

  6. <<: *defaults

  7. test:

  8. database: myapp_test

  9. <<: *defaults

等价于:

  1. defaults:

  2. adapter: postgres

  3. host: localhost

  4. development:

  5. database: myapp_development

  6. adapter: postgres

  7. host: localhost

  8. test:

  9. database: myapp_test

  10. adapter: postgres

  11. host: localhost

4、组织结构

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

  1. ---

  2. website:

  3. name: 测试张三

  4. url: xxxxxx.com

  5. ---

  6. website: { name: 测试张三,url: www.xxxxxx.com }

  7. ---

  8. A1: 测试张三

  9. ---

  10. A2: 测试张三

  11. f7 = "./files/多文档.yml"

  12. with open(f7, "r", encoding="UTF-8") as f:

  13. content = yaml.safe_load_all(f)

  14. for i in content:

  15. print(i)

5、实战

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

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

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

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

username: $username

给变量附上具体的值

  1. with open(yaml_path, "r", encoding="UTF-8") as f:

  2. text = f.read()

  3. # Template(text).safe_substitute(key_value)

  4. Template(text).safe_substitute({"username": "测试张三"}) # username为变量名

完整代码

  1. import os

  2. from string import Template

  3. import yaml

  4. class YamlUtil:

  5. @staticmethod

  6. def yaml_util(yaml_path, key_value=None):

  7. """

  8. 读取yml文件 设置动态变量

  9. :param yaml_path: 文件路径

  10. :param key_value: 动态变量 如:{"username": "测试张三"} yaml中的变量:$username

  11. :return:

  12. """

  13. try:

  14. with open(yaml_path, "r", encoding="UTF-8") as f:

  15. text = f.read()

  16. if key_value is not None:

  17. re = Template(text).safe_substitute(key_value)

  18. json_data = yaml.safe_load(re)

  19. else:

  20. json_data = yaml.safe_load(text)

  21. return json_data

  22. except FileNotFoundError:

  23. raise FileNotFoundError("文件不存在")

  24. except Exception:

  25. raise Exception("未知异常")

  26. @staticmethod

  27. def multiple(yaml_path):

  28. """

  29. 多文档

  30. :param yaml_path: yaml文件路径

  31. :return: list

  32. """

  33. json_data = []

  34. try:

  35. with open(yaml_path, "r", encoding="UTF-8") as f:

  36. content = yaml.safe_load_all(f)

  37. for i in content:

  38. json_data.append(i)

  39. return json_data

  40. except FileNotFoundError:

  41. raise FileNotFoundError("文件不存在")

  42. except Exception:

  43. raise Exception("未知异常")

  44. if __name__ == '__main__':

  45. f1 = "./files/初体验.yml"

  46. print(YamlUtil().yaml_util(f1))

  47. f2 = "./files/纯量.yml"

  48. print(YamlUtil().yaml_util(f2))

  49. f3 = "./files/数组.yml"

  50. print(YamlUtil().yaml_util(f3))

  51. f4 = "./files/复合结构.yml"

  52. print(YamlUtil().yaml_util(f4))

  53. f5 = "./files/引用.yml"

  54. print(YamlUtil().yaml_util(f5))

  55. f6 = "./files/参数化.yml"

  56. print(YamlUtil().yaml_util(f6, {"username": "测试张三"}))

  57. f7 = "./files/多文档.yml"

  58. for i in YamlUtil().multiple(f7):

  59. print(i)

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

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

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue项目实践:使用滚动下拉分页优化大数据展示页面【通过防抖加标志位进行方案优化】

Vue项目实践&#xff1a;使用滚动下拉分页优化大数据展示页面 前言 传统的分页机制通过点击页码来加载更多内容&#xff0c;虽然直观&#xff0c;但在处理大量数据时可能会导致用户体验不佳。相比之下&#xff0c;滚动下拉分页能够在用户滚动到页面底部时自动加载更多内容&…

使用difflib实现文件差异比较用html显示

1.默认方式&#xff0c;其中加入文本过长&#xff0c;需要换行&#xff0c;因此做 contenthtml_output.replace(</style>,table.diff td {word-wrap: break-word;white-space: pre-wrap;max-width: 100%;}</style>)&#xff0c;添加换行操作 ps&#xff1a;当前te…

人工智能和机器学习这两个概念有什么区别?

什么是人工智能&#xff1f; 先来说下人工智能&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI&#xff0c;通俗来讲就是用机器去做在过去只有人能做的事。 人工智能最早是由图灵提出的&#xff0c;在1950年&#xff0c;计算机…

Syncovery:跨平台高效文件备份与同步的得力助手

在数字化时代&#xff0c;数据安全与文件同步已成为个人及企业不可或缺的需求。Syncovery作为一款专为Mac和Windows用户设计的文件备份和同步工具&#xff0c;凭借其高效、安全和易用的特点&#xff0c;赢得了广泛赞誉。 一、强大备份功能 Syncovery支持多种备份方案和数据格…

AI宣传文案软件有哪些?5款AI软件推荐

AI宣传文案软件有哪些&#xff1f;AI宣传文案软件在现代营销和创意产业中扮演着越来越重要的角色&#xff0c;它们凭借先进的自然语言处理、机器学习和深度学习技术&#xff0c;不仅解放了创作者的双手&#xff0c;还大大提升了文案的生成效率和质量。这些软件能够精准捕捉用户…

防火墙安全管理

大多数企业通过互联网传输关键数据&#xff0c;因此部署适当的网络安全措施是必要的&#xff0c;拥有足够的网络安全措施可以为网络基础设施提供大量的保护&#xff0c;防止黑客、恶意用户、病毒攻击和数据盗窃。 网络安全结合了多层保护来限制恶意用户&#xff0c;并仅允许授…

分布式事务的八种方案解析(1)

针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知等方案&#xff0c;以下总结8 种常见的解决方案&#xff0c;帮助大家在实际的分布式系统中更好地运用事务。 1.2PC 二阶段提交协议&#xff08;Two-phase commit protocol&#xff09;&…

微信小程序毕业设计-实验室管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

(三十九)Vue之集中式的状态管理机制Vuex

目录 概念vuex的核心概念State&#xff08;状态&#xff09;Getters&#xff08;获取器&#xff09;Mutations&#xff08;突变&#xff09;Actions&#xff08;动作&#xff09; 搭建vuex环境基本使用getters的使用 上一篇&#xff1a;&#xff08;三十八&#xff09;Vue之插槽…

安装台式电脑网卡驱动

安装电脑网卡驱动 1. 概述2. 具体方法2.1 先确定主板型号2.2 详细操作步骤如下2.2.1 方法一2.2.2 方法二2.2 主流主板官网地址 结束语 1. 概述 遇到重装系统后、或者遇到网卡驱动出现问题没有网络时&#xff0c;当不知道怎么办时&#xff0c;以下的方法&#xff0c;可以作为一…

工业烤箱设备厂家:专业制造,助力工业发展

随着现代工业的不断发展&#xff0c;工业烤箱设备在各个领域的应用越来越广泛。作为专业的工业烤箱设备厂家&#xff0c;我们致力于为客户提供高质量、高效率的烤箱设备&#xff0c;助力工业生产的顺利进行。 工业烤箱设备在工业生产中扮演着至关重要的角色。无论是电子、化工、…

微信小程序查分易如何使用?

期末马上到了&#xff0c;老师们又开始为发放成绩而头疼了&#xff0c;堆积如山的试卷&#xff0c;密密麻麻的分数&#xff0c;还有那些不断响起的家长电话&#xff0c;真是让人心烦。别担心&#xff0c;今天就让我来介绍一个让老师“偷懒”神器——查分易微信小程序 第一步&am…

Java多线程-StampedLock(原子读写锁)

StampedLock 是读写锁的实现&#xff0c;对比 ReentrantReadWriteLock 主要不同是该锁不允许重入&#xff0c;多了乐观读的功能&#xff0c;使用上会更加复杂一些&#xff0c;但是具有更好的性能表现。StampedLock 的状态由版本和读写锁持有计数组成。 获取锁方法返回一个邮戳&…

报名进行中 | ISCSLP2024 对话语音克隆挑战赛(CoVoC)

晴数智慧(Magic Data)联合西北工业大学音频语音与语言处理研究组(ASLPNPU)、新加坡资讯通讯研究院(I2R)、深圳大数据研究院(SRIBD)、香港中文大学(深圳)等多家单位在2024年中文口语语言处理国际会议(ISCSLP2024)上推出对话语音克隆挑战赛(Conversational Voice Clone Challenge…

【leetcode--同构字符串】

要求&#xff1a;判断两个字符串的形式是不是一致&#xff0c;即是不是AABC或者ABBBCC这种。 trick&#xff1a;使用set&#xff08;&#xff09;结合zip&#xff08;&#xff09;。 set&#xff08;&#xff09;用法&#xff1a;用于创建一个不包含重复元素的集合 zip&#…

FPGA+金融|硬件行情加速系统 打造极速交易场景

会议时间&#xff1a;2024年06月20日&#xff08;周四&#xff09;下午13:50 FPGA金融|硬件行情加速系统 打造极速交易场景_中科亿海微_芯有灵犀 智创未来

安装前端依赖node-sass报错

文章目录 问题1&#xff1a;node-sass报错问题2&#xff1a;node-gyp报错问题3&#xff1a;node-sass再次报错问题4&#xff1a;node-sass三次报错 问题1&#xff1a;node-sass报错 问题描述&#xff1a;经常会碰到一个新的项目安装依赖时&#xff0c;会报node-sass版本的问题…

《C++ Primer》导学系列:第 1 章 - 开始

1.1 编写一个简单的C程序 概述 本小节介绍了如何编写和运行一个简单的C程序&#xff0c;帮助初学者了解C程序的基本结构和编译运行过程。 编写第一个C程序 我们从一个简单的C程序开始&#xff0c;它的功能是在控制台输出 "Hello, World!"。这是学习任何编程语言的…

File及典型案例

File File对象表示一个路径&#xff0c;可以是文件的路径&#xff0c;也可以是文件夹的路径 这个路径可以是存在的&#xff0c;也允许不存在 常见的构造方法 图来自黑马程序员网课 package com.lazyGirl.filedemo;import java.io.File;public class Demo1 {public static vo…

easyexcel的简单使用(execl模板导出)

模板支持功能点 支持列表支持自定义头名称支持自定义fileName支持汇总 模板示例 操作 pom引入 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</version></dep…