自动化测试基础——Pytest框架之YAML详解以及Parametrize数据驱动

文章目录

  • 一、YAML详解
    • 1.YAML作用
    • 2.YAML语法结构
    • 3.YAML数据类型
      • 3.1.对象
      • 3.2.数组
      • 3.3.标量
    • 4.YAML的引用
    • 5.YAML类型转换
  • 二、YAML的读写与清空
    • 1.YAML的读
    • 2.YAML的写
    • 3.YAML的清空
  • 三、pytest的parametrize简单数据驱动
  • 四、pytest的parametrize结合yaml实现数据驱动
  • 五、解决pytest + allure + yaml实现数据驱动生成测试报告及定制导致的页面丑格式陋问题
    • 1.问题描述
    • 2.解决方法

一、YAML详解


YAML是一个可读性高,用来表达数据序列化的格式。YAML是 “YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

YAML它能够和JSON数据相互转化,它本身也是有很多数据类型可以满足我们接口
的参数类型,扩展名可以是 .yml.yaml

1.YAML作用

  1. 全局配置文件:基础路径,数据库信息,账号信息,日志格式,报告名称等。
  2. 编写测试用例:接口自动化测试用例

2.YAML语法结构

  • 1.区分大小写(大小写敏感)

    Name: 张三
    name: 张三
    
  • 2.可以使用 # 作为注释(YAML仅支持单行注释)

    # 第一行注释
    Name: 张三
    # 第一行注释
    name: 张三
    
  • 3.使用缩进表示层级关系

    • 缩进只能使用 空格,不能用 Tab 制表符
    • 缩进的 空格数量 不重要,但是 同一层级的元素左侧必须对齐
    province: "湖南省"city1: "永州市"city2: "长沙市"area1: "雨花区"area2: "天心区"
    
    Three_stage_linkage:province:city:area: "雨花区"
    
  • 4.一个文件可以包含多个文件的内容

    • --- 三个破折号表示一份内容的开始
    • ... 三个小数点表示一份内容的结束,但并不是必需的
    ---
    # 第一份内容
    name: first
    ...---
    # 第二份内容
    name: second
    ...
  • 5.字符串一般默认可以不使用引号,必须时才使用

3.YAML数据类型

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

3.1.对象

  • 对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格

    例一(单个)

    key: value
    

    例二(多层嵌套)

    key:child-key1: value1child-key2: value2
    

    例三(流式风格语法)

    key: { child1: value1, child2: value2 }
    
  • 较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的key,配合一个冒号加一个空格代表一个 value:

    ?- complexkey1- complexkey2
    :- complexvalue1- complexvalue2
    

3.2.数组

  • - 开头的行表示构成一个数组:

    - A
    - B
    - C
    
    -- A- B- C
    
  • YAML支持多维数组,可以使用行内表示:

    key: [value1, value2, ...]
    
  • 支持多维数组,用缩进表示层级关系

    values:-- value1- value2-- value3- value4
    
  • 复合结构:数组和对象可以构成复合结构,例:

    languages:- Java- PHP- Python
    websites:YAML: yaml.orgPython: python.org
    

3.3.标量


标量:单个的、不可再分的值。属于YAML中最基本的数据类型

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期
#字符串
string:- 哈哈- 'Hello world'  #可以使用双引号或者单引号包裹特殊字符(当有特殊字符时:双引号不会被转义,其它的都会加一个转义符 \)- newlinenewline2    #字符串可以拆成多行,每一行会被转化成一个空格
#布尔值
boolean:- TRUE  #true,True都可以- FALSE  #false,False都可以
#整数
int:- 123- 0b1010_0111_0100_1010_1110    #二进制表示
#浮点数
float:- 3.14- 6.8523015e+5  #可以使用科学计数法
#Null
null:nodeName: 'node'parent: ~  #使用~表示null(null、Null 和 ~ 都可以表示空,不指定值默认也是空)
#时间
datetime:-  2018-02-17T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
#日期
date:- 2018-02-17    #日期必须使用ISO 8601格式,即yyyy-MM-dd
  • 字符串
    • 多行字符:字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格

      str: 这是一段多行字符串
      
    • 保留换行:使用竖线符 | 来表示该语法,每行的缩进和行尾空白都会被去掉,而额外的缩进会被保留

      lines: |我是第一行我是第二行我是吴彦祖我是第四行我是第五行
      
    • 折叠换行:使用右尖括号 > 来表示该语法,只有空白行才会被识别为换行,原来的换行符都会被转换成空格

      lines: >我是第一行我也是第一行我仍是第一行我依旧是第一行我是第二行这么巧我也是第二行
      

4.YAML的引用


为了避免重复的定义,YAML 提供了由锚点标签 & 和引用标签 * 组成的语法,利用这套语法可以快速引用相同的一些数据。

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

    defaults: &defaultsadapter:  postgreshost:     localhostdevelopment:database: myapp_development<<: *defaultstest:database: myapp_test<<: *defaults
    

    相当于:

    defaults:adapter:  postgreshost:     localhostdevelopment:database: myapp_developmentadapter:  postgreshost:     localhosttest:database: myapp_testadapter:  postgreshost:     localhost
    
  • & 用来建立锚点(defaults),<< 表示合并到当前数据,* 用来引用锚点

5.YAML类型转换

  • YAML 支持使用严格类型标签:!!(双感叹号+目标类型)来强制转换类型

    a: !!float '666' # !! 为严格类型标签,字符串转为浮点数
    b: '666' # 其实双引号也算是类型转换符
    c: !!str 666 # 整数转为字符串
    d: !!str 666.66 # 浮点数转为字符串
    e: !!str true # 布尔值转为字符串
    f: !!str yes # 布尔值转为字符串
    g: !!int '666' # 字符串转为整数
    

二、YAML的读写与清空

  • 安装第三方插件:pip install pyyaml

    pip install pyyaml
    

1.YAML的读

  • 方法一:

    import yamldef read_yaml(yaml_path):with open(yaml_path, encoding="utf-8") as f:result = yaml.safe_load(f)return resultresult = read_yaml("D:\\develop\\PyCharm\\workspace\\api_frame\\testcase\\test_first_yaml.yaml")
    print(result)
    
  • 方法二:

    import yamldef read_yaml(yaml_path):with open(yaml_path, encoding="utf-8") as f:result = yaml.load(f, Loader=yaml.FullLoader)return resultresult = read_yaml("D:\\develop\\PyCharm\\workspace\\api_frame\\testcase\\test_first_yaml.yaml")
    print(result)
    

2.YAML的写

  • 方法一:(覆盖写入)

    import yamldef write_yaml(yaml_path, data):with open(yaml_path, mode="w", encoding="utf-8") as f:result = yaml.dump(data, stream=f, allow_unicode=True)path = "D:\\develop\\PyCharm\\workspace\\api_frame\\testcase\\test_first_yaml.yaml"
    data = {'province': {'city1': '长沙市', 'city2': '永州市'}}
    write_yaml(path, data)
    
  • 方法二:(覆盖写入)

    import yamldef write_yaml(yaml_path, data):with open(yaml_path, mode="w", encoding="utf-8") as f:result = yaml.safe_dump(data, stream=f, allow_unicode=True)path = "D:\\develop\\PyCharm\\workspace\\api_frame\\testcase\\test_first_yaml.yaml"
    data = {'province': {'city1': '长沙市', 'city2': '永州市'}}
    write_yaml(path, data)
    
  • 方法三:(追加写入)

    import yamldef add_to_yaml(yaml_path, data):with open(yaml_path, mode="a+", encoding="utf-8") as f:result = yaml.safe_dump(data, stream=f, allow_unicode=True)path = "D:\\develop\\PyCharm\\workspace\\api_frame\\testcase\\test_first_yaml.yaml"
    data = {'province': {'city1': '长沙市', 'city2': '永州市'}}
    add_to_yaml(path, data)
    

3.YAML的清空

  • 方法一:

    # 清空yaml文件内容
    def clean_yam(yaml_path):with open(yaml_path, mode="w", encoding="utf-8") as f:f.truncate()path = "D:\\develop\\PyCharm\\workspace\\api_frame\\testcase\\test_first_yaml.yaml"
    clean_yam(path)
    
  • 方法二:

    def clean_yam(yaml_path):with open(yaml_path, mode="w", encoding="utf-8") as f:passpath = "D:\\develop\\PyCharm\\workspace\\api_frame\\testcase\\test_first_yaml.yaml"
    clean_yam(path)
    

三、pytest的parametrize简单数据驱动

  • 使用 @pytest.mark.parametrize("参数名", 参数值(可以是list或tuple)) 实现数据驱动

  • 数据驱动

    import pytestclass TestFirstClass():@pytest.mark.parametrize("name,age", [["张三", 18], ["李四", 28], ["王五", 20]])def test_query(self, name, age):print(name, age)

    在这里插入图片描述

四、pytest的parametrize结合yaml实现数据驱动

  • 使用 @pytest.mark.parametrize("参数名", 参数值(可以是list或tuple)) 实现数据驱动

  • 1.test_first_yaml.yaml文件内容

    -feature: 模块名1story: 接口名1title: 用例标题1request:method: 请求方式url: 请求路径headers: 请求头data: 请求数据(可以是data,json,file等)validate: 断言-feature: 模块名2story: 接口名2title: 用例标题2request:method: 请求方式url: 请求路径headers: 请求头data: 请求数据(可以是data,json,file等)validate: 断言
    
  • 2.yaml_util.py文件内容

    import yamlclass YamlUtil():def __init__(self, yaml_path):self.yaml_path = yaml_pathdef read_yaml(self):with open(self.yaml_path, encoding="utf-8") as f:result = yaml.safe_load(f)return result
    
  • 3.test_second_file.py文件内容

    import pytestfrom commons.yaml_util import YamlUtilclass TestFirstClass():@pytest.mark.parametrize("caseinfo", YamlUtil("./testcase/test_first_yaml.yaml").read_yaml())def test_query(self, caseinfo):print(caseinfo)
  • 4.结果

    在这里插入图片描述

注意:如果实现数据驱动使用allure测试报告定制会导致allure测试报告页面格式丑陋

五、解决pytest + allure + yaml实现数据驱动生成测试报告及定制导致的页面丑格式陋问题

1.问题描述

在这里插入图片描述
在这里插入图片描述

2.解决方法

  1. 找到项目下 venv/Lib/site-packages/allure_pytest/listener.py 源码文件,删除如图所示内容保存,重新启动项目查看allure测试报告结果

    在这里插入图片描述

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

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

相关文章

FreeRTOS操作系统学习——空闲任务及其钩子函数

空闲任务 当 FreeRTOS 的调度器启动以后就会自动的创建一个空闲任务&#xff0c;这样就可以确保至少有一任务可以运行。但是这个空闲任务使用最低优先级&#xff0c;如果应用中有其他高优先级任务处于就绪态的话这个空闲任务就不会跟高优先级的任务抢占 CPU 资源。空闲任务还有…

FlinkSQL ChangeLog

01 Changelog相关优化规则 0101 运行upsert-kafka作业 登录sql-client&#xff0c;创建一个upsert-kafka的sql作业&#xff08;注意&#xff0c;这里发送给kafka的消息必须带key&#xff0c;普通只有value的消息无法解析&#xff0c;这里的key即是主键的值&#xff09; CREA…

EC600模块通过AT指令接入阿里云物联网平台并发布属性

摘要&#xff1a;本文介绍一下如何通过EC600模块的AT指令&#xff0c;将设备属性值发送到阿里云物联网平台的方法。 这个模块供电可以是 5-16V 和电脑通过USB串口连接&#xff0c;4线即可。未来集成到自己的系统中的时候&#xff0c;可以直接发送指令即可。 使用的软件是FreeAT…

【Vue3】Hooks:一种全新的组件逻辑组织方式

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

STM32作为SPI slave与主机异步通信

背景 最近被测试提了个BUG&#xff0c;说某款产品在用户按下前面板的按键后&#xff0c;对应的按键灯没有亮起来。前面板跟主机是通过SPI口通信&#xff0c;前面板是从机&#xff0c;从机想要主动发送消息&#xff0c;需要通过GPIO中断来通知主机&#xff1a; 上图前面板是ST…

阿里云不杀熟,云服务器优惠价格99元一年,新老用户均可购买

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…

14 程序地址空间

背景 kernel 2.6.32 32位平台 空间布局图 如何理解地址划分 地址划分&#xff0c;本质是调整地址空间的定义start和end&#xff0c;内存中定义了管理每个区域范围的结构体&#xff0c;叫mm_struct&#xff0c;每个进程都有一个这个结构体指针变量 验证上面划分的结构&#…

十四经脉最全总结(什么是经脉、十二经脉动态图、经脉走向、人体和手足哪面为阳,哪面为阴?)

目录 一.什么是经脉二.人体和手足哪面为阳&#xff1f;哪面为阴&#xff1f;三.任督二脉3.1 任脉3.2 督脉 四.十二经脉4.1 什么是 厥阴&#xff0c;少阴&#xff0c;太阴&#xff1b;少阳&#xff0c;阳明&#xff0c;太阳&#xff1f;4.2 十二经脉总分布4.3 手三阴经1.手厥阴心…

4、pod运维replicationCtroller、replicaSet、DeamonSet、Job、Cronjob

1、kubenetes 会自动重新运行失败的pod应用 pod运行失败&#xff0c;会自动重启&#xff0c;但是节点失败&#xff0c;pod会被移除&#xff0c; 除非配置了relicationController来管理资源 2、保持pod的健康存活 配置探针&#xff0c;发送http请求 3、查看前一个pod的运行日…

mysql-视图,创建表,存储过程,循环,判断实操命令

数据库操作命令在IDEA工具database的console命令 数据库表结构与视图 -- 查询隔离级别 select transaction_isolation;-- 设置隔离级别 set session transaction isolation level read committed ; set session transaction isolation level REPEATABLE READ ;start transacti…

蚂蚁感冒c++

题目 思路 “两蚂蚁碰面会掉头&#xff0c;若其中一只蚂蚁感冒了&#xff0c;会把感冒传染给碰到的蚂蚁”&#xff0c;这句话看作是“两蚂蚁碰面会互相穿过&#xff0c;只是把感冒的状态传给了另一只蚂蚁”&#xff0c;因为哪只蚂蚁感冒了并不是题目的重点&#xff0c;重点是有…

如何在Word里一次性给全部汉字加拼音?

word是大家日常使用频率较高的工作软件&#xff0c;功能性很强&#xff0c;有上乘的文档格式设置工具&#xff0c;利用它可更轻松、高效地组织和编写文档&#xff0c;熟练运用word&#xff0c;在职场上很重要。那么word如何添加拼音呢?下面给大家介绍一下吧。 方法一&#xf…

线性dp P4310-绝世好题/P4933 大师【日记】

1.绝世好题&#xff08;P4310&#xff09; 绝世好题https://www.luogu.com.cn/problem/P4310 比较考验思维的一道题目&#xff0c;码量和理解难度都不大&#xff0c;重在思维。 一开始看错题&#xff0c;以为是求子串&#xff08;还在想为啥考的纯位运算枚举&#xff0c;whe…

vue iis 配置

下载安装两个IIS模块 1). 传送门&#xff1a;URL Rewrite 2). 传送门&#xff1a;Application Request Routing 注 : 只有在 服务器的主页 有Application Request Routing 部署VUE网站 生成网站 在VUE项目打包生成出发布文件,即文件夹 dist,此处忽略 复制到你需要存放网站的…

Skywalking官方的实战模拟项目Live-Demo

Skywalking 官方的实战模拟项目Live-Demo Live-Demo 是 Skywalking 官方的实战模拟项目&#xff0c;其中包含4个子模块项目 projectA访问projectB、projectC两个SpringBoot项目 projectB访问本地的H2数据库 projectC访问www.baidu.com并同时向一台Kafka消息队列写入数据 proje…

入门指南:使用uni-app构建跨平台应用

入门指南&#xff1a;使用uni-app构建跨平台应用 &#x1f31f; 前言 欢迎来到我的小天地&#xff0c;这里是我记录技术点滴、分享学习心得的地方。&#x1f4da; &#x1f6e0;️ 技能清单 编程语言&#xff1a;Java、C、C、Python、Go前端技术&#xff1a;Jquery、Vue.js、R…

六、软考-系统架构设计师笔记-软件工程基础知识

1、软件工程 软件工程是将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护&#xff0c;即将工程化应用于软件并对上述方法的研究。 软件要经历从需求分析、软件设计、软件开发、运行维护&#xff0c;直至被淘汰这样的全过程&#xff0c;这个过程称为软件的生…

Android使用OpenGL和FreeType绘制文字

Open GL主要是渲染图形的&#xff0c;有时候需要绘制文字&#xff0c;网上搜了一下&#xff0c;基本思路都是把文字转成位图&#xff0c;再使用Open GL纹理进行渲染。加载纹理在特定阶段才能成功&#xff08;在onSurfaceCreated中加载&#xff09;&#xff0c;这样就无法动态的…

部署LVS负载均衡架构

目录 一、ipvsadm 工具 二、NAT模式下部署LVS负载均衡 1、部署NFS共享存储服务器 1.1 安装NFS软件 1.2 新建共享目录和站点文件 1.3 设置共享策略 2、部署节点服务器1 2.1 安装并启动nginx软件 2.2 挂载共享目录到网页站点目录 2.3 修改网关 3、部署节点服务器2 3.…

在ABAP中创建一个简单的守护进程

原文地址&#xff1a;Create a simple Daemon in ABAP 目录 一、ABAP语言中的守护进程是什么&#xff1f;二、ABAP 守护进程框架 (ADF)三、ABAP 守护进程类四、创建一个简单的ABAP守护进程步骤1&#xff1a;创建一个新的ABAP Daemon类步骤2&#xff1a;实现ON_ACCEPT方法第三步…