zoukankan      html  css  js  c++  java
  • 基于 fuzz 技术验证移动端 app 的健壮性

    问题定义

    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 


            长按二维码识别关注,您的支持是我们最大的动力。       

            公众号:测试梦工厂

            QQ一群:300897805

      

  • 相关阅读:
    C#中Linq查询基本操作
    Python中的四种数据结构
    20200917练习题
    SRS搭建自己的直播、点播系统
    20200916练习题
    20200915练习题
    20200914练习题
    20200911练习题
    UTF-8最多编码字符数(最多可以容纳多少数量的字符)?
    k8s新手必看
  • 原文地址:https://www.cnblogs.com/testdream/p/6220741.html
Copyright © 2011-2022 走看看