• 公司如何实现多套环境的自动化测试?


    实战练习

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

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

    1. import requests
    2. # 测试环境1测试用例
    3. def test_org():
    4. res = requests.get(url="http://httpbin.org/get", params={"name": "hogwarts"})
    5. assert res.json()["args"]["name"] == "hogwarts"
    6. # 测试环境2测试用例
    7. def test_ceshiren():
    8. res = requests.get("https://httpbin.ceshiren.com/get", \
    9. params={"name": "hogwarts"})
    10. assert res.json()["args"]["name"] == "hogwarts"

    Java 版本

    1. import org.junit.jupiter.api.Test;
    2. import static io.restassured.RestAssured.given;
    3. import static org.hamcrest.core.IsEqual.equalTo;
    4. public class envTest {
    5. // 测试环境1测试用例
    6. @Test
    7. void envOrg() {
    8. given().
    9. params("name", "hogwarts").
    10. when().
    11. get("http://httpbin.org/get").
    12. then().
    13. body("args.name", equalTo("hogwarts"));
    14. }
    15. // 测试环境2测试用例
    16. @Test
    17. void envCeshiren() {
    18. given().
    19. params("name", "hogwarts").
    20. when().
    21. get("https://httpbin.ceshiren.com/get").
    22. then().
    23. body("args.name", equalTo("hogwarts"));
    24. }
    25. }

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

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

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

    优化后的测试用例

    Python 版本

    1. import requests
    2. envs = {
    3. "default": "ceshiren",
    4. "org": "http://httpbin.org/get",
    5. "ceshiren": "http://httpbin.ceshiren.com/get"
    6. }
    7. # 测试用例
    8. def test_envs():
    9. # envs['default'] 代表 ceshiren, envs['ceshiren'] 代表对应的url
    10. res = requests.get(url= envs[envs['default']])
    11. assert res.status_code == 200

    Java版本

    1. import org.junit.jupiter.api.Test;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import static io.restassured.RestAssured.given;
    5. import static org.hamcrest.core.IsEqual.equalTo;
    6. public class envTest {
    7. public final static Map envs = new HashMap();
    8. static {
    9. envs.put("default", "ceshiren");
    10. envs.put("org", "http://httpbin.org/get");
    11. envs.put("ceshiren", "http://httpbin.ceshiren.com/get");
    12. }
    13. @Test
    14. void envs() {
    15. given().
    16. params("name", "hogwarts").
    17. when().
    18. get(envs.get(envs.get("default"))).
    19. then().
    20. body("args.name", equalTo("hogwarts"));
    21. }
    22. }

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

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

    配置文件 envs.yaml 内容:

    1. default: org
    2. org: http://httpbin.org
    3. ceshiren: http://httpbin.ceshiren.com

    优化后的测试用例

    Python 版本

    1. import requests
    2. import yaml
    3. # 读取本地yaml配置文件
    4. def get_envs():
    5. with open('envs.yaml', 'r') as file:
    6. return yaml.safe_load(file)
    7. # 测试用例
    8. def test_envs():
    9. # 获取环境配置信息
    10. envs = get_envs()
    11. # 发送请求
    12. res = requests.get(url= envs[envs['default']] + "/get")
    13. print(res.json()['headers']['Host'])

    Java 版本

    1. import com.fasterxml.jackson.core.type.TypeReference;
    2. import com.fasterxml.jackson.databind.ObjectMapper;
    3. import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
    4. import org.junit.jupiter.api.Test;
    5. import java.io.File;
    6. import java.io.IOException;
    7. import java.util.HashMap;
    8. import static io.restassured.RestAssured.given;
    9. import static org.hamcrest.core.IsEqual.equalTo;
    10. public class envTest {
    11. //读取yaml本地的配置文件
    12. public HashMap getEnvs() throws IOException {
    13. ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    14. TypeReference> typeReference = new TypeReference>() {
    15. };
    16. HashMap envs = null;
    17. String filePath = this.getClass().getResource("env.yaml").getPath();
    18. envs = objectMapper.readValue(new File(filePath), typeReference);
    19. return envs;
    20. }
    21. @Test
    22. void envs() throws IOException {
    23. // 获取环境配置
    24. HashMap envs = this.getEnvs();
    25. given().
    26. params("name", "hogwarts").
    27. when().
    28. //发送请求
    29. get(envs.get(envs.get("default"))).
    30. then().
    31. body("args.name", equalTo("hogwarts"));
    32. }
    33. }

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

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

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

  • 相关阅读:
    发布 .NET 7 MAUI / MAUI Blazor 应用到 Windows 应用商店
    基于Lattice的密码学
    Vue + moment 实现自定义日历
    分布式日志和链路追踪
    Go的unsafe.Pointer
    【Linux】环境变量
    宝塔等Nginx环境添加允许跨域Header头
    DNS 查询原理详解
    VoLTE端到端业务详解 | 掉话问题
    Js高级技巧—拖放
  • 原文地址:https://blog.csdn.net/2301_78843735/article/details/134334223