自动化测试基础——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.hqwc.cn/news/513779.html

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

相关文章

SprinBoot集成nacos

环境搭建 采用docker-compose搭建测试环境 # docker-compose参考&#xff1a;https://github.com/nacos-group/nacos-docker/blob/master/example/standalone-mysql-5.7.yaml # Nacos文档&#xff1a;https://nacos.io/zh-cn/index.html version: 3# 网桥 -> 方便相互通讯 …

结合大象机器人六轴协作机械臂myCobot 280 ,解决特定的自动化任务和挑战!(上)

项目简介 本项目致力于探索和实现一种高度集成的机器人系统&#xff0c;旨在通过结合现代机器人操作系统&#xff08;ROS&#xff09;和先进的硬件组件&#xff0c;解决特定的自动化任务和挑战。一部分是基于Jetson Orin主板的LIMO PPRO SLAM雷达小车&#xff0c;它具备自主导航…

upload-Labs靶场“11-15”关通关教程

君衍. 一、第十一关 %00截断GET上传1、源码分析2、%00截断GET上传 二、第十二关 %00截断POST上传1、源码分析2、%00截断POST上传 三、第十三关 文件头检测绕过1、源码分析2、文件头检测绕过 四、第十四关 图片检测绕过上传1、源码分析2、图片马绕过上传 五、第十五关 图片检测绕…

PYQT5打包报错 FileNotFoundError ModuleNotFoundError:No Module named ‘MyImport‘

pyinstaller打包pyqt5程序得到exe文件无法运行的问题 在执行该命令之后pyinstaller -D -w main.py&#xff0c;生成的exe文件运行出现报错&#xff0c;ui文件找不到、模块找不到等&#xff0c;这些是因为程序使用到非官方库等问题&#xff0c;总之就是你自己的各种文件在代码中…

图像处理 mask掩膜

1&#xff0c;图像算术运算 图像的算术运算有很多种&#xff0c;比如两幅图像可以相加&#xff0c;相减&#xff0c;相乘&#xff0c;相除&#xff0c;位运算&#xff0c;平方根&#xff0c;对数&#xff0c;绝对值等&#xff1b;图像也可以放大&#xff0c;缩小&#xff0c;旋…

Git分布式管理-头歌实验分支管理

一、创建本地分支-git branch 任务描述 当你进入一个团队&#xff0c;在获得产品的完整代码之后&#xff0c;你首先要做的就是&#xff0c;在本地创建一个属于自己的分支&#xff0c;然后才能在自己的分支上进行开发。 本关任务&#xff1a;在本地仓库创建一个新的分支&#xf…

flutter小程序开发,Android高级工程师必备知识

AWTK 主要特色&#xff1a; 1、跨平台 AWTK 是跨平台的&#xff0c;这有两个方面的意思&#xff1a; AWTK 本身是跨平台的。目前支持的平台有 ZLG AWorks、Windows、Linux、MacOS、嵌入式 Linux、Android、Web 和嵌入式裸系统&#xff0c;可以轻松的移植到各种 RTOS 上。AWT…

javascript基础入门

1.第一个javascript程序 javascript程序不能够独立的运行&#xff0c;必须依赖于HTML文件&#xff0c;type属性值用来说明脚本的类型&#xff0c;这里 是指使用javascript编写的文本文件&#xff1b; 2.alert警告框 alert&#xff08;&#xff09;函数显示一条指定的信息&am…

Windows上websocket客户端连接定时存储消息到文件并加载文件定时发送服务端工具实现

场景 在业务开发中&#xff0c;需要对接三方websocket协议数据或者连接并存储线上websocket协议数据&#xff0c;需要使用websocket客户端 连接线上的websocket服务端获取并存储数据&#xff0c;然后将数据存储成文件格式可移植&#xff0c;并将数据复制 到本地&#xff0c;…

【探索AI】二十五 深度学习之第8周:深度学习项目实战

项目名称&#xff1a;基于深度学习的图像分类系统 一、项目背景 随着大数据和人工智能技术的快速发展&#xff0c;图像分类技术在各个领域得到了广泛应用&#xff0c;如安防监控、医疗诊断、自动驾驶等。本项目旨在利用深度学习技术构建一个高效的图像分类系统&#xff0c;实…

Nginx使用—http基础知识

web访问流程 当我们在客户端通过浏览器输入网址的时候&#xff0c;这时候是访问不到服务器的&#xff0c; 先会去找到DNS解析服务器&#xff0c;DNS解析服务器返回IP地址&#xff0c; 客户端通过http协议向服务端发送请求&#xff0c;服务器响应请求并返回对应的资源给客户端&a…

持续更新 | 与您分享 Flutter 2024 年路线图

作者 / Michael Thomsen Flutter 是一个拥有繁荣社区的开源项目&#xff0c;我们致力于确保我们的计划公开透明&#xff0c;并将毫无隐瞒地分享从问题到设计规范的所有内容。我们了解到许多开发者对 Flutter 的功能路线图很感兴趣。我们往往会在一年中不断更改并调整这些计划&a…