返回

自建一个代理服务器,解决接口自动测试的麻烦事

开发工具

最近在做一个需求: 由于是子线程轮询执行的,属于纯数据层的逻辑,所以涉及的情况比较复杂。自测时如果利用Charles进行mock,只能进行固定模拟,而笔者想实现的效果类似:

  • 1.每次发起请求都能自己指定http状态码
  • 2.能够满足返回多种不同数据结构格式数据的能力
  • 3.可以实现报文body模糊匹配
  • 4.流量走代理可以看明文,断点看报文

所以就想到了实现一个自己的代理服务。需求明确了,接下来就是设计思路。

我们的目标是处理http请求/响应的代理服务器。这就涉及到怎么处理这些请求和响应,比如怎样区分请求与响应,数据怎样传输给客户端。

先说结论,笔者采用的是mina框架,mina框架轻量级,学习简单,完全能胜任这个任务。

框架 选定了,接下来就是编码了。核心逻辑就是怎么处理mina框架发来的数据,并将其转换成用户可用的数据。

我们知道http协议是基于文本的,服务端和客户端通过文本进行交互,通过解析文本,就可以得到客户端传来的数据,然后组织成想要的response。

当然还有更关键的一点,就是如何配置Charles。

Charles是一个专业的代理工具,可以帮助我们截取网络请求,并对其进行修改。
我们都知道HTTP协议是基于文本的,服务端和客户端通过文本进行交互,通过解析文本,就可以得到客户端传来的数据,然后组织成想要的response。
当然还有更关键的一点,就是如何配置Charles。

Charles是一个专业的代理工具,可以帮助我们截取网络请求,并对其进行修改。

使用Charles,我们需要把Charles的端口设置与自己的代理端口一致,并且在我们的程序中设置好Charles的ip地址和端口。

到这里代理服务器算是搭建好了,Charles也配置好了,接下来就是进行测试。

我们采用restassured作为测试框架,利用Charles代理RestAssured就可以进行接口测试了。
我们采用restassured作为测试框架,利用Charles代理RestAssured就可以进行接口测试了。

测试数据如下:

{"code":1,
"message":"success",
"data":1}

测试类代码如下:

@Test
public void post_test() throws Exception {
    //1. 通过restassured发送请求到代理服务器
    Response response = RestAssured.given()
            .config(RestAssured.config()
                    .httpClient(HttpClientConfig.httpClientConfig()
                            .setProxy("localhost", 8888)))
            .baseUri("http://www.baidu.com")
            .port(8888)
            .contentType("application/json")
            .body("{\"code\":1,\"message\":\"success\",\"data\":1}")
            .post("/");
    //2. 取出代理服务器返回给restassured的数据
    String body = response.getBody().asString();
    System.out.println(body);
}

运行测试类,就会发现,我们修改后的数据正常返回。

到这里,整个代理服务器开发和接口测试,就算是完成了。

通过上面的介绍,相信大家已经对自建一个代理服务器有了一定的了解。希望这篇文章对您有所帮助!

如果您有任何问题,请随时与我联系。