8.如何实现多环境下的接口测试

我是山茶,一个探索AI+测试的程序员!

一、多环境接口测试实现的核心

实现多环境下的接口测试的核心 "在请求之前,对请求的url进行替换"

实现这一核心主要的步骤可以分为

  1. 需要二次封装requests,对请求进行定制化。

  2. 将请求的结构体的ur从一个写死的ip地址改为一个(任意的)域名。

  3. 使用一个 env 配置文件,存放各个环境的配置信息。

  4. 然后将请求结构体中的url替换为env配置文件中个人选择的url。

  5. 将env 配置文件使用yaml 进行管理。

每个步骤看起来挺简单的,但是要实施起来要做很多事情

二、实现多环境测试按步

json 复制代码
使用代码编写一个本地接口:http://127.0.0.1:8080/shancha/test_one

接口返回内容为{"name":"山茶","公众号":"程序员山茶"}
  1. 二次封装requests,对请求进行定制化

基础请求方法实现:

python 复制代码
# 一、设定基础 

# 1.引入requests模块
# 2.设计Api类
# 3.类中增加send方法,方法设定data传入参数,data为字典类型
# 4.send方法中通过requests.request()方法发送请求,request()中传入对应参数,字典key的方式获取

import requests

class Api:
    def send(self, data:dict):

        res = requests.request(method=data["method"], url=data["url"], headers=data["headers"])
        return res
        
 # 二、设定测试类
 # 1.设计TestApi类
 # 2.编写测试方法test_send(self)
 # 3.方法中通过对象引入测试方法
 # 4.设定参数data
 
 from InterfaceTestingDifferentEnv import ApiDemo

class TestApi:
    data = {
        "method": "get",
        "url": "http://127.0.0.1:8080/shancha/test_one",
        "headers": None
    }

    def test_send(self):
        api = ApiDemo.Api()
        print(api.send(self.data).text)

执行结果显示与预期结果一直

  1. 将请求的结构体的ur从一个写死的ip地址改为一个(任意的)域名

在改写参数时我们可以使用代码中的replace来替换对应url数据

kotlin 复制代码
# 修改原方法中代码块,增加第四行以及第五行数据,执行查看结果
def send(self, data:dict):

    data["url"] = str(data["url"]).replace("127.0.0.1","test_code")
    print(data["url"])
    res = requests.request(method=data["method"], url=data["url"], headers=data["headers"])
    return res

如图所示,对应的域名已经被替换为"test_code"

通过这种方式我们能够将对应的url替换为任意的环境,但是这种方式还是相对来讲较为传统,有一个明显的缺点,每执行一次,就要调整一次代码

  1. 使用一个 env 配置文件,并将请求中的url替换为 env 配置文件中选择的url

为解决第2点这个问题,我们可以将环境配置信息整合为一个env配置文件,通过调用配置的方式来替换testcode域名

python 复制代码
# 1.在原请求方法中增加env环境存储信息
# 2.在参数请求前,通过读取env配置的方法将url替换
# 一、请求方法类
import requests

class Api:
    env = {
        "default": "dev",
        "test_other": {
            "dev": "127.0.0.1",
            "test": "127.0.0.2"
        }
    }
    def send(self, data:dict):
        data["url"] = str(data["url"]).replace("testcode", self.env["test_other"][self.env["default"]])
        print("传入的url数据是::"+data["url"])
        res = requests.request(method=data["method"], url=data["url"], headers=data["headers"])
        return res
  
  # 测试类      
from InterfaceTestingDifferentEnv import ApiDemo

class TestApi:

    data = {
        "method": "get",
        "url": "http://testcode:8080/shancha/test_one",
        "headers": None
    }

    def test_send(self):
        api = ApiDemo.Api()
        print(api.send(self.data).text)

注意⚠️:

  • self.env["test_other"][self.env["default"]] 等同于 self.env["test_other"][self.env["dev"]]

点击执行,结果与第一次基础结果一致,且请求url中"testcode"被更换为指定参数,以后每次执行只要修改default内容即可,但相较于只修改配置yaml文件而言,此种方式仍存在问题

  1. 将env 配置文件使用yaml 进行管理

将 env 配置文件真正使用 yaml 数据驱动,实现多环境下的接口测试

为防止手动创建yaml文件出现问题,可以使用代码转换yaml文件

python 复制代码
# 1.创建新类,引入yaml包,打开一个文件,并赋予可写权限
# 2.使用yaml.safe_dump写入数据

import yaml

def test_yaml2():
    env = {
        "default": "dev",
        "test_other": {
            "dev": "127.0.0.1",
            "test": "127.0.0.2"
        }
    }
    with open("env.yaml", "w") as f:
        yaml.safe_dump(data=env, stream=f)

执行后yaml文件创建成功

调用方式修改,直接读取 env.yaml 文件配置

kotlin 复制代码
# 1.直接讲env变量读取修改即可
# 2.后续环境发生改变可以直接修改文件即可

import requests
import yaml


class Api:
    # env = {
    #     "default": "dev",
    #     "test_other": {
    #         "dev": "127.0.0.1",
    #         "test": "127.0.0.2"
    #     }
    # }
    env = yaml.safe_load(open("env.yaml"))
    def send(self, data:dict):
        data["url"] = str(data["url"]).replace("testcode", self.env["test_other"][self.env["default"]])
        print("传入的url数据是::"+data["url"])
        res = requests.request(method=data["method"], url=data["url"], headers=data["headers"])
        return res

与预期结果一致,结果未发生改变,但是执行确实更加便利简介

三、最后

实现在多环境下进行接口测试,同样的测试用例,我们可以选择更加简洁方便的方法来实现,使用配置文件能够解决很多代码修改问题

相关推荐
oscar9998 分钟前
OpenCode Go :为开放编码模型准备的低价订阅方案
开发语言·后端·golang
Rust研习社1 小时前
Reqwest 兼顾简洁与高性能的现代 HTTP 客户端
开发语言·网络·后端·http·rust
绿草在线1 小时前
SpringBoot请求与响应全解析
spring boot·后端·lua
Victor3562 小时前
MongoDB(103)如何处理分片集群中的数据不一致?
后端
Victor3562 小时前
MongoDB(104)如何处理MongoDB中的磁盘空间不足问题?
后端
立莹Sir3 小时前
商品中台架构设计与技术落地实践——基于Spring Cloud微服务体系的完整解决方案
分布式·后端·spring cloud·docker·容器·架构·kubernetes
杨凯凡10 小时前
【021】反射与注解:Spring 里背后的影子
java·后端·spring
Ares-Wang10 小时前
Flask》》 Flask-Bcrypt 哈希加密
后端·python·flask
小码哥_常10 小时前
Spring Boot项目大变身:为何要拆成这六大模块?
后端
码事漫谈12 小时前
兵临城下:DeepSeek-V4 的技术突围与算力“成人礼”
后端