Android开发使用Fiddler搭建弱网测试环境

1. 前言

在Android开发中,经常会遇到一些简单但无法复现的bug,有很大一部分bug只会在恶劣的网络环境中出现,如果程序的健壮性不够的话,经常会导致一些意想不到的bug,或者会造成糟糕的用户体验。这就需要我们在测试的过程中将这些bug提前发现并修复,因此需要模拟弱网测试环境。这篇文章就来学习如何用Fiddler来搭建弱网测试环境。

有关弱网环境搭建的几篇博客:

【腾讯优测干货】微信测试工程师手把手教你做弱网络模拟测试
FaceBook ATC 弱网测试工具环境搭建
模拟恶劣网络环境常用的几种解决方案

2. 弱网环境的搭建的常见方法

搭建弱网环境有许多方法,主要分为以下几种:

  • 通过应用层或者传输层的代理服务器,通过在代理服务器上设置一些模拟恶劣网络环境的参数,使得通过这些代理服务器的流量都被转化为恶劣网络环境下的流量。如利用Fiddler,Charles,等具有代理服务器功能的网络流量分析软件来实现
  • 通过利用一些更底层的驱动层面的服务,通过控制网卡的收包发包的行为,来模拟恶劣的网络环境。如dummynet的ipfw驱动等。
  • 通过建立一个可控的网关,在网关上部署模拟恶劣环境的相关程序,所有需要借助该网关进行转发的流量都会被模拟为恶劣网络条件。Linux下的netem就提供了这类支持。

现在用Fiddler和facebook的atc来模拟弱网环境的比较多,ATC只能在linux环境下,过程相对比较复杂,之前尝试了使用ATC来搭建弱网环境,最终没有成功,最后决定使用Fiddler来模拟弱网环境,下边将搭建的过程和简单使用方法记录一下。

3. 使用Fiddler搭建弱网环境

原理:手机APP使用网络代理代理到我们的pc上,然后所有的网络请求都会经过pc,这个时候我们就可以通过fiddler来限制网络,从而达到模拟弱网络环境的目的。

电脑和手机必须在一个网段(也就是在一个网络中)

3.1 ubuntu环境中下载并安装Fiddler

参考博客Linux(Ubuntu)环境下使用Fiddler

首先安装Mono环境,输入命令:

1
sudo apt-get install mono-complete

下载Fildder安装包,到官网,点击下图红框部分

将安装包解压到一个目录中(自己存放的目录是/opt),然后解压,进入到 解压目录/opt/fiddler,执行下方命令就可以启动Fiddler

1
mono Fiddler.exe

启动成功后的界面如图

3.2 设置Fiddler

点击Tools —> options 会弹出如下界面,找到Connections,把port改为8880(一般都是改为8888,但是自己8888被占用),这个时候就可以使用我们的手机代理到电脑上了。
options界面

3.3 设置android设备代理

ctrl + alt + T打开shell窗口,然后输入命令ifconfig获取电脑的ip地址

打开手机的wifi设置界面,设置代理

这时就可以使用fiddler拦截到请求了,但是注意看下图,此时只能拦截到http请求,无法拦截到https请求

要想拦截https请求,需要给手机安装代理服务器(pc)的安全证书,在手机浏览器输入pc的ip地址和端口号(自己输入的是192.168.43.176:8880),此时会弹出如下界面

然后点击蓝色字体FiddlerRoot certificate下载证书

点击小米手机(自己是红米3s)的 设置—>系统安全—> 从存储设备安装 进行安装

此时重新打开fiddler,然后使用手机访问百度(使用的是https),发现可以拦截到https请求

Android虚拟机设置代理

参考博客:
利用Fiddler对Android模拟器网络请求进行抓包
Fildder 抓包android原生模拟器网络请求

3.4 设置网络限制

回到Fiddler界面,点击工具栏中 Rules—> Customize Rules,弹出一个文本编辑器

使用Ctrl+F使用搜索功能搜索关键字:simulate,可以找到如下代码段:

1
2
3
4
5
6
if (m_SimulateModem) {
// Delay sends by 300ms per KB uploaded.
oSession["request-trickle-delay"] = "300";
// Delay receives by 150ms per KB downloaded.
oSession["response-trickle-delay"] = "150";
}

request-trickle-delay代表的是你网络请求的延迟时间,response-trickle-delay代表的是网络响应的延迟时间,单位都是毫秒,这里默认给的是300毫秒和150毫秒,所以,只需要修改这2个值即可模拟网络延迟和弱网络环境了,自己将两个值修改为如下图所示(记得ctrl + s保存)

3.5 开启网络延迟

点击工具栏 Rules —> Performance —> Simulate Modems Speeds,
如果需要关闭网络延迟,再次点击Simulate Modems Speeds 即可。

3.5 修改弱网络的规则

如果我们那不想要一个一直虚弱的网络环境,而是随机模拟强弱的一个网络,此时可以将上述代码修改为:

1
2
3
4
5
6
7
8
9
static function randInt(min, max) {
return Math.round(Math.random()*(max-min)+min);
}
if (m_SimulateModem) {
// Delay sends by 300ms per KB uploaded.
oSession["request-trickle-delay"] = ""+randInt(1,2000);
// Delay receives by 150ms per KB downloaded.
oSession["response-trickle-delay"] = ""+randInt(1,2000);
}

randInt(1,2000)应该很好理解,代表1-2000中的一个随机整数,这样就会出现偶尔有延迟偶尔网络又良好的情况

至此,我们就可以在开发中模拟出一个弱网测试的环境。

参考博客
Android使用Fiddler模拟弱网络环境测试