如何在自动化测试中使用MitmProxy获取数据返回?

本文介绍了在接口自动化项目中遇到的动态数据和数据展示限制问题,提出使用MitmProxy作为正向代理,通过Maplocal功能实现对特定请求返回定制数据的方法,包括配置文件和Python脚本的编写示例。
摘要由CSDN通过智能技术生成

背景介绍

当我们在接口或UI自动化项目中,常常会出现这种现象——明明是正常请求,却无法获取到想要的数据返回。

比如:

场景A:页面是动态数据,第一次进入页面获取到的数据,和下次进入页面获取到的数据完全不一样。

场景B:页面数据有展示限制,页面某些模块或整个页面数据仅展示3次,且通过服务端返回控制。

这时我们要怎么办?

如果是手工测试时,我们大可以直接使用Charles、Fiddler进行模拟,毕竟代理软件基本能解决大部分测试需求。

那如果是在自动化项目中呢?如果还是使用代理软件——其实也不是完全不行,但我们还有更佳的实践方式。

也就是使用MitmProxy作为正向代理拦截请求和返回数据。

如何使用MitmProxy作为正向代理

实现Maplocal

MitmProxy是一个三方库,我们在程序中可以把它当成Charles来使用。

这里以实现Maplocal功能进行说明:

(1)Maplocal功能,简单理解就是当针对特定请求,返回特定数据。

比如请求"www.baidu.com",正常应该返回:

 
{
  "post": {
    "title": "百度一下",
    },
  "type": 1
}

但我们修改返回数据,只要有"www.baidu.com"请求过来,就让它自动返回:

{
  "post": {
    "title": "谷歌一下啦啦啦",
    },
  "type": 1
}

这就是一个最基础的maplocal案例。

(2)在MitmProxy里如何实现Maplocal功能呢?

这里以get请求实现进行说明:

get.json 配置文件,在这里记录所有需要拦截的get请求:

 
{
    "https:www.baidu.com":[
        {
            "jsonPath":"../data/maplocal/first_tab.json"
        }
    ]
}

MitmProxy脚本中:

 
from mitmproxy import http
from mitmproxy import ctx
 
class InterceptRequests:
 
    def __init__(self):
 
    def request(self, flow: http.HTTPFlow) -> None:
        """
        使用request事件实现map local
        :param flow:
        :return:
        """
        # GET 请求处理
        if method == "GET":
            pure_url = get_url_host(interceptUrl)
            url_data = get_json.get(pure_url)
            if url_data:
                interce_params = get_url_params(interceptUrl)
                params = get_json_value(get_path, pure_url)
                for para in params:
                    if para.items() <= interce_params.items():
                        jsonpath = para.get("jsonPath")
                        jsonpath_abs = path(jsonpath)
                        self.file_maplocal(flow, jsonpath_abs)
addons = [
    InterceptRequests()
]
 

在执行的脚本中(如本地shell 或 其他执行的py脚本里):

# kill mitmproxy
lsof -n -i:8999 | grep LISTEN | awk '{print $2}' | xargs kill
# start mitmproxy
mitmdump -p 8999  -s mitmHandler.py

启动脚本后,连接MitmProxy的设备的请求全部都会被脚本监控。

如果出现"www.baidu.com"的请求,就会到get.json里找到对应的json,自动返回给设备。

这样,就实现了一个最简单的maplocal。

当然基于目前的MitmProxy脚本,我们还可以进行一些功能扩展。

如针对接口类型get或post请求,针对请求参数类型json或x-www-form-urlencoded,都可以进行更多延伸扩展。

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

 文档获取方式:点击右边链接领取:软件测试全套资料分享   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值