写点什么

技术分享 | 接口自动化测试,如何实现多套环境的自动化测试?

  • 2022-10-13
    北京
  • 本文字数:2302 字

    阅读完需:约 8 分钟

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


实战练习


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


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


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


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 requestsenvs = {"default": "ceshiren","org": "http://httpbin.org/get","ceshiren": "http://httpbin.ceshiren.com/get"}

测试用例

def test_envs():

envs['default'] 代表 ceshiren, envs['ceshiren'] 代表对应的 url

res = 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: orgorg: http://httpbin.orgceshiren: http://httpbin.ceshiren.com


优化后的测试用例


Python 版本


import requestsimport 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://qrcode.testing-studio.com/f?from=infoQ&url=https://ceshiren.com/t/topic/22265

用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

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

评论

发布
暂无评论
技术分享 | 接口自动化测试,如何实现多套环境的自动化测试?_霍格沃兹测试开发学社_InfoQ写作社区