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

news2024/11/26 14:35:48

文章目录

  • 一、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: value1
      child-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.org
      Python: python.org
    

3.3.标量


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

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期
#字符串
string:
    - 哈哈
    - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符(当有特殊字符时:双引号不会被转义,其它的都会加一个转义符 \)
    - newline
      newline2    #字符串可以拆成多行,每一行会被转化成一个空格
#布尔值
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: &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
    
  • & 用来建立锚点(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 yaml
    
    
    def read_yaml(yaml_path):
        with open(yaml_path, encoding="utf-8") as f:
            result = yaml.safe_load(f)
            return result
    
    
    result = read_yaml("D:\\develop\\PyCharm\\workspace\\api_frame\\testcase\\test_first_yaml.yaml")
    print(result)
    
  • 方法二:

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

2.YAML的写

  • 方法一:(覆盖写入)

    import yaml
    
    
    def 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 yaml
    
    
    def 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 yaml
    
    
    def 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:
            pass
    
    
    path = "D:\\develop\\PyCharm\\workspace\\api_frame\\testcase\\test_first_yaml.yaml"
    clean_yam(path)
    

三、pytest的parametrize简单数据驱动

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

  • 数据驱动

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

    import yaml
    
    
    class YamlUtil():
        def __init__(self, yaml_path):
            self.yaml_path = yaml_path
    
        def 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 pytest
    
    from commons.yaml_util import YamlUtil
    
    
    class 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.coloradmin.cn/o/1492989.html

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

相关文章

数据库期末速成100分训练,附练手数据库原件及教程

本文提供下面数据库代码的数据库原件&#xff0c;下载后可使用 教程如下&#xff1a; 1.打开sql sever 2.找到数据库 3.右键数据库点击“附加”&#xff0c;然后点击“添加” 4.导入数据库原件&#xff0c;点击确定 ps&#xff1a;如果没有sqlsever 或者页面编辑器&#x…

基于SSM的农业信息管理系统的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的农业信息管理系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;…

JavaScript中的innerHTML、value属性,零基础开发web前端

CSS篇 让一个元素水平垂直居中&#xff0c;到底有多少种方案&#xff1f;浮动布局的优点&#xff0c;缺点&#xff1f;清除浮动的方式&#xff1f;使用display:inline-block会产生的问题&#xff1f;解决方法&#xff1f;布局题&#xff1a;div垂直居中&#xff0c;左右10px&a…

LeNet5实战——衣服分类

搭建模型训练代码&#xff08;数据处理、模型训练、性能指标&#xff09;——> 产生权重w ——>模型结构c、w测试 配置环境 Pycharm刚配置的环境找不到了-CSDN博客 model.py 导入库 import torch from torch import nn from torchsummary import summary 模型搭…

【HarmonyOS】Dev Eco Studio4.0安装教程

目录 下载安装开发工具配置 下载 Dev Eco Studio4.0下载连接→https://developer.huawei.com/consumer/cn/next/deveco-studio/ 安装 点击Next 选择安装目录。点击Next 勾选创建桌面快捷方式和环境变量&#xff0c;点击Next 点击Install&#xff0c;安装 等待安装 选…

android开发视频教程百度网盘,深入浅出Android

基于Linux的pc启动过程 我们都知道&#xff0c;所有的程序软件包括操作系统都是运行在内存中的&#xff0c;然而我们的操作系统一般是存放在硬盘上的&#xff0c;当我们按下开机键的时候&#xff0c;此时内存中什么程序也没有&#xff0c;因此需要借助某种方式&#xff0c;将操…

JavaWeb环境配置 IDE2022版

一、新建一个javaweb文件 文件名可以自己随意改 二、给建立的项目添加框架支持 勾选Web Application,点击确定 建立成功界面&#xff0c;会生成一个新的web文件夹 三、配置tomcat 1、两种打开配置文件方式&#xff1a; 第一种 第二种 2、打开后&#xff0c;点击号&#xf…

Redis面试问题纯享版

基础内容 1、简单介绍以下你了解的Redis 2、对比一下Redis和Memcache的异同&#xff1f; 3、为什么MySQL选用Redis作为缓存&#xff1f; 4、详细聊聊你对Redis各种数据类型的了解&#xff1f; 5、Redis中五种基本数据类型的底层数据结构是什么样的&#xff1f; Redis线程模型…

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

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

flutterpush消息,Android开发两年

如何进阶Android&#xff1f; 有些东西你不仅要懂&#xff0c;而且要能够很好地表达出来&#xff0c;能够让面试官认可你的理解&#xff0c;例如Handler机制&#xff0c;这个是面试必问之题。有些晦涩的点&#xff0c;或许它只活在面试当中&#xff0c;实际工作当中你压根不会…

LeetCode_24_中等_两两交换链表中的节点

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 递归2.2 迭代 1. 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换…

微信小程序接入百度地图(微信小程序插件)使用文档

第一步配置域名 :在微信公众平台登录后配置服务域名称:https://apis.map.qq.com 第二步申请密钥 申请开发者密钥申请地址 第三步使用插件 选择添加插件 搜索腾讯位置服务地图选点 选择要授权的小程序 授权完毕会在这里显示插件信息 第四步查看使用文档 跳转至文…

[BUUCTF]-PWN:starctf_2019_babyshell解析(汇编\x00开头绕过+shellcode)

查看保护 查看ida 这里就是要输入shellcode&#xff0c;但是函数会有检测。 在shellcode前面构造一个以\x00机器码开头的汇编指令&#xff0c;这样就可以绕过函数检查了。 完整exp&#xff1a; from pwn import* context(log_leveldebug,archamd64) pprocess(./babyshell)she…

开源项目:图像分类算法在保险行业的创新应用与实践

一、引言 在当今数字化时代&#xff0c;保险行业正经历着前所未有的变革。传统保险公司面临着新兴科技的挑战&#xff0c;被迫重新思考其业务模式和营销策略。在这种背景下&#xff0c;我有幸参与了一个项目&#xff0c;该项目旨在通过整合多种销售渠道和技术手段&#xff0c;提…

电脑自动锁屏怎么设置?让你安心使用电脑

随着时代的进步&#xff0c;电脑已经成为我们日常生活中不可或缺的一部分。在使用电脑的过程中&#xff0c;为了保护隐私、节省能源或确保系统安全&#xff0c;许多用户都希望能够设置电脑自动锁屏。本文将详细介绍电脑自动锁屏怎么设置的三种方法&#xff0c;帮助用户轻松实现…

设计MySQL数据表的几个注意点

最近合作搞项目&#xff0c;发现了很多问题。特别的&#xff0c;数据库层面上的问题更为致命。记录一下&#xff0c;希望后面看到博客的同学们注意。 注意&#xff1a;以下观点只用于一般情况下的单体、微服务&#xff0c;不保证适用所有场景。 一、ID问题 ID名称问题 如下图…

Qt多弹窗实现包括QDialog、QWidget、QMainWindow

1.相关说明 独立Widget窗口、嵌入式Widget、嵌入式MainWindow窗口、独立MainWindow窗口等弹窗的实现 相关界面包含关系 2.相关界面 3.相关代码 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "tformdoc.h" #incl…

EdgeX Foundry - 导出数据到 HTTP 服务

文章目录 一、概述1.安装说明2.HTTP 服务 二、安装部署1.docker-comepse2.修改配置3.启动 EdgeX Foundry4.访问 UI4.1. consul4.2. EdgeX Console 5.测试 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs/edgex/device/export-ht…

【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)

@[TOC](【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)) 具体步骤 第一步是注册您的应用程序。特别是,您需要将浏览器指向 http://apps.twitter.com,登录 Twitter(如果您尚未登录)并注册新应用程序。您现在可以为您的应用程序选择名称和描述(例如“Mining Demo”…

C++对象模型剖析(六)一一Data语义学(三)

Data 语义学&#xff08;三&#xff09; “继承” 与 Data member 上期的这个继承的模块我们还剩下一个虚拟继承&#xff08;virtual inheritance&#xff09;没有讲&#xff0c;现在我们就来看看吧。 虚拟继承&#xff08;Virtual Inheritance&#xff09; 虚拟继承本质就是…