测试基础 基于 fuzz 技术验证移动端 app 的健壮性

思寒_seveniruby · 2016年06月06日 · 最后由 qb 回复于 2017年09月01日 · 4025 次阅读
本帖已被设为精华帖!

问题定义

app 发布后经常容易出现各种诡异的 crash, 这些 crash 固然可以通过各种崩溃分析服务去定位. 但是的确很影响用户体验.
在 crash 分类中有一类是后端接口引发的. 比如常见的引发 app crash 的原因

  • 接口自身变更, 接口失效或者超时, 比如用户进地铁
  • 接口格式变更. 字段缺失
  • 接口内容变更, int string 格式搞错了. 某些字段原本是有值后来就变成了 null

一旦出了问题, 后端背锅或者做兼容是常见的方案. 但是对于 app 自身来说,也需要加强健壮性测试.
健壮性的英文名字是 Robust, 音译为"鲁棒性"(也不知道是哪个文盲起的, 流传太广了, 很容易被听到 "撸棒性"...不忍直视啊 不建议使用...)

解决方案设计

在 app 和后端接口之间设置一个代理. 然后利用代理自身的技术来 mock 掉返回结果. 从而伪造返回值.
在伪造返回值的基础上, 判断原始的数值, 根据类型自动衍生出多种测试用例. 比如

  • 如果是数字, 自动取几个典型场景. 放大和缩小 N 倍. 0 -1 2.00001 等.
  • 如果是字符串. 根据长度自动缩短和延长内容. 并适当的取典型值, 比如""
  • 所有类型都会默认有机会出现 null

工具介绍

工欲善其事必先利其器, 所以周末在公司加班了一天做了这样一个 feature.
依赖的基础是我之前发帖介绍的接口测试框架. https://testerhome.com/topics/3614
这个代理工具自身已经被我剥离出来了.

startupapi
通用的接口测试工具, 基于录制并生成用例的设计.
测试技术交流 https://testerhome.com

Usage: startupapi [options]

  -r | --record
        录制模式, 会在特定的端口上开启代理, 或者mock模式
  -e | --export
        从数据文件中生成测试用例模板
  -m <value> | --mock <value>
        设定mock的规则, --mock $..name=xx,$..change=77 如果预期值是FUZZ则自动对特定字段进行fuzz, 比如--mock $..name=xx,$..change=FUZZ
  -p <value> | --port <value>
        监听的端口, 默认是7770
  -f <value> | --file <value>
        数据保存路径
  -u <value> | --url <value>
        限制mock使用的范围.  --mock quote.json,search.json
  -v | --verbose
        是否展示更多debug信息
  --help

startupapi --record --port 8787 --file proxy.har
startupapi --export har_file --url search,list
startupapi --mock --proxy 8787 --mock $..name=value,$..text=value2
startupapi --mock --proxy 8787 --mock $..name=FUZZ,$..text=value2 -url quote.json
startupapi  -r  -f /tmp/proxy.har -m $..name=xx -p 7777 -u quote.json

目前只支持了 json 结果的 mock 和 fuzz.
可以设定只 mock 特定接口特定字段 内容. 使用 JsonPath 指定要 mock 或者 fuzz 的接口字段.

mock 演示

这是一个 mock 的演示

#启动代理监听7777端口, 把所有接口返回内容里面的current字段设置为8888, 名字设置为testerhome.  原始的交互数据保存在/tmp/下.
startupapi  -r  -f /tmp/proxy.har -m $..name=testerhome,$..current=8888 -p 7777 

来个精细化版本的

#把所有的文本内容ST改成DD, 把9.98替换为77.7. 然后修改json结构中的当前价格
startupapi  -r  -f /tmp/proxy.har -m $..current=8888,9.98=77.7,ST=DD -p 7777 

fuzz 测试

把 mock 的结果值修改为 FUZZ 即可对特定的内容自动替换为 fuzz 类型的数据.
把 mock 结果值修改为 NULL, 即可模拟 json 里面的 null 情况.

#把所有的文本内容ST改成DD, 把9.98替换为77.7. 然后修改json结构中的当前价格
startupapi  -r  -f /tmp/proxy.har -m $..current=FUZZ,9.98=77.7,ST=DD -p 7777 

效果

分别在 Android 和 iOS 的 app 上发现了较多的功能出现崩溃. 大多是某些小字段为 null 引发的.
因为结果太惨不忍睹了, 就不发截图了.

晚些时间我会挑选几个大厂 app 的 crash 演示下

这个工具本身可用于简单的 mock 和 fuzz. 能快速有效的发现各种健壮性问题.
当然发现的这类 bug 大多优先级别也很低. 需要酌情处理.

想要吗

社区办个大会不容易, 为了支持下社区的活动.
我发一个福利, 凡报名参加大会的同学. 可以提前获得这个工具的预览版.

报名连接: http://www.bagevent.com/event/56573?bag_track=seveniruby
报名成功后关注 TesterHome 的微信号, 并发送自己报名的姓名和公司邮箱即可. 我会回复下载地址.

主持人 topic
大会组织者与社区贡献者 剪彩仪式, 庆祝社区注册工程师过万
恒温 Monkey 思寒 开幕致辞
淘宝 手淘移动测试性能保证体系
腾讯 腾讯应用宝质量保证体系
360 Android 安全测试体系
支付宝 跨平台自动化测试框架 Macaca
午餐
阿里游戏 持续交付与代码静态分析
ThoughtWorks 移动测试的 Mock 实践
Monkey 测试到质量转变之路
百度 移动测试新模式
雪球 跨平台自动遍历技术的利用
360 代码静态分析与自定义规则应用
新浪 创业公司安全测试体系
恒温 Monkey 思寒 闭幕 show
晚宴
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 25 条回复 时间 点赞

这我可以理解为 burpsuite 的自动化版?

#1 楼 @monkey 我也正在打造 burp 的插件 算是它的自动化版本

—— 来自 TesterHome 官方 安卓客户端

#2 楼 @seveniruby 你这个让我想到了一个东西。。。我懒。。不过我还是去做下吧。。。

前段时间也做了个基于 socket 的代理抓包,后面忙新需求就没有时间继续 mock response,这次没用 java 写吧

#4 楼 @quqing 哈哈, 由俭入奢易 由奢入俭难 开惯了跑车就难再开大巴了. 我基本只有写 android app 采用 java

定制化的 fuzz 测试更有用,有的放矢。我们之前公司做过无节操 fuzz 基本上不 fix

—— 来自 TesterHome 官方 安卓客户端

🙇 请问不开源嘛?最近一直在研究怎么实现 “可以设定只 mock 特定接口 的 特定字段 内容”……

#6 楼 @lamianxiaodian 一般都是这样的

#7 楼 @taurus 如果你不是很强需求自动化的话,你可以用 burpsuite or fiddler 额。。。

牛。。

#7 楼 @taurus 开源要等中国移动测试大会上, 我正在考虑放个预览版给所有参与大会的人

学习思路了。目前公司 app 端对接口数据处理的健壮性处理确实不足,很容易崩溃,正在想办法解决这个问题,只是接口并非 json 格式,要做一个转换层。

思寒的思维总是标新立异,最近刚刚接手一个 sdk 项目,到时候需要用到 mock,先 mark

期待开源 欣赏代码架构和实现,哈哈。

如果有一个良好的 crash reporting system, 是不是这种测试意义就比较小了呢?
用 live 用户的 crash report 来做反馈, 然后进行 fix, 感觉更有效一点吧。。

#16 楼 @stephen753 目前用着哪, bugly. 这是事前预防的方法. 两者结合用

appium 一直不解决 toast 问题。。。还有 app crawler 自己写脚本放在哪里执行? json 文件里嘛?

#18 楼 @xiaoan_2131 等新版本发布吧. 新版本里面会详细有介绍.

👍 期待开源~~~

不知道现在出了正式版了没有?

fenfenzhong [该话题已被删除] 中提及了此贴 11月04日 20:10

现在这个项目开源啦吗?

公司内部 有 bug 收集的,收集用户的崩溃日志,传到 server 而后 根据堆栈 进行分析定位

fenfenzhong 在 anyproxy 上做 mock 和 fuzz 测试 中提及了此贴 12月02日 14:11
扫地僧 回复

学习了,厉害,👍 。对你说的 socket 代理抓包也很感兴趣,可以说说大概的思路吗?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册