写点什么

软件测试 |多套测试环境下的接口测试

  • 2023-02-26
    北京
  • 本文字数:2761 字

    阅读完需:约 9 分钟

在敏捷迭代的开发项目中,为了提高测试效果和效率,我们通常会将项目的后台服务部署到多套测试环境中。那么在对这种场景的项目进行接口自动化测试时,也需要部署一套接口自动化测试环境。为了能够在不同的环境下公共一套接口测试脚本,通常会在测试脚本中配置不同环境的域名地址,来实现在不同环境下对项目执行自动化测试的工作。


实战演练


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


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


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


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


(1)优化钱的测试用例


实战程序如下(Python 版和 Java 版)。


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.Testimport static io.restassured.RestAssured.given;import static org.hamcrest.core.IsEqual.equalTo;public class envTest{   //测试环境1——测试用例   @Test   void envOrg(){     given().             params("name","hogwarts").             when().             get("http://httpbin.org/get").             then().             body("args.name",equalTo("hogwarts"));   }   //测试环境2——测试用例   @Test   void envCeshiren(){        given().               params("name","hogwarts").               when().               get("https://httpbin.ceshiren.com/get").               then().               body("args.name",equalTo("hogwarts"));   }}
复制代码


以上代码虽然实现了多套测试环境下的接口测试,但是每个接口测试用例都需要设置对应的一个测试环境,一旦接口测试用例发生变化,那么每个接口测试用例都需要修改。


针对以上的问题,解决办法是,可以把域名统一放在环境配置(env)文件中进行管理,然后将请求中的 url 地址替换成环境配置文件中对应测试环境的 url 地址。


还可以在测试环境汇总添加默认配置信息,如 default 字段,default 用来配置默认使用的测试环境。例如,当前有多个测试环境,其中包括 org 环境和 ceshiren 环境,若 default 的值改成 org。执行测试用例时就会对 org 环境发起请求;若 defuse 的值改成 ceshiren,执行测试用例时就会对 ceshiren 环境发起请求。


(2)优化后的测试用例代码如下(Python 版和 Java 版)。


Python 演示代码

import requestsenvs = {    "default":"ceshiren",    "org":"http://httpbin.org/get",    "ceshiren":"http://httpbin.ceshiren.com/get"}# 测试用例def test_envs():# envs['default'] 代表 ceshiren,envs['ceshiren'] 代表对应的url    res = rquests.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://httpin.org/get"); envs.put("ceshiren","http://httpbin.ceshiren.ceshiren.com/get"); } @Test void envs(){ given(). param("name","hogwarts"). when(). get(envs.get(envs.get("default"))). then(). body("args.name",equalTo("hogwarts")); }}
复制代码


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


(3)优化后的测试用例


将 envs 配置信息存储到 envs.yaml 文件中,然后再测试脚本中定义读取 yaml 文件内容的函数,用以改变测试环境。


配置文件 envs.yaml 内容:


default:orgorg: http://httpbin.orgceshiren: http://httpbin.ceshiren.com
复制代码


Python 演示代码


import requestsimport yaml
#读取本地的配置文件yamldef 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") prin(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() throwa IOException{       ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());       TypeReference<HashMap<String,string>> typeReference = newTypeReference<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;   }    @Test    void 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 字段的值即可。

搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核

用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
软件测试 |多套测试环境下的接口测试_测试_测吧(北京)科技有限公司_InfoQ写作社区