弱网测试
1.1 为什么要做弱网测试?
弱网测试,属于健壮性测试范畴。随着国内移动端迅猛发展,大大增加了用户碎片化使用app的场景。因此,针对地铁、巴士、电梯、车库等场景,我们需要针对这些场景的弱网环境下,验证app在出现丢包、延时等异常网络下的处理机制,避免因用户体验不友好而造成用户的流失。
- 用户体验
app使用过程中,弱网的高延迟和高丢包,在实时性要求非常高的场景,容易损失用户体验。
- 非正常情况下,出现bug概率会增加
在日常需求中,经常会遇到一些用户反馈一些无法简单复现的bug,有很大一部分的bug是由于用户自身的网络环境波动,或者是本身网络环境就较为恶劣。而服务面对这种恶劣的网络环境的健壮性不够,导致会出现一些意想不到的bug。
1.2 衡量网络性能好坏的指标
在测试网络性能之前,我们需要先知道衡量网络性能好坏的几个指标:
- 带宽(吞吐量):单位时间内传输的数据量,单位通常是:每秒比特数:bps。带宽反映了网络的传输能力,越大越好。
- 丢包:数据丢包个数=发送的数据包数-接收的数据包数。丢包反映了网络可靠性,越小越好。
- 时延:数据包从发送开始到接收到该数据,所耗费的时间,单位通常是ms。时延反映了网络的速度,越小越好。
- 抖动:指时延的变化,即两个数据包时延的差值。抖动反映了网络的稳定性,越小越好。
- 乱序:指接收到的数据包顺序和发送顺序不一致的次数。乱序反映了网络的稳定性,越小越好。当乱序比较严重的时候,丢包也会比较严重,所以一般都以丢包指标为主,忽略乱序指标。
1.3 常用网络环境的参数参考及测试点
1.4 移动端弱网测试
1.4.1 方法一:利用抓包工具charles进行弱网设置,适用PC端和移动端(IOS/Android)
- 以charles 4.5.6版本为例,下载charles并按照指引进行安装
- 打开Proxy->Throttle Settings
- 打开Throttle Settings界面如下
配置参数说明:
- Bandwidth:带宽,即上行、下行数据传输速度
- Utilisation:带宽可用率,大多数现代互联网连接利用率是100%
- round-trip latency:第一个请求的时延,单位是ms。
- MTU:最大传输单元,即TCP包的最大size,可以更真实模拟TCP层,每次传输的分包情况。
- Releability:指连接的可靠性。这里指的是10kb的可靠率。用于模拟网络不稳定。
- Stability:连接稳定性,也会影响带宽可用性。用于模拟移动网络,移动网络连接一般不可靠。
charles的预设已经有常用的网速模拟设置,同时也可以根据需要,自己添加设置。
- 下面就可以按照charles工具的正常方法进行测试
1.4.2 方法二:利用第三方工具的限速功能
Android端
QNET:一个独立app,为用户提供快捷、可靠的弱网络模拟服务。(目前只支持Android)
- 扫描下面二维码,按照指引进行安装
- 登录
首次使用QNET的用户,可以使用QQ账号首次登陆,需要注册WeTest平台账号,即可成功登陆。
- 选择待测试app
成功登陆后,点击【点击选择测试程序】按钮,选择待测试的弱网工具,然后点击下方的【开始测试】按钮,第一次启动的时候需要对悬浮窗权限进行授权,部分机型会弹出开启VPN服务的确认框,点击确认。
- 弱网设置
QNET支持系统预设模板和用户自定义模板。
- 开始测试
点击开始测试按钮后,QNET会自动拉起待测试程序,然后默认会显示弱网模板控制悬浮窗,以及弱网模板信息悬浮窗。
【左边悬浮窗是控制悬浮窗,可以下拉即时切换弱网模板,双击Q按钮可以切回QNET应用,点击暂停按钮可以停止弱网状态恢复正常网络;右侧悬浮窗显示当前的模板名,实时延迟,实时网速,以及当前模板的具体参数。】
iOS端
使用手机自带的限速功能(只适用IOS设备),且需要先打开开发者选项。
- 打开IOS设备,设置->开发者->NETWORK LINK CONDITIONER
- 打开Status进入后,选择预设或者自定义设置即可
1.5 web端弱网测试
1.5.1 方法一:利用抓包工具charles进行弱网设置,参见1.4.1
1.5.2 方法二:tc命令行
- 前置条件——安装相关工具
tc:TrafficControl,用于linux内核的流量控制。tc是Linux 内核内置的框架,能够实现流量限速、流量整形、策略应用,可以注入延时故障、丢包故障、包重复故障、乱序故障,以及模拟网络闪断等情况。
tc 对硬件、系统的一些要求:
- 硬件要求
- PC - 建议配置不低于 CPU i3,4G 内存,64G 硬盘
- 双网卡 - 除原有板载网卡外, 额外需要一块 pci-e 网卡(例如 intel 82574L)
- 路由器 - 支持桥接模式
- 网线 - 若干
- 系统要求
- 需要 Fedora、OpenSuse、Gentoo、Debian、Mandriva 或 Ubuntu,如果Linux内核版本大于 2.6,则已内置 TC。
- 系统模块
- Ubuntu/Debian 系统下需要 iproute2
- Fedora/RHEL 系统下需要 iproute-tc
- iptables
- Linux kernel module : sch_netem
iftop:监控网卡的实时流量-查看当前的网速流量
- 安装(centos/ubuntu):sudo yum/apt install iftop
- 使用:sudo iftop
wondershaper:一个 shell 脚本,是使用 tc 来定义流量调整命令,限制linux服务器网卡级别带宽的工具。
- 下载: git clone https://github.com/magnific0/wondershaper.git
- 查看帮助信息:进入wondershaper文件夹,执行./wondershaper -h
- 使用:./wondershaper -a eno1 ***
speedtest-cli:是一个用 Python 编写的轻量级的命令行工具,用于测试带宽。要求python_version>2.4+
- 安装:pip install speedtest-cli
- 使用:./speedtest.py
ping:内置,简单便捷,可以测试时延和丢包,缺点是无法测试带宽。ping的原理如下:
- 前置/后置条件——清除外网网络接口的所有队列规则
sudo tc qdisc del dev eno1 root 2> /dev/null > /dev/null # 此时eno1是服务器的外网网络接口
- 模拟弱网环境测试——网络延迟
- 模拟网络延迟(这里设置网络延迟时长100ms,可以通过ping或iftop查看实时网络数据情况),并通过ping命令查看是否配置成功
sudo tc qdisc add dev eno1 root netem delay 100ms # 该命令实现将eno1网卡的传输设置为延迟100ms
- 模拟弱网环境测试——网络丢包
- 模拟网络丢包(这里设置10%网络丢包率,可以通过ping或iftop查看实时网络数据情况),并通过ping命令查看是否配置成功
sudo tc qdisc add dev eno1 root netem loss 10% # 该命令实现将eno1网卡的传输设置为10%丢包率
- 模拟弱网环境测试——数据包损坏
- 模拟数据包损坏(这里设置随机产生 5% 的损坏的数据包),并通过ping命令查看是否配置成功
sudo tc qdisc add dev eno1 root netem corrupt 5% # 该命令将 eno1网卡的传输设置为随机产生 5% 的损坏的数据包
- 模拟弱网环境测试——网络限速1(工具: wondershaper)
- 模拟网络限速(这里设置网口最大上传限速为150Kbps,下载限速250Kbps),并通过speedtest-cli命令查看网速是否配置成功
./wondershaper -a eno1 -u 150 -d 250 # 该命令将 eno1网口上传限速为150Kbps,下载限速250Kbps
2. 进行***测试
3. 取消限速 #./wondershaper -a eno1 -c
- 模拟弱网环境测试——网络限速2(工具:tc,可以针对ip限速、端口限速、服务器网卡出口限速),并通过speedtest-cli命令查看网速是否配置成功
- 模拟网络限速(限制eth0单个IP-192.168.1.2的网速30Mb-60Mb之间)
tc qdisc add dev eth0 root handle 1: htb r2q 1 tc class add dev eth0 parent 1: classid 1:1 htb rate 30mbit ceil 60mbit tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.1.2 flowid 1:1
1.5.3 方法三:chrome浏览器的开发者工具
- 打开开发者工具(F12)
- 打开Network,点击throttling
- 有一些预设值,也可以根据自己的需要进行自定义添加
- 设置后,该页面即按照设定的网络限制进行展示。即可进行测试。
此文档转载加汇总