移动性能测试 Android App 持续集成性能测试:启动流量 (2)

debugtalk · 2016年05月12日 · 最后由 0x88 回复于 2016年06月14日 · 5354 次阅读
本帖已被设为精华帖!

上一篇文章中,介绍了一种测试 Android App 启动流量的方法。当时也提到了,通过读取/proc/uid_stat/<UID>/目录下的tcp_rcvtcp_snd文件,只能得到 App 的流量总值,无法得到更细化的数据。

例如,UC 浏览器国际版在启动后,会和美国的服务器进行通讯交互,如果我们想测试浏览器在启动后与美国服务器的通讯流量,要怎么实现呢?。

本文便是针对这类场景的测试需求,讲解如何采用tcpdump测试得到更细化的流量数据。

tcpdump

tcpdump,是一个在 Unix-like 系统中通用的网络抓包工具,当然,这个工具在 Android 系统中也是可以使用的。

对于工具本身,本文不做过多介绍。为了防止有读者之前完全没有tcpdump的使用经验,在这里我只简单地进行几点说明:

  • 大多 Android 系统默认未集成 tcpdump 工具,我们需要事先将专门针对 Android 系统编译好的的 tcpdump 导入到 Android 系统,例如/data/local/tmp/tcpdump;当然,我们也不用自己编译,在androidtcpdump网站就可以下载到编译好的 tcpdump 二进制文件。
  • 运行tcpdump工具时需要 root 权限。
  • tcpdump 命令支持许多参数,常见的有:
    • -i指定网卡(interface),any表示不限网卡;
    • -c指定接收的 packets 数量,接收完成后自动停止抓包;
    • -w指定输出文件,输出文件的格式为 pcap;
    • -s(--snapshot-length) 指定在每个 packet 中最多截取的字节数,设置为 0 时表示截取上限取默认值 262144;
    • -v/-vv/-vvv,指定输出的详细程度,针对流量测试,我们不需要非常详尽的输出数据,取-v即可。

基于以上对tcpdump的介绍,我们要测试浏览器在启动后与美国服务器的通讯流量,就只需要先启动浏览器,然后在adb shell中执行以下命令即可。

1|shell@hammerhead:/ $ su -c /data/local/tmp/tcpdump -v -i any -s 0 -c 2000 -w /sdcard/us.pcap
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
2000 packets captured
2024 packets received by filter
0 packets dropped by kernel

在这里之所有指定接收 packets 数为 2000,是因为浏览器启动后并不是立即与美国服务器进行通讯。所以在这里设置了一个比较大的值,确保浏览器与美国服务器的异步通讯数据能包含在这 2000packets 之中。当然,这个 2000 只是一个工程实践得到的经验值,具体取多少还是要依赖于具体场景。

经过一段时间的抓包后,就生产了抓包结果,即/sdcard/us.pcap

人工分析 pcap 文件

拿到 pcap 文件只是第一步,我们必须要对这个文件进行解析才能得到我们想要的结果。

那么,通过什么方法解析 pcap 文件呢?

先简单介绍下 pcap。pcap,即packet capture的缩写,是一种通用的网络抓包数据存储格式。既然是通用,因此它除了可以被tcpdump解析外,还支持被多种网络工具解析,其中,就包括大家熟知的wireshark

至于为什么有了tcpdump还要用wireshark来解析,这主要还是因为wireshark是图形界面,操作和使用上更友好一些。

wireshark中分析 pcap 文件十分简单,只需要直接打开文件,就可以看到抓包过程中捕获的所有网络通讯数据。不过,由于我们抓包获得的数据是系统层面的,除了我们关注的与美国服务器的通讯交互外,还包含了非常多的其它通讯信息。

好在wireshark有非常强大的筛选功能。对于本案例,我们可以先确定出美国服务器的 host 或 IP,例如 host 为ucus.ucweb.com,那么我们就可以在筛选器中通过http.host == "ucus.ucweb.com"语句,即可筛选出所有本地与美国服务器的通讯交互数据。

对于更丰富的筛选功能,大家可以根据实际需求查询wireshark的帮助文档,在此就不再进行展开。

从上图的筛选结果中可以看到,美国服务器的地址为168.235.199.134。那接下来如何查看通讯的流量大小呢?

首先,找出该次请求的TCP Stream

在筛选出的TCP Stream中,将各条记录的 Length 进行求和,即可得到总的大小。

例如,发送流量的总和,即100.84.126.160->168.235.199.134的总和,加和总值为 3722bytes;接收流量的总和,即168.235.199.134->100.84.126.160的总和,加和总值为 6300bytes。

当然,这里只是为了讲解计算流量的原理,实际上,我们并不需要去进行这个计算,可以直接读取得到总值。

【Statistics】->【Endpoints】

在 Endpoints 界面中,选择TCP tab,勾选 “Limit to display filter”,即可看到通讯流量汇总数据。

可以看出,这个的汇总数值与前面计算得到的数值完全相同。

自动化测试脚本

通过前面的人工分析,我们已经掌握了分析特定流量的一般性方法。然而,要想将此种场景的流量测试加入持续集成自动化测试系统,采用以上方法显然是不行的。

那么,要怎样才能在代码中完成对 pcap 文件的分析呢?

好在已经有前辈做了相应的工作,在 GitHub 上就找到了一个开源项目pcap2har,可以实现对 pcap 文件的解析。

pcap2har项目的详细介绍请大家自行查看项目文档。

针对本文中的测试场景,我们就可以基于 pcap2har,实现自动化测试脚本。

如需查看 Python 代码实现,点击【源码】进行阅读。

http://debugtalk.com/assets/images/wechat_qrcode.png

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 14 条回复 时间 点赞

我们觉得社区还是尽量不要贴二维码,谢谢

#1 楼 @monkey 之前不是说可以的么?再说,直接单独把二维码给删了也不合适吧?

好文!
PS:可以贴官网地址,感兴趣的都会去看的。

好贴,非常有帮助

好贴,收藏了。

#5 楼 @sziitash 多谢鼓励

感谢分享

#7 楼 @testly 多谢大神鼓励

好内容,多谢分享

写的真好,不过我有个疑问 这个测试出来的值做什么用呢,好像目前行业对这个没什么标准,也就是说 我拿到这个值实际不知道 它到底合格呢还是合格呢?

#10 楼 @qiujiwuhen 这个值的确没有统一标准,都是公司自己定的。至于这个值有什么用,这个就看公司自身的需求了。之前在 UC 的时候,一般都是业务人员根据需要选的测试指标,测试人员提供技术获取这些值。

@debugtalk 谢谢 我明白啦

谢谢分享,提供了一个更细纬度的分析方法

我想知道这个工具能不能做把 tcp 协议中的 PSH 推送数据的 data 流的获取?
如图所示,

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