接口自动化测试丨如何实现多套环境的自动化测试?

在敏捷迭代的项目中,通常会将后台服务部署到多套测试环境。那么在进行接口自动化测试时,则需要将服务器的域名进行配置。使用一套接口测试脚本,通过切换域名地址配置,实现多套环境的自动化测试。

实战练习

分别准备两套测试环境,都对其发起 get 请求,传入参数 name,对应值为 hogwarts,并断言其响应值。

  • 测试环境1:httpbin.org/get

  • 测试环境2:httpbin.ceshiren.com/get

以下是分别针对测试环境 1 和测试环境 2 编写接口测试用例。

Python 版本
import requests# 测试环境1测试用例
def test_org():res = requests.get(url="http://httpbin.org/get", params={"name": "hogwarts"})assert res.json()["args"]["name"] == "hogwarts"# 测试环境2测试用例
def test_ceshiren():res = requests.get("https://httpbin.ceshiren.com/get", \params={"name": "hogwarts"})assert res.json()["args"]["name"] == "hogwarts"
 Java 版本
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.core.IsEqual.equalTo;
public class envTest {// 测试环境1测试用例@Testvoid envOrg() {given().params("name", "hogwarts").when().get("http://httpbin.org/get").then().body("args.name", equalTo("hogwarts"));}// 测试环境2测试用例@Testvoid envCeshiren() {given().params("name", "hogwarts").when().get("https://httpbin.ceshiren.com/get").then().body("args.name", equalTo("hogwarts"));}
}

 

以上虽然实现了多环境的测试,但是每条测试用例都对应一个测试环境,一旦用例发生变化,那么则每条用例都需要进行修改。

针对以上的问题,可以把域名统一放在 env 配置信息中进行管理,然后将请求结构中的 url 地址替换成 env 配置文件中对应环境的 url 地址。

还可以添加默认配置信息,如 default 字段,default 用来配置默认使用的环境。当 default 的值改成 org,执行用例就会发起对 org 环境的请求;当 default 的值改成 ceshiren,执行用例就会发起对 ceshiren 环境的请求。

优化后的测试用例

Python 版本
import requests
envs = {"default": "ceshiren","org": "http://httpbin.org/get","ceshiren": "http://httpbin.ceshiren.com/get"
}
# 测试用例
def test_envs():
# envs['default'] 代表 ceshiren, envs['ceshiren'] 代表对应的urlres = requests.get(url= envs[envs['default']])assert res.status_code == 200
 Java版本
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
import static io.restassured.RestAssured.given;
import static org.hamcrest.core.IsEqual.equalTo;public class envTest {public final static  Map<String, String> envs = new HashMap();static {envs.put("default", "ceshiren");envs.put("org", "http://httpbin.org/get");envs.put("ceshiren", "http://httpbin.ceshiren.com/get");}@Testvoid envs() {given().params("name", "hogwarts").when().get(envs.get(envs.get("default"))).then().body("args.name", equalTo("hogwarts"));}}

 

上面的方案虽然将 url 参数与用例实现了解耦,但是随着项目版本的快速迭代,接口会越来越多,在多个测试脚本文件中都要设置这个 envs 环境配置。每次切换环境时,都要逐个修改配置,维护成本非常高。

因此,就需要将环境配置信息 envs 存储到 envs.yaml 文件中,然后在测试脚本中定义读取 yaml 信息的函数,在需要的地方调用即可。

配置文件 envs.yaml 内容:

default: org
org: http://httpbin.org
ceshiren: http://httpbin.ceshiren.com

优化后的测试用例

Python 版本
import requests
import yaml# 读取本地yaml配置文件
def get_envs():with open('envs.yaml', 'r') as file:return yaml.safe_load(file)# 测试用例
def test_envs():# 获取环境配置信息envs = get_envs()# 发送请求res = requests.get(url= envs[envs['default']] + "/get")print(res.json()['headers']['Host'])
Java 版本
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import static io.restassured.RestAssured.given;
import static org.hamcrest.core.IsEqual.equalTo;
public class envTest {//读取yaml本地的配置文件public HashMap<String, String> getEnvs() throws IOException {ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());TypeReference<HashMap<String, String>> typeReference = new TypeReference<HashMap<String, String>>() {};HashMap<String, String> envs = null;String filePath = this.getClass().getResource("env.yaml").getPath();envs = objectMapper.readValue(new File(filePath), typeReference);return envs;}@Testvoid envs() throws IOException {// 获取环境配置HashMap<String, String> envs =  this.getEnvs();given().params("name", "hogwarts").when().//发送请求get(envs.get(envs.get("default"))).then().body("args.name", equalTo("hogwarts"));}
}

 

当需要切换测试环境时,只需要改动配置文件 envs.yaml 中的 default 字段的值即可。

 感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

 

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

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

相关文章

多端开发围炉夜话

文章目录 一、多端开发 一、多端开发 uni-app 官网 UNI-APP中的UI框架&#xff1a;介绍常用的UI框架及其特点 uView UIVant WeappColor UIMint UI uniapp嵌入android原生开发的功能 uniapp使用安卓原生sdk uni-app中的uni.requireNativePlugin Qt for iOS Qt for Android

Linux-时间接口-005

学习重点&#xff1a; 1.函数接口 2.【ls-l】命令的实现1【time】 1.1函数原型 【time_t time(time_t *tloc);】1.2函数功能 返回1970-1-1到现在的秒数&#xff08;格林威治时间&#xff09;1.3函数参数 1.3.1【tloc】 存放秒数空间首地址 存放的秒数&#xff1a;如果【t…

SpringBoot集成Mqtt发送消息

1. MQTT简介 MQTT是一种物联网消息协议&#xff0c;为Message Queuing Telemetry Transport的缩写&#xff0c;即消息队列传输探测&#xff0c;协议基于发布订阅模式进行通信&#xff0c;有开销低、带宽小、轻量的特点&#xff0c;通常应用在物联网数据采集、移动应用、智能硬…

pandas/geopandas 笔记:判断地点在不在路网上 不在路网的点和路网的距离

0 导入库 import osimport pandas as pd pd.set_option(display.max_rows,5)import osmnx as oximport geopandas as gpd from shapely.geometry import Point 1 读取数据 假设我们有 如下的数据&#xff1a; 1.1 新加坡室外基站位置数据 cell_stationpd.read_csv(outdoor…

面试答疑03

1、登录鉴权怎么做的&#xff1f;为什么采用jwt的方式&#xff1f;有什么好处&#xff1f; Java登录鉴权常见的实现方式包括**CookieSession、HTTP Basic Authentication、ServletJDBC**等。 在Java的Web应用中&#xff0c;登录鉴权是确认用户身份的关键环节。一个常用的传统…

《探索网校 App 的魅力世界:知识与科技的完美结合》

在数字化时代&#xff0c;教育也在经历着深刻的变革。网校 App 的出现&#xff0c;正为学习者们开启了一扇通往知识的新大门&#xff0c;它融合了科技的力量&#xff0c;让学习变得更加便捷、高效和有趣。 一、功能与优势 网校 App 提供了丰富多样的学习功能&#xff0c;满足了…

Vue 中 onclick和@click区别

文章目录 一、直接上结论二、验证代码&#xff0c;可直接运行三、点击结果 一、直接上结论 onclick 只能触发 js的原生方法&#xff0c;不能触发vue的封装方法click 只能触发vue的封装方法&#xff0c;不能触发js的原生方法 二、验证代码&#xff0c;可直接运行 <!DOCTYP…

11-树-二叉树的前序遍历

这是树的第11篇算法&#xff0c;力扣链接。 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 做了这么久的树问题&#xff0c;现在开始回忆三种遍历方法&#xff0c;这篇文章…

【嵌入式学习】IO进程线程day02.22

一、思维导图 二、习题 1> 将互斥机制的代码实现 #include <myhead.h>//定义一个全局变量 char str[128]"我是一个全局字符串数组"; //1、创建一个互斥锁变量 pthread_mutex_t mutex;//线程1 void *pth1(void *arg) {//上锁pthread_mutex_lock(&mutex…

为新固态硬盘安装操作系统

目录 背景方案具体步骤1 为新硬盘进行分区2 下载Dism3 下载win10的iso文件4 通过Dism 重装系统5 从biso调整启动顺序5 遗留问题 参考资料 背景 情况是这样的&#xff0c;我的电脑本来就有一块sata的固态硬盘&#xff0c;作为c盘&#xff0c;装载的是win10系统。 一方面只有500…

matlab代码--基于matlabLDPC-和积译码系统

LDPC编码 一个码长为n、信息位个数为k的线性分组码&#xff08;n,k&#xff09;可以由一个生成矩阵 来定义&#xff0c;信息序列 通过G被映射到码字XS.G。线性分组码也可以由一个校验矩阵 来描述。所以码字均满足 。校验矩阵的每一行表示一个校验约束 &#xff0c;其中所有的非…

springboot大学生体质测试管理系统源码和论文

大学生体质测试管理系统提供给用户一个简单方便体质测试管理信息&#xff0c;通过留言区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、教师和用户三个部分&#xff0c;系统管理员主要功能包括首…