实战练习
分别准备两套测试环境,都对其发起 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测试用例
- @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 环境的请求。
优化后的测试用例
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
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
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 环境配置。每次切换环境时,都要逐个修改配置,维护成本非常高。
因此,就需要将环境配置信息 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
getEnvs() throws IOException { - ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
- TypeReference
> typeReference = new TypeReference>() { - };
- HashMap
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
envs = this.getEnvs(); - given().
- params("name", "hogwarts").
- when().
- //发送请求
- get(envs.get(envs.get("default"))).
- then().
- body("args.name", equalTo("hogwarts"));
- }
- }
当需要切换测试环境时,只需要改动配置文件 envs.yaml 中的 default 字段的值即可。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
