51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2265|回复: 0
打印 上一主题 下一主题

利用 anyproxy 做 app 网络流量测试

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-6-26 15:04:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于app网络流量测试,通过流量测试可以发现app网络资源使用情况,网络流量也是用户体验中的一项重要内容,同时通过对网络流量数据分析,也可以发现一些app内在的问题。

针对流量测试,大多方法是针对android 应用的测试方法,iOS相关内容较少。
android应用大概有三种测试方法:

  • 通过读取系统文件获取流量数据。获取的数据内容是整体的数据,不便做更进一步分析。
  • 通过android系统提供的API获取。可能需要root权限。
  • 通过其他工具收集信息Appetizer、GT等。
  • 通过代理抓包,wireshark等。 iOS可能最好的办法应该是通过工具、网络代理获取流量信息。

通过代理的方式,可以抓取到明细的数据(请求资源地址、具体资源数据大小等),也方便做后续的具体分析,同时android、iOS应用均实用,不好的一点是对非WiFi情况需要想其他办法处理

入主题,本文是通过anyproxy做代理获取流量数据的一些测试尝试

选用anyproxy,主要是用的多了,感觉方便,主要一点是anyproxy的过滤规则机制可以发挥很多作用,了解[color=#069d6 !important]anyproxy
准备工作:准备测试机,设置代理,安装代理证书等等
anyproxy过滤规则rule.js ,我的过滤规则是讲请求资源地址、请求数据大小、接受数据大小记录到文件,主要内容如下:

  1. module.exports = {

  2.     // 获取接口的请求流量
  3.   *beforeSendRequest(requestDetail) {
  4.       if (requestDetail.url.indexOf("https") === 0) {
  5.         url = requestDetail.url;
  6.         requestLength = requestDetail.requestData.length;
  7.         // requestLength = requestDetail.length;
  8.         return null;
  9.       }
  10.   },

  11.   // 获取接口的响应流量
  12.   // 存储到文件
  13.   *beforeSendResponse(requestDetail, responseDetail) {
  14.       if (requestDetail.url.indexOf("https") === 0) {
  15.           responseLength = responseDetail.response.body.length;
  16.           fs.appendFile(interfaceLog, url + ',' + requestLength + ',' + responseLength + '\n', 'utf8', function(err) {
  17.             if(err) {
  18.               console.log(err);
  19.             }

  20.           });
  21.       return null;
  22.     }
  23.   },

  24. }
复制代码

标注一下:我用的anyproxy版本非最新版,用新版本的可以取response header中的x-anyproxy-origin-content-length字段获取返回相数据大小;还有一点这样的方式获取到数据流量大小与真实数据大小可能略有差异,我只取了一些数据与实际下载时的文件大小做了对比,后续有时间会通过使用多个工具方法等做对比。

拿淘宝android客户端做了一些测试

保存的log文件内容大致如下:

逗号做分隔,资源地址、请求数据大小、返回数据大小,单位是字节数。
然后再读取log文件内容,把信息存入数据库,统计数据库信息做分析。

def read_flow(log):
    # 读取anyproxy记录的流量数据计算流量
    # path = "/Users/*****"
    # filePath = path + log
    res = open(log)
    requestData = 0
    responseData = 0
    l = 0
    while 1:
        line = res.readline()
        # print "--line:", line
        if not line:
            break
        l = l + 1
        lineList = line.split(",")
        resource = lineList[0].split("?")[0]
        rex = [r'.*(?:.png|.jpg|.jpeg|.ico|.gif)', r'.*(?:.js)', r'.*(?:.css)', r'.*(?:.html)']
        reRes = 0
        type = 0
        for i in range(len(rex)):
            ls = lambda a: re.findall(rex, a.split("/")[-1])
            if ls(resource):
                reRes = i + 1
                break
      print "resource:", resource, reRes, "|", int(lineList[-2]), int(lineList[-1])
      # 插入数据库
        try:
            start_time = time.strftime("%Y-%m-%d %H:%M:%S")
            # insertSql = "insert into flow_2(resource, type, requestData, responseData, total_flow, create_time, tag) ****
            # db.query(insertSql)
        except:
            print u"sql插入数据库出错"
            return

取了三个场景首次启动淘宝并登录、切换淘宝底部的功能栏、查找一件商品添加到购物车并查看我的淘宝部分功能;
网络流量使用数据分别为:3.96902179718、4.89165401459、9.34268379211 单位MB
查询数据库信息,可以清晰的看到流量占用最多的请求,重复请求次数最多的请求,图片、js、css等等具体分类资源的请求数据
例如:
总流量消耗最多

图片流量消耗

js流量消耗

其他资源流量消耗

这样就比较清晰了了解到具体流量消耗数据,哪些消耗最多,哪些频繁请求次数最多等等,再做针对性的分析做处理。

进一步拓展

可以将流量数据收集过程集成到自动化测试的过程中,设置好多个场景,保存不同场景的流量数据信息,做标记,多次测试取基准值,设置好阈值,在自动化测试的过程中,收集信息,超过一定的范围,则预警,也是可以发现一些有问题的功能的;同时anyproxy作为代理工具也可以mock相关数据,为自动化测试提供了方便。

现在做app自动化测试、专项测试的那么多,你们是怎么做的?






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-22 09:47 , Processed in 0.064458 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表