• 0
  • 0
分享

1、背景介绍

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

比如:

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

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

这时我们要怎么办?

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

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

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

2、如何使用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,都可以进行更多延伸扩展。


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   据报道,当地时间周三,OpenAI表示,已经修复ChatGPT一个明显漏洞,因为该漏洞的存在,少数用户可以看到其它用户与AI对话历史记录的标题。  OpenAI首席执行官山姆·阿尔特曼也发推文称,因为修复漏洞,太平洋标准时间3月20日部分时间无法查看个人聊天历史记录。  自去年推出以来ChatGPT快速成长,许多人试用。上周OpenAI将GPT-3.5升级到GPT-4,11月30日之前向用户开放。  市场分析咨询公司Similarweb认为,微软已经向OpenAI投入巨资,必应搜索整合ChatGPT能让搜索变得更有魅力,吸引更多人使用。作者:佚名原文链接:新浪科技_新浪网(sina.com...
            0 0 927
            分享
          • 1、简介ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java对象、数据库,FTP服务器,等等。JMeter可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。Apachejmeter可以用于对静态的和动态的资...
            12 12 7434
            分享
          •   在UI自动化中,一般先要找到需要操作的元素对象,然后进行操作。  定位元素成功与否,决定了你的用例的成败。所以定位元素很重要。  很多同学在用Selenium,Appium等做自动化的时候,有的时候却总能碰到这个熟悉的错误:  NoSuchElementException)  排查了很久,也找不到原因。一下子就懵了,刚才还好好的,这是怎么了?  UI 自动化,先天不足的就是不够稳定。很多因素导致定位不到元素。  可能网速导致还还没加载完全,你却已经操作了。  可能页面渲染慢,资源还没加载完全,特别是弱网情况下明显。  可能有广告等弹出框。  可能你等待时间不够,目标还没出现,你却先下手了。...
            0 0 4217
            分享
          •   在日常工作中基本每天都会与时间类型打交道,比如数据库每条数据的创建时间,更新的时候需要写入的更新时间,那么问题来了,如下:  它是要 UTC Time(世界统一时间)还是要本地时间?  日期的格式要怎么格式化?  我如果得到的是一个时间戳,我该怎么转成目标时间?  我如果想把数据库的时间转成时间戳我改怎么处理?  等等等等  上面说的这些,不复杂,但是你不能不知道,如果连这类的基础在用到的时候都需要去检索,那么就不用谈效率了。  下面,咱们通过几个实例,一起来看一下使用 datetime 这个库做日期和时间的管理和转换。  实例 1:获取当前时间import time from&...
            0 0 804
            分享
          •   《日经新闻》援引微软总裁的话称,微软公司将在未来两年内对日本投资约 29 亿美元,以强化其在日本的人工智能 (AI) 业务。  微软总裁 Brad Smith 表示,这是该公司在该国最大的一笔投资,旨在强化用于生成式人工智能的数据中心等基础条件。该公司将在日本首相岸田文雄访问美国时宣布该计划。  知情人士透露,这家美国科技巨头还计划在东京开设其在日本的首个研究基地。据报道,微软将通过引入图形处理单元来升级其位于东京和大阪的数据中心设备。  此外,该公司计划在日本宣布一项为期三年的 AI 培训计划,为 300 万名员工提供相关知识,并在东京设立一个新的实验室,用于机器人和人工智能的研发。作者...
            0 0 708
            分享
      • 51testing软件测试圈微信