之前的项目曾经遇到这样一个问题:
在弱网环境下,几乎每次打开排行榜,都会出现小菊花(加载中),但是在wifi环境下则不会,初步猜测是数据包太大,导致加载速度慢。
使用工具一查,进入排行榜,服务端返回的数据包居然达到了20KB,而我们的竞品,只有2.36KB。
流量测试是什么
流量测试是安卓APP性能测试的其中一个专项,测试APP在联网环境下,网络流量的消耗情况。
流量测试怎么做
使用过以下几种方式:
· 通过Adb获取流量数据,TesterHome上的一篇文章有详细的讲述,就不再重复了, 点击访问 。
· 使用tcpdump抓包,使用wireshark分析。
· 使用性能测试工具GT,Wetest,Emmagee,记录流量数据后,导出查看。
· 在游戏代码中打印,汇总流量数据。
最简单有效的方式
使用GT这类成熟的性能测试工具,可以直接生成csv文件导出,或者在云端通过图表形式展示。
transmittedreceived
min19108
max22137
avg21132
11:41:15.219108
11:41:16.420111
11:41:17.521136
11:41:18.722136
11:41:19.822137
11:41:21.022137
不足之处,只是单纯记录每一秒的流量消耗,无法记录是什么操作产生的流量消耗。另外,如果同一秒中产生了多个请求,消耗的记录会积累到一起。
tcpdump+wireshark可以精确到每一个请求产生的流量消耗,同样也无法直观知道具体是哪个操作。
最精确直观的方式
怎么样才能直观地查看每一个请求所属的操作呢?答案是自制一个流量统计工具。
工具原理:
在客户端代码内,每次请求发送与接收的时候,嵌入统计流量的代码,并汇总到一起,完成测试后,输出到文本上。
保存流量数据的工具类
public class TrafficCount {
private static Queue<string> trafficInfo = new Queue<string>();
public static void Add(string s) {
trafficInfo.Enqueue(s);
}
public static void WriteToFile(string filePath) {
StreamWriter sw = new StreamWriter(filePath);
foreach(var i in trafficInfo) {
sw.WriteLine(i);
}
sw.Close();
Debug.LogWarning("成功保存");
}
在客户端发送请求和接收响应的地方加入流量统计(已发送请求为例,截取了部分代码,这里采用了硬编码的方式,其实不太合理)
SocketError error;
var sended = mSocket.Send(output, SocketFlags.None, out error);
if (error == SocketError.Success) {
obj.OK();
//统计代码
this.Debug("成功发送 {0} 字节数据", sended);
TrafficCount.Add("成功发送"+ sended + "字节数据");
//统计代码
} else {
obj.Error();
this.Error("发送数据失败: {0}", error.ToString());
}
在主场景上,挂一个MonoBehaviour脚本,来调用开始统计和保存文件
void OnGUI() {
if (GUI.Button(new Rect(0, (Screen.height/2), 50, 30), "流量测试")) {
//监听发送请求和接收返回,获取操作的协议号
EventHelper.Ins.Get<SystemEventGroup>().onRequest.AddHandler((ss, req) => {
Debug.Log(req.Protocol);
TrafficCount.Add(req.Protocol.ToString());
});
EventHelper.Ins.Get<SystemEventGroup>().onResponse.AddHandler((ss, req) => {
Debug.Log(req.Protocol+"成功返回");
TrafficCount.Add(req.Protocol + "成功返回");
});
}
if (GUI.Button(new Rect(0, (Screen.height/2)+50, 50, 30), "保存")) {
TrafficCount.WriteToFile(@"C:VSTestesult.txt");
}
}
最终输出的文本是:
110101
成功发送77字节数据
接收到了55字节数据
110101成功返回
107501
成功发送84字节数据
接收到了28字节数据
107501成功返回
怎么优化
· 去除响应包的冗余内容,如排行榜只需要名称,所在工会,等级等数据,并不需要玩家阵型数据。
· 有些系统,无需每次点击都请求最新数据,如排行榜,进入后第一次点击里边的各个榜单会请求数据,在退出排行榜之前,再次切换榜单,会读取旧数据,不再发送新请求。
结论
时间段内流量的总消耗测试,建议使用GT类的工具。
具体协议的流量消耗测试,使用自制工具分析。
安卓性能专项之流量测试篇
发表于:2017-01-09
作者:煎饼的博客
来源:
- 周排行
- 月排行
-   软件测试之异常测试
-   MongoDB大数据高并发读写性能测试报告
-   可靠性测试教程:优秀实践综合指南
-   可靠性测试的基础知识——软件可靠性测试
-   压力测试如何准备数据?思路来了!
-   性能测试准入准出规范
-   性能测试常见术语浅析
-   Docker容器网络性能测试和调优策略
-   软件测试之异常测试
-   如何使用k6做性能测试
-   性能测试准入准出规范
-   稳定性测试怎么做,这篇文章彻底讲透了!
-   干货|性能测试模型初探及应用方法分析
-   可靠性测试教程:优秀实践综合指南