前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >另类Mock Server猜想?

另类Mock Server猜想?

作者头像
用户5521279
发布2020-01-17 17:59:35
7540
发布2020-01-17 17:59:35
举报
文章被收录于专栏:搜狗测试搜狗测试

最近小编的同事在编写测试工具时,遇到了一个技术难点,经过我们的沟通实践后,解决了该问题。今天在这里与各位小伙伴们一起分享一下。

背景信息

有一个简单的客户端与服务器的交互逻辑:

  1. 程序A在启动运行之后,会向给服务器B发送数据a;
  2. 服务器B通过获取数据a之后,经过多重逻辑判断,返回数据b;
  3. 程序A接收到服务器B返回的数据b后,开始做后续的事情。

针对服务器B,目前已知的信息如下:

  1. 服务器B是第三方团队提供的,目前仅仅知道接口的输入和输出格式,对于内部的逻辑是不清楚的;
  2. 接口返回的内容是加密的,但是对于加密的算法未知;
  3. 接口返回的数据,有时有内容,有时没有内容;
  4. 接口返回的数据,当有内容时,结果会经常变化,不唯一。

我们要做什么?

验证程序A在接收到第三方接口返回的数据后,进行后续操作的正确性。

我们遇到的问题?

  1. 由于接口返回数据的不确定性,导致测试效率受到了很大的影响;
  2. 如果自定义构造接口返回数据,那么无法解决数据加密的事情。

解决方案

针对以上的背景与问题,我们制定了如下的解决方案:

  1. 与服务器B的开发进行沟通,让其提供一个HTTP协议的数据加密接口,通过该接口,可以将自定义的数据进行加密,从而解决问题2。
  2. 在本地搭建一台代理服务器,当代理服务器获取到程序A发送的请求时,自动返回经过加密之后得到的数据,从而解决问题1。

具体步骤

在这里我们选取了Python+mitmproxy搭建本地的代理服务器。

第一步:安装python3.x+mitmproxy;

  1. Python3.x的安装大家基本都可以自行搞定。
  2. mitmproxy的安装如下:
    1. Linux/Mac下安装:sudo pip3 install mitmproxy
    2. indows下安装:pip3 install mitmproxy
  3. 验证安装是否成功,运行以下命令 mitmdump --version

输出内容:

Mitmproxy: 5.0.1

Python: 3.7.4

OpenSSL: OpenSSL 1.1.0j 20 Nov 2018

Platform: Windows-10-10.0.18362-SP0

第二步:编写修改网络请求包的脚本插件;

mitmproxy 这个库提供了一项功能,即服务启动时可加载一个脚本,该脚本可以将符合条件的请求数据包内容进行定制化的修改,包括request和response的内容。

第三步:启动服务加载插件。

mitmweb -s addons.py

实例进行演示:

下面通过一个实例来简单说明我们是如何做到的。

addons.py

代码语言:javascript
复制
import test

addons = [
    test.TestCase()
]

test.py

代码语言:javascript
复制
import mitmproxy.http
from mitmproxy import ctx, http

class TestCase:
    def response(self, flow: mitmproxy.http.HTTPFlow):
        str = 'This is a test page!'
        if flow.request.url == "http://www.sogou.com/":
            flow.response = http.HTTPResponse.make(200)
            flow.response.set_text(str)
        else:
            return

runtest.py

代码语言:javascript
复制
import requests

url = 'http://www.sogou.com/'
response = requests.get(url)
print(response.text)

配置IE代理服务器:

启动代理服务器

mitmweb -s addons.py

演示结果:

1. 执行测试程序runtest.py得到如下结果如下:

2. 使用浏览器访问的结果如下:

至此,我们的问题已经得到了解决,但是另外一个想法又在脑袋里生成。

猜想:

当前团队使用的是一套开源的Mock Server,客户端可以通过配置Host,直接访问自定义返回的内容,但是这其中存在一个问题。当某一个功能需要同时请求一个Host中的两个接口A、B时,如果A的返回值需要自定义,B的返回值需要从原始线上获取,那么当前的Mock Server就无法解决了。原因是Mock Server无法为同一个域下的请求,同时提供访问两台不同实体服务器的功能,即无法提供代理功能。

所以我们想到了,如果在mitmproxy的基础上进行二次开发,那么我们就可以搭建一套既可以自定义返回又可以直接访问线上服务的Mock Server了。

后续我们团队会在这个猜想的基础上进行规划和实施,待有具体产出时再与大家进行分享,也欢迎大家一同交流。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 搜狗测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档