Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >移动端异常数据测试

移动端异常数据测试

作者头像
测试加
发布于 2022-03-24 07:51:55
发布于 2022-03-24 07:51:55
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

背景

在测试阶段或者在一些特殊环境,经常因为某些数据导致客户端崩溃.

比如后端接口数据返回某个字段为空、某个字段类型变了、数组为空等.此时如果客户端没有兼容这些异常行为,大多数情况会导致崩溃.

所以为了保证客户端在任何异常数据的情况下都能兼容(不崩溃),需要进行异常数据测试.

异常数据测试方法

在以前手工测试阶段,我们一般借助fidder或者charles工具.对返回结果拦截修改数据,再进行数据的maplocal.

比如对一个字段的返回值改为空,如下图:

异常数据修改规则

字符

  • 非法字符
  • 超长
  • null

数组

  • 空数组
  • 非法序列

接口超时

如3s、5s、10s

接口状态码

如404、500、503

增加数据

  • 数组
  • 字典

删除数据

  • 数组
  • 字典

自定义代理

制造异常数据的关键是对数据拦截并修改,上述讲到的使用charles工具.但是charles工具不太灵活、不能开发扩展脚本.

调研了一些目前比较好用的代理工具:

  • anyProxy<br> 开源使用Node.js开发的轻量级代理工具 https://github.com/alibaba/anyproxy/blob/master/docs/cn/src_doc.md
  • mitmproxy<br> mitmproxy使用比较小众,特点在于可使用python语言二次开发脚本,安装也比较简单.<br> https://mitmproxy.org

mitmproxy

本文主要选用mitmproxy二次开发,主要是因为结合python语言和python类库,比较容易上手.

mitmproxy安装

在mac环境下安装命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew install mitmproxy

mitmweb

mitmweb是提供的web可视化工具,界面提供查看和筛选接口数据.

启动命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mitmweb

mitmdump

mitmdump无交互界面的命令,可与python脚本对接.

启动命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mitmdump

脚本实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
拦截请求的request
"""

from mitmproxy import http

def request(flow: http.HTTPFlow):
    # redirect to different host
    if flow.request.pretty_host == "example.com":
        flow.request.host = "mitmproxy.org"
    # answer from proxy
    elif flow.request.path.endswith("/brew"):
    	flow.response = http.HTTPResponse.make(
            418, b"I'm a teapot",
        )

常用的API

实例request

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
flow.request.headers #获取所有头信息,包含Host、User-Agent、Content-type等字段
flow.request.url #完整的请求地址,包含域名及请求参数,但是不包含放在body里面的请求参数
flow.request.pretty_url #同flow.request.url目前没看出什么差别
flow.request.host #域名
flow.request.method #请求方式。POSTGET等
flow.request.scheme #什么请求 ,如https
flow.request.path # 请求的路径,url除域名之外的内容
flow.request.get_text() #请求中body内容,有一些http会把请求参数放在body里面,那么可通过此方法获取,返回字典类型
flow.request.query #返回MultiDictView类型的数据,url直接带的键值参数
flow.request.get_content()#bytes,结果如flow.request.get_text()
flow.request.raw_content #bytes,结果如flow.request.get_content()
flow.request.urlencoded_form #MultiDictView,content-type:application/x-www-form-urlencoded时的请求参数,不包含url直接带的键值参数
flow.request.multipart_form #MultiDictView,content-type:multipart/form-data
时的请求参数,不包含url直接带的键值参数

实例response

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
flow.response.status_code #状态码
flow.response.text#返回内容,已解码
flow.response.content #返回内容,二进制
flow.response.setText()#修改返回内容,不需要转码

设计流程

在上面提到可以拦截request和response,那么就可以对response数据做修改,再返回修改后的数据.

基于上面提到修改数据规则,随机多拦截数据做随机修改.

保存修改前和修改后的数据,方便数据diff.

设计流程图如下:

定义数据类型

例如png、html、img这些静态资源不需要修改,直接返回即可.

定义随机事件

目前做到的规则是,随机对接口做修改,基于定义好的随机事件.

  • 修改json
  • 修改字符串
  • 修改列表
  • 修改返回事件
  • 修复状态码

修改字符串

修改字符串是修改数据中最常用的方式,比如对返回json中的某一个字段或者多个名字一样的字段做修改value值.

遍历json

因为返回的json一般都是深层嵌套json数据,所以需要把json中的每一字段都组装成tree,形成一条链路.

在json中有东西叫jsonpath,通过jsonpath就可以找到对应的value值.

那么我们就可以遍历json,生成N条jsonpath路径.

重新生成json

有个上面我们提到jsonpath,我们就可以随机对一条或者多条jsonpath修改数据,然后重新set回去.

但是和遗憾的是python并没有现成的根据jsonpath修改json的库, 在网上参考了一些帖子并重新修改了一些代码,代码片段如下:

在修改数据之后调用flow.response.set_text把修改后的数据set回去.

数据diff

把每次数据修改前和修改后保存到本地log文件.

报告中记录每次的接口数据信息.

报告详情中展示接口详情.

效果

最终的执行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mitmdump -s proxyserver.py(二次开发脚本名字)

手机代理设置端口(127.0.0.1:80)

在使用这个脚本是结合了monkey脚本,也发现了一些因为数据异常的崩溃.

UI上展示修改数据

类型错误导致崩溃

结语

在着手开发工具的初衷在于降低移动端的crash率,因为在发现崩溃top5内基本上会看到空指针这类错误,但是这类错误也是在服务端异常或者某些特定场景下才会导致某个字段为空或者某类数据为空.

现在客户端处理的流程是,基于业务逻辑加入判空处理.但是这也是见一个问题处理一个问题,并且代码中加入冗余的异常处理逻辑.

前几天读了"美团外卖AndroidCrash治理之路"的帖子,这篇帖子中谈到了对于"crash"预防应该大于治理,提到很多种预防手段.所以我基于这种思想,看看是否能在测试阶段通过自动化手段mock出一些数据,来验证客户端的稳定性和兼容性.

但是如何要想把异常数据测试落地在工作上,其实最难的是如何"说服"开发同学解决这类问题.

代码地址: https://github.com/xinxi1990/mitmfuzz

参考

美团外卖Android Crash治理之路<br> https://tech.meituan.com/2018/06/14/waimai-android-crash.html

在anyproxy上做mock和fuzz测试<br> https://www.testwo.com/article/999

https://github.com/zhangzhao4444/XMonkey

代理服务器 AnyProxy<br> https://www.jianshu.com/p/2074f7572694

https://github.com/fwon/electron-anyproxy<br>

深入了解mitmproxy<br> https://www.cnblogs.com/c-x-a/p/9753526.html

Python实现json数据的jsonPath(精简版)定位及增删改操作<br> https://www.cnblogs.com/shouke/p/10157458.html

App爬虫神器mitmproxy和mitmdump的使用<br> https://cloud.tencent.com/developer/article/1151810

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
APP爬虫-mitmproxy安装与简单使用
我们通常使用的抓包工具就是Fiddler和Charles这种图形化的,Charles的优点是跨平台,Windows和Mac都可以使用,Fiddler的优点是功能“极其”强大,不仅拥有抓包功能,还拥有中间人攻击的功能,但是使用成本太高了,我们做爬虫开发,使用到Fiddler的功能不过十之二三罢了。今天我们主要讲的是mitmproxy这款工具,这是一款专业的中间人攻击工具,mitmproxy 不仅可以截获请求帮助开发者查看、分析,最最重要的是支持Python进行定制化二次开发。例如:截获浏览器的请求内容,并将数据处理后存储到数据库,再将内容交给浏览器;如果出现异常时,发出邮件通知,并返回给浏览器一个空的页面。 mitmproxy有以下几个特点:
星星在线
2020/05/22
2.2K0
教你用 Python 操控你的上网请求
今天给大家介绍个有意思的工具,不知道你有没有听说过中间人攻击(Man-in-the-middle attack)简称 MITM,是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”,看下这张图可能更容易理解。
纯洁的微笑
2020/03/18
9960
教你用 Python 操控你的上网请求
Mock 工具与定制化
mitmproxy 是一款开源、免费的代理工具,支持 mac、windows、linux。相比于其他代理工具,可以通过 python 和 mitmproxy 工具本身的插件机制实现通过脚本对 mitmproxy 的完全控制。强大的可拓展性和可定制性,可以让测试工程师以 mitmproxy 工具为基础,进行二次开发,打造更适合自己业务的 mock 工具。
霍格沃兹测试开发Muller老师
2024/06/27
1360
Mitmproxy 抓包工具安装使用
Mitmproxy是一个使用python编写的中间人代理工具,跟Fiddle、Charles等等的抓包工具是差不多的,同样可以用于拦截、修改、保存http/https请求。比起Fiddle、Charles,mitmproxy有一个最大的特点是支持python自定义脚本。
清风穆云
2021/10/18
1.4K0
Mitmproxy 抓包工具安装使用
有了mitmdump还不赶紧扔掉Charles
mitmproxy由三大功能模块组成,mitmproxy、mitmweb、mitmdump。
测试加
2022/06/21
1.3K0
有了mitmdump还不赶紧扔掉Charles
测试协议代理神器mitmproxy
mitmproxy 是一个免费的开源交互式的 HTTPS 代理。mitmproxy 就是用于MITM 的proxy,MITM即中间人攻击(Man-in-the-middle attack),用于中间人攻击的代理首先会向正常的代理一样转发请求,保障服务端与客户端的通信,其次会看看请求或者响应结果信息,记录其截获的数据或篡改数据,引发服务端或客户端特定的行为。
TestOps
2022/04/07
1.8K0
测试协议代理神器mitmproxy
Mitmproxy代理配置及接口加解密详细教程
mitmproxy 提供一个命令行界面(该命令不支持windows)。mitmdump 提供一个简单的终端输出。mitmweb 提供一个浏览器界面。
梦无矶小仔
2023/09/08
3.4K0
Mitmproxy代理配置及接口加解密详细教程
测开必备工具-Mitmproxy
推荐一款代理工具 mitmproxy ,功能比较强大,不但可以像fiddler一样抓包,而且可以通过编写python脚本过滤监听的数据,修改请求和响应。
搁浅同学
2022/07/21
8660
测开必备工具-Mitmproxy
Python好酷|抓包神器 mitmproxy
mitmproxy(Man-in-the-middle attack,中间人攻击代理)是一款提供交互能力的抓包工具,可以用来拦截、修改、保存 HTTP/HTTPS 请求,对于爬虫尤其是基于APP的爬虫来说,是必不可少的一款神器。mitmproxy 基于Python开发,可以通过Python代码对请求和响应进行自定义过滤和修改。
互联网金融打杂
2022/08/01
1.9K0
Python好酷|抓包神器 mitmproxy
最佳网络数据抓包工具mitmproxy
日常测试客户端需求,经常会使用Fiddler、Charles工具,抓取网络请求内容。Fiddler、Charles也有使用上的不足,比如Fiddler仅支持winsows、Charles是收费的,另外Fiddler、Charles在扩展开发脚本上都比较薄弱。
测试加
2022/06/21
8530
最佳网络数据抓包工具mitmproxy
[602]app抓包之mitmproxy的安装和使用
mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler、Charles的功能,只不过它通过控制台的形式操作。
周小董
2022/04/13
5.1K0
[602]app抓包之mitmproxy的安装和使用
快速搞定API自动化
在自动化测试中,个人觉得API是比较好测的了。 首先它比较稳定,不像UI总是变化。只要对接口比较熟悉,就能通过传递不同的参数,或者业务组合,就能验证不同的场景了。
赵云龙龙
2020/11/05
7700
proxy在app自动化中的应用
在做测试的时候,如果客户端有很多场景,我们又不太好造数据,可以考虑mock. app的mock怎么做呢?我们可以考虑用mitmproxy
赵云龙龙
2021/06/09
1.2K0
python抓包代理库mitmproxy
python中一个库mitmproxy,可以实现抓包;实现的就是代理的功能;相对于其他软件,优势在于可以编码;
JQ实验室
2022/11/04
1.1K0
Mitmproxy 的安装与使用案例
上篇文章简单介绍了手机端的抓包工具fiddler的使用,实现了抓取抖音某用户“喜欢”的视频列表的操作。
singleli
2020/10/22
2.3K0
Mitmproxy 的安装与使用案例
python mitmproxy 文档
1、顾名思义,mitmproxy 就是用于 MITM 的 proxy,MITM 即[中间人攻击],用于中间人攻击的代理首先会向正常的代理一样转发请求,保障服务端与客户端的通信,其次,会适时的查、记录其截获的数据,或篡改数据,引发服务端或客户端特定的行为。 2、不同于 fiddler 或 wireshark 等抓包工具,mitmproxy 不仅可以截获请求帮助开发者查看、分析,更可以通过自定义脚本进行二次开发。举例来说,利用 fiddler 可以过滤出浏览器对某个特定 url 的请求,并查看、分析其数据,但实现不了高度定制化的需求,类似于:“截获对浏览器对该 url 的请求,将返回内容置空,并将真实的返回内容存到某个数据库,出现异常时发出邮件通知”。而对于 mitmproxy,这样的需求可以通过载入自定义 python 脚本轻松实现。 3、但 mitmproxy 并不会真的对无辜的人发起中间人攻击,由于 mitmproxy 工作在 HTTP 层,而当前 HTTPS 的普及让客户端拥有了检测并规避中间人攻击的能力,所以要让 mitmproxy 能够正常工作,必须要让客户端(APP 或浏览器)主动信任 mitmproxy 的 SSL 证书,或忽略证书异常,这也就意味着 APP 或浏览器是属于开发者本人的——显而易见,这不是在做黑产,而是在做开发或测试。 4、那这样的工具有什么实际意义呢?据我所知目前比较广泛的应用是做仿真爬虫,即利用手机模拟器、无头浏览器来爬取 APP 或网站的数据,mitmproxy 作为代理可以拦截、存储爬虫获取到的数据,或修改数据调整爬虫的行为。 事实上,以上说的仅是 mitmproxy 以正向代理模式工作的情况,通过调整配置,mitmproxy 还可以作为透明代理、反向代理、上游代理、SOCKS 代理等,但这些工作模式针对 mitmproxy 来说似乎不大常用,故本文仅讨论正向代理模式。 5、python脚本不要小于3.6 6、安装完后,mitmdump 是命令行工具,mitmweb是一个web界面。
用户5760343
2022/05/14
1.1K0
python mitmproxy 文档
小巧实用的HTTP代理抓包工具:mitmproxy
这步比较简单,直接pip install mitmproxy,或者自行下载安装包。更多更详细的安装说明可以查看这篇文章:MitmProxy的安装
happyJared
2018/12/05
1.1K0
小巧实用的HTTP代理抓包工具:mitmproxy
使用mitmproxy进行埋点测试
mitmproxy不仅可以截获请求帮助开发者查看、分析,更可以通过自定义脚本进行二次开发。
zx钟
2021/10/11
9900
App爬虫神器mitmproxy和mitmdump的使用
mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler、Charles的功能,只不过它是一个控制台的形式操作。 mitmproxy还有两个关联组件。一个是mitmdump,它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处理。另一个是mitmweb,它是一个Web程序,通过它我们可以清楚观察mitmproxy捕获的请求。 下面我们来了解它们的用法。 一、准备工作 请确保已经正确安装好了mitmproxy,并且手机和PC处于同一个
崔庆才
2018/06/25
11.3K0
mitmproxy抓包 | Python实时生成接口自动化用例(三)
前面已经给大家分享了mitmproxy的环境配置和基本使用,文章浏览量很高,相信对抓包工具感兴趣的朋友,已经熟练运用起来了。
王大力测试进阶之路
2022/03/14
3.8K0
mitmproxy抓包 | Python实时生成接口自动化用例(三)
相关推荐
APP爬虫-mitmproxy安装与简单使用
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验