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


    背景介绍

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

    比如:

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

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

    这时我们要怎么办?

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

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

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

    如何使用MitmProxy作为正向代理

    实现Maplocal

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

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

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

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

    1. {
    2. "post": {
    3. "title": "百度一下",
    4. },
    5. "type": 1
    6. }

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

    1. {
    2. "post": {
    3. "title": "谷歌一下啦啦啦",
    4. },
    5. "type": 1
    6. }

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

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

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

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

    1. {
    2. "https:www.baidu.com":[
    3. {
    4. "jsonPath":"../data/maplocal/first_tab.json"
    5. }
    6. ]
    7. }

    MitmProxy脚本中:

    1. from mitmproxy import http
    2. from mitmproxy import ctx
    3. class InterceptRequests:
    4. def __init__(self):
    5. def request(self, flow: http.HTTPFlow) -> None:
    6. """
    7. 使用request事件实现map local
    8. :param flow:
    9. :return:
    10. """
    11. # GET 请求处理
    12. if method == "GET":
    13. pure_url = get_url_host(interceptUrl)
    14. url_data = get_json.get(pure_url)
    15. if url_data:
    16. interce_params = get_url_params(interceptUrl)
    17. params = get_json_value(get_path, pure_url)
    18. for para in params:
    19. if para.items() <= interce_params.items():
    20. jsonpath = para.get("jsonPath")
    21. jsonpath_abs = path(jsonpath)
    22. self.file_maplocal(flow, jsonpath_abs)
    23. addons = [
    24. InterceptRequests()
    25. ]

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

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

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

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

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

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

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

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

     

    文档获取方式:

    这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

    以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

  • 相关阅读:
    真offer收割机 第二弹~大厂如何考察候选人?(附答案详解)
    【路径规划】基于梯度下降算法求解自定义起点终点障碍路径规划问题附matlab代码
    大家都能看得懂的源码 - ahooks 是怎么处理 DOM 的?
    linux常用三剑客
    openssl客户端编程:一个不起眼的函数导致的SSL会话失败问题
    Python - 等待异步函数完成
    java基础巩固19
    安装Python的selenium模块时遇到问题
    Vue学习笔记(十):全局事件总线
    【python VS vba(系列2)】 python和vba读写EXCEL文件的方式比较 (建设ing)
  • 原文地址:https://blog.csdn.net/2301_77645750/article/details/132737905