Skip to content

多套被测环境

多套被测环境

简介

在敏捷迭代的项目中,可能会有多个不同的环境。那么在进行接口自动化测试时,我们可以通过使用一套接口测试脚本,通过切换域名地址配置,实现多套环境的自动化测试。

应用场景

当接口自动化脚本写完并在测试环境跑完了,需要切换到待生产环境,不可能一个一个接口的去修改他的地址,这时候就需要设置多套被测。

实战演练

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

  • 测试环境 1:http://httpbin.org/get
  • 测试环境 2:https://httpbin.ceshiren.com/get

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

(1)优化前的测试用例

  • Python 演示代码
import requests

# 测试环境1测试用例
def test_org():
    res = requests.get(url="http://httpbin.org/get", params={"name": "hogwarts"})
    print(res.json()["url"])
    assert res.json()["args"]["name"] == "hogwarts"

# 测试环境2测试用例
def test_ceshiren():
    res = requests.get("https://httpbin.ceshiren.com/get", params={"name": "hogwarts"})
    print(res.json()["url"])
    assert res.json()["args"]["name"] == "hogwarts"
test_org()
test_ceshiren()
  • Java 演示代码
import org.junit.jupiter.api.Test;
import 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 地址替换成 env 配置文件中对应环境的 url 地址。

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

(2)优化后的测试用例:

  • 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'] 代表对应的url
    res = requests.get(url= envs[envs['default']])
    assert res.status_code == 200
test_envs()
  • 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");
    }

    @Test
    void envs() {
        given().
                params("name", "hogwarts").
                when().
                get(envs.get(envs.get("default"))).
                then().
                body("args.name", equalTo("hogwarts"));
    }

}

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

(3)优化后的测试用例:

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'])
test_envs()
  • 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;
        }
    @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 字段的值即可。

总结

  • 多套被测环境切换