基于 YAML 接口自动化测试框架设计

在设计自动化测试框架的时候,我们会经常将测试数据保存在外部的文件(如Excel、YAML、CSV),或者数据库中,实现脚本与数据解耦,方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测试用例,通过脚本读取出来驱动自动化测试代码执行。至于采用Excel还是YAML格式各位小伙伴都有不同见解,比如用Excel维护直观、修改数据方便,劣势是通过Git这样的版本控制工具不太好比较历史版本差异(因为是二进制格式);YAML的优势是支持数据格式完备、版本控制管理方便(文本格式),劣势是没有Excel这么直观。Excel这种方式大家比较熟悉了,本文带着大家来了解如何基于YAML设计自动化测试框架。

YAML格式测试用例设计

以接口自动化为例,用YAML编写测试用例要实现的基本功能需求:

  1. 一个YAML文件能够支持多个用例存储需求,不然几千个用例对应几千个YAML文件管理起来也受不了
  2. 用例中能够支持单接口测试用例也能支持业务场景用例(多个接口调用组合)
  3. 用例中需要包含所属模块、用例名、请求信息、断言信息、提取响应(实现接口关联)等信息

基于上述需求我们来设计一版YAML格式用例:

- casename: 登录成功
  module: 用户模块
  teststeps:
    - name: 正确用户名、密码进行登录
      request:
        method: POST
        url: /login
        headers:
          Content-Type: application/json
        json:
          username: lemon_auto
          password: lemon123456
          appType: 3
          loginType: 0
      extract:
        token: access_token
      validate:
        - eq: ["status_code", 200]
        - eq: ["nickName", "lemon_auto"]

casename与module字段简单,我们来看下teststeps,为什么teststeps是数组类型?

因为用例中包含一个/多个接口请求步骤,也就是一个TestCase包含了多个teststep,每一个teststep就是一个接口请求。

request中指定接口请求信息,包括接口请求方法、请求地址、请求头、请求参数;其中不同的请求参数类型我们需要进行区别,上述的是json传参,如果是form表单、查询参数传参我们都可以约定为类似的key-value结构,只需要将json改为formparam、queryparam。

需要注意的是文件上传接口的参数会比较特殊,一般来说我们只需要设置要上传文件路径即可,所以我们可以这样设计:

- casename: 上传图片
  module: 用户模块
  teststeps:
    - name: 正常上传图片
      request:
        method: POST
        url: /p/file/upload
        headers:
          Content-Type: multipart/form-data
        file: src/test/resources/upload.png
      extract:
        resourcesUrl: resourcesUrl
        filePath: filePath
      validate:
        - eq: [ "status_code", 200 ]

extract字段为要提取的响应数据字段,传递给后续的接口使用。一般我们要求能够支持JsonPath表达式或者正则表达式来提取,对应的key为要提取的字段名,对应的值为要提取的字段表达式。

validate字段是断言信息,也就是验证响应结果是否符合预期。这里我们需要支持常用的判断方法包括:等于、大于、小于、大于等于、小于等于,通过简写eq代替equals(等于)判断,其他的类似:大于等于(ge)、小于等于(le)、小于(lt)、大于(gt)。

上述的是单接口测试用例,我们看下多接口串联(业务场景)用例编写的样式:

ModifyUserProfile.yaml

- casename: 修改用户头像
  module: 用户模块
  teststeps:
    - name: 登录成功
      request:
        method: POST
        url: /login
        json:
          username: lemon_auto
          password: lemon123456
          appType: 3
          loginType: 0
        headers:
          Content-Type: application/json
      extract:
        token: access_token
      validate:
        - eq: ["status_code", 200]
        - eq: ["nickName", "lemon_auto"]

    - name: 进入到个人中心
      request:
        method: GET
        url: /p/user/userInfo
        headers:
          Authorization: ${token}
      validate:
        - eq: ["status_code", 200]

    - name: 上传头像
      request:
        method: POST
        url: /p/file/upload
        headers:
          Authorization: ${token}
          Content-Type: multipart/form-data
        file: src/test/resources/upload.png
      extract:
        resourcesUrl: resourcesUrl
        filePath: filePath
      validate:
        - eq: ["status_code", 200]

在多接口测试中重要的是要能够支持参数传递,这里我们在前一个接口使用extract提取接口的响应字段,在后续要使用的接口中通过${token}方式进行引用,熟悉Jmeter接口测试工具的同学应该非常熟悉这种格式。

脚本读取YAML数据

在读取YAML文件数据之前,我们首先需要了解两个概念:序列化与反序列化

  • 把对象转换为字节序列的过程称为对象的序列化;
  • 把字节序列恢复为对象的过程称为对象的反序列化。

而我们读取YAML的过程就可以称之为反序列化。

主流的编程语言都能实现对YAML的解析,接下来以Java语言为例讲解如何读取YAML文件的内容:

Java中能够实现YAML序列化和反序列化的库有很多,包括SnakeYaml、Jackson、jYaml等,使用起来大同小异。以使用Jackson为例:

步骤一:Maven POM文件中添加库的坐标

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.2</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.10.2</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

这里用到了jackson-databind与jackson-dataformat-yaml,其中jackson-databind是Jackson的主库,jackson-dataformat-yaml是支持YAML数据格式的库,在这里同时引入了lombok,是为了后面编写实体类时简化一些代码的书写:

Lombok可以来帮助我们简化一些必须有但显得很臃肿(比如get/set方法)的Java代码的工具,通过使用对应的注解,可以在编译源码的时候自动生成对应的方法。

步骤二:编写YAML实体类

对照YAML文件内容比如字段名(比如 “姓名”)和字段的数据类型(比如字符串),创建一个对应的类,用来在 Java 中表示YAML文件的信息。目的是为了能够将YAML文件保存到Java对象中(反序列化)。

TestCase实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestCase {
    private String casename;
    private String module;
    private List<Teststep> teststeps;
}

Teststep实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teststep {
    private String name;
    private Request request;
    private HashMap<String,String> extract;
    private List<Validate> validate;
}

Request实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Request {
    private String method;
    private String url;
    private HashMap<String,Object> json;
    private HashMap<String,Object> formparam;
    private HashMap<String,Object> queryparam;
    private String text;
    private String file;
    private HashMap<String,Object> headers;
}

Validate实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Validate {
    private List<Object> eq;
    private List<Object> gt;
    private List<Object> ge;
    private List<Object> lt;
    private List<Object> le;
}

通过Jackson读取YAML文件内容并保存到TestCase实体类对象中

public static List<TestCase> loadYaml(String path){
    ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    List<TestCase> cases = null;
    try {
        cases = objectMapper.readValue(new File(path), new TypeReference<List<TestCase>>() {});
    } catch (IOException e) {
        System.out.println(path+"格式非法,请检查配置");
        e.printStackTrace();
    }
    return cases;
}

其中new TypeReference<List<TestCase>>() {}是因为读取到的YAML文件中有多个TestCase用例,所以我们需要定义为List集合类型来接收。

来看看读取之后的效果:

后续即可通过返回的testCase发起接口请求(比如通过REST-assured)、进行接口断言、提取响应字段等操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode:2642. 设计可以求最短路径的图类(SPFA Java)

目录 2642. 设计可以求最短路径的图类 题目描述&#xff1a; 实现代码与解析&#xff1a; SPFA 原理思路&#xff1a; 2642. 设计可以求最短路径的图类 题目描述&#xff1a; 给你一个有 n 个节点的 有向带权 图&#xff0c;节点编号为 0 到 n - 1 。图中的初始边用数组 e…

20240320-1-梯度下降

梯度下降法面试题 1. 机器学习中为什么需要梯度下降 梯度下降的作用&#xff1a; 梯度下降是迭代法的一种&#xff0c;可以用于求解最小二乘问题。在求解损失函数的最小值时&#xff0c;可以通过梯度下降法来一步步的迭代求解&#xff0c;得到最小化的损失函数和模型参数值。…

一文读懂:什么是工单系统?市面上有哪些好用的工单系统?

什么是工单管理系统&#xff1f;工单系统如何帮助企业解决管理问题&#xff1f;市面上有哪些好用的工单管理系统&#xff1f;不同工单管理系统适用于什么企业&#xff1f;工单管理系统如何定价&#xff1f; 5000字长文&#xff0c;我写了整整一天&#xff01;梳理了大家对工单…

操作系统:初识文件

目录 1.初识文件 2.文件操作 2.1.文件操作接口 2.2.文件描述符fd 3.缓冲区 3.1.简要介绍 3.2.重定向 3.2.1.输出重定向 3.2.2.追加重定向 3.2.3.输入重定向 3.2.4.调用接口实现重定向 3.2.5.文件重定向的作用 3.3.用户缓冲区与内核缓冲区 3.4.缓冲区和重定向 我…

适合新手小白的wordpress详细安装教程

1、下载程序 到wordpress官方网站下载wordpress程序&#xff0c;官方下载地址&#xff1a;Download | WordPress.org China 简体中文。 下载最新版的wordpress程序 https://cn.wordpress.org/latest-zh_CN.zip 2、上传程序 上传程序前先确认主机是否符合安装的环境要求&…

小白必看从零开始学习,制作产品册技巧

作为初学者&#xff0c;我们往往缺乏相关经验和技巧&#xff0c;难以打造出令人眼前一亮的产品册。不过&#xff0c;别担心&#xff01;小编将为你揭示从零开始学习制作产品册的秘诀&#xff0c;让你轻松掌握技巧&#xff0c;成为产品册制作高手&#xff01; 一、明确目标&…

学成在线项目学习

技术栈 学成在线服务端基于Spring Boot构建&#xff0c;采用Spring Cloud微服务框架。 持久层&#xff1a;MySQL、MongoDB、Redis、ElasticSearch 数据访问层&#xff1a;使用Spring Data JPA 、Mybatis、Spring Data Mongodb等 业务层&#xff1a;Spring IOC、Aop事务控制、S…

外包干了5年,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

LVGL线条和画布功能

线条部件 线条部件由多个点连接而成&#xff0c;它可用于修饰界面或者展示数据。 要注意这里的描述&#xff0c;线条是由多个点连接而成的。 线条部件只有一个组成部分&#xff1a;主体 LV_PART_MAIN 线条是由多个点连接而成的对象&#xff0c;用户可以使用 lv_point_t 类型的…

Day35 ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

● 860.柠檬水找零 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:fiveten0for bill in bills:if bill5:five1elif bill10:five-1ten1elif bill20 and ten!0:five-1ten-1else:five-3if five<0:return Falsereturn True ● 406.根据身高重建队列 cl…

SpringBoot3的RabbitMQ消息服务

目录 预备工作和配置 1.发送消息 实现类 控制层 效果 2.收消息 3.异步读取 效果 4.Work queues --工作队列模式 创建队列text2 实体类 效果 5.Subscribe--发布订阅模式 效果 6.Routing--路由模式 效果 7.Topics--通配符模式 效果 异步处理、应用解耦、流量削…

javascript基础练习题之渔夫捕鱼

一、题目要求&#xff1a;根据用户输入的年、月、日判断是打鱼还是晒网。代码中使用了isLeapYear函数来判断输入的年份是否为闰年&#xff0c;getDays函数来计算输入日期是一年中的第几天&#xff0c;然后根据计算结果来确定是打鱼还是晒网。最后代码通过弹窗提示用户是打鱼还是…

Kimi和ChatGPT做古诗词阅读理解,谁更胜一筹?

前几天发过一篇Kimi整理会议的体验教程&#xff0c;没想到大家很感兴趣&#xff0c;这次再来拿Kimi做古诗词阅读理解看看&#xff0c;同时也对比下ChatGPT的效果。 ChatGPT是几乎家喻户晓的AI大模型&#xff0c;Kimi和它对比有哪些异同点呢&#xff1f; 首先它们都是基于对话…

黑群晖Docker安装aria2-pro

前言 最近买了星际蜗牛C款当Nas&#xff0c;来满足我的存储需求&#xff0c;在之前我写过一篇docker安装aria2-pro的文章&#xff0c;既然买了nas那当然也要安装一个aria2-pro做下载器 1.安装 Container Manager 套件 可以在套件中心搜索docker找到 2.下载aria2-pro镜像 打…

欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理

数据结构、算法总述&#xff1a;数据结构/算法 C/C-CSDN博客 欧拉函数 欧拉函数&#xff08;Eulers totient function&#xff09;是一个与正整数n相关的数论函数&#xff0c;通常用φ(n)表示。定义为小于或等于n的正整数中与n互质的数的个数 int phi(int x) {int res x;for…

C语言例4-15:从键盘输入一个整数,求其绝对值并输出。

代码如下&#xff1a; //从键盘输入一个整数&#xff0c;求其绝对值并输出。 #include<stdio.h> int main(void) {int n;printf("输出一个整数&#xff1a; \n");scanf("%d",&n); //从键盘输入一个整数保存至变量nif(n<0) //…

找图识字模拟键鼠编程插件奥迦插件24.3.18

名称&#xff1a;奥迦插件24.3.18更新记录24.3.183 1.增加函数SetObjectNamesEncode2.修复按键函数在有些窗口不能按下方向键的问题命令功能介绍:奥迦插件在Windows 10操作系统上使用Visual Studio 2019编写,适用于所有较新的Windows平台,是一款集网络验证,深度学习,内核,视觉,…

出席2024亚太内容分发大会,火山引擎边缘云“加速”游戏体验升级

3月26日&#xff0c;第十四届亚太内容分发大会暨CDN峰会在北京成功举办&#xff0c;火山引擎边缘云产品架构高级总监许思安出席并以《火山引擎边缘云游戏行业解决方案&#xff0c;“加速”游戏体验升级》为主题&#xff0c;分享了火山引擎边缘云在游戏行业的思考和实践。同时&a…

01使用调试工具

文章目录 前言一、用openocd打开单片机二、利用4444端口向单片机写入hex文件三、利用3333端口和gdb进行调试四、之前我出的问题总结 前言 之前写了一篇关于在linux下搭建stm32标准库的文章后&#xff0c;有一些小伙伴们还是出现了一些奇奇怪怪的错误&#xff0c;这一篇文章就是…

多渠道整合策略全攻略:HubSpot出海CRM助力企业轻松获客

在全球化日益加速的今天&#xff0c;企业纷纷寻求出海机会&#xff0c;以拓展市场、增加客户基础。在这个过程中&#xff0c;一个强大的客户关系管理系统&#xff08;CRM&#xff09;显得尤为关键。作为业内领先的CRM解决方案提供商&#xff0c;HubSpot出海CRM以其强大的核心功…