测试重器之-巧用fiddler

为什么要讲fiddler,因为无论你是想做爬虫,还是接口自动化,或者是前后端的调试,都绕不开他,今后只要涉及到http协议的工作,你都要用到它。所以各位同行千万不能小看fiddler。
注:本文不是纯扫盲篇,否则篇幅过大:至于http概念,以及fiddler下载安装,证书配置等信息可以自行摸索学习。

fiddler是什么

fiddler在官网的定义是:
适用于 MacOS、Windows 和 Linux 的 Web 调试代理


image.png

我们俗称它叫抓包工具。所以从几个关键词里我们总结一下fiddler的作用和应用范围:
1、系统:试用于macOS,windows和linux。说实话我对这个结果也是感到意外的,因为以前,大约在2012-2016年左右,我用过mac系统,并没有看到有fiddler可以下载,所以mac系统在一些老测试的印象中用的都是Charles。
2、代理:这里所谓的代理实际上就是http协议的代理,也就是说,无论是http协议的接口,还是网页里包含的js,html页面,都可以捕获到。

基本用法:看

掌握一定的http协议知识,对于fiddler就可以进行使用了,看的意思,就是我只是去看抓包结果,他的应用范围主要有:
1、网页
2、移动端app

看什么:

image.png

第一部分,展示的是请求的链接,第二部分是请求body的入参,第三部分是响应的出参。
无论是测试人员还是开发人员,这里面需要关注的是:
-请求接口的状态码,result列。如200属于正常响应。302表示重定向至新的地址,304表示本地有缓存,服务器没无需提供新的数据。401表示请求方法错误,404表示请求的地址路径错误没有找到,451表示身份校验失败。500表示服务器内部错误,502表示网关拒绝,504表示网关超时。从状态码中我们大概可以判断出来后端服务出现了什么问题,问题的大概类型。
-入参和出参:检查入参和出参是否符合接口约定,入参错误需要前端开发进行修改,出参错误需要后端开发进行修改。
总结:通过“看”,我们可以定位到我们的操作过程中发现的问题,做一个初步的分析判断,让提交的BUG更为清晰。而开发人员也应该通过这个步骤去自测自己的代码,前端确保调用正确,后端确保在业务流程中可以正常提供服务。

基本用法:接口自动化要看得更深

做接口自动化,不只是上述方式的看看那么简单。
-首先要区分host和url。
-请求头:


image.png

首先要看request headers内,关于这个请求的请求方法。
client:
一般要注意accept:它决定请求入参的数据格式。
user-agent:表示客户端设备的基本信息,有些接口会做校验,如果你的客户端信息是Python,服务器会拒绝。
cookie:
一般网页会用到cookie,如果它通过cookie存储session信息,那么这个请求头不传是无法通过身份校验的。
entity:
content-type:表示它的请求类型。比如application/json表示它的请求格式为json格式。x-www-form-urlencoded表示它的入参是表单格式,multipart/form-data表示表单+文件入参,text/xml表示入参是xml编码根式的文本:


image.png

security:
这里面的内容包含自定义请求头,比如:Authorization,token等等。
所以请求的部分需要根据不同的格式去找,webform表单,json,xml。如果需要复制整个json入参,需要在raw格式下复制。
image.png

同理,响应也有需要注意的部分:
比如headers内的X-trace-Id:是追踪码,比如有点接口报错的话,会在响应参数里给出追踪码,有的则需要通过这个追踪码去查找后台日志。通常接口的响应的都是json格式,有的网页可能是html页面,js可能响应的是文本。


image.png

这种情况下,页面通过webview去查看,文本通过raw或者textview去查看,如果复制出来整个响应json,也要再raw栏内复制。
重点说一个特殊情况,有些页面响应虽然fiddler给出了json串,但是我们写自动化的时候却无法从json内直接提取想要的信息,比如之前,由于业务需要,我需要给五百个小区打上定位坐标,当时我有两个选择,第一是找一个开源的地图api,第二就是捕获知名地图网站的接口,所以我上网查了查,也没有找到免费好用的地图接口,所以干脆就把某地图的网站抓下来,结果就遇到了这种情况。最后发现响应的参数根本不是json,而是包含一个json串的文本,而这个时候在json格式化内看到的并不是全部内容,它有一些干扰字符,所以需要通过raw这个页面拿到所有的文本,再通过大括号把json筛选出来,转译成字典才可以实现提取。
image.png

上图看起来规规矩矩
但是:
image.png

也就是小括号里面的detail才是我们想要的json。
所以,做接口自动化的测试开发人员,需要关注的点要更多,不光要看基本入参出参,还要注意每个接口之间的关系,才能通过接口串联起来一个完整的场景,还要保证同一个场景下的请求属于同一次登录后的操作,最主要的是,真正实现自动化的时候,参数应该是尽可能是活的和反复执行的,这样才能模拟出来真实的操作流程。

正餐:那些很多人不知道的进阶用法

1.文件存储:
工具栏中的file,可以存储抓包文件,也可以读取抓包文件。存储的意义很多。比如我把抓下来的数据发给其他人来协同工作。或者拿到别人抓好的结果去进行浏览分析,帮助我写自动化或者查找BUG。又或者是过了一天之后我准备再次调用它,看看身份是否过期。这里面我延伸出来一个更有意思的用法,就是写了Python爬虫程序,将抓抓包结果生成了自动化用例。
2.搜索:
与其它大多数windows软件一样,Ctrl+F可以进行搜索,也就是当我们在一堆杂乱的抓包结果中去找到想要的东西,比如我抓到接口在使用session,但是我不知道这个session的来源,我可以搜索这个session,这样就所有包含这个字段的接口就会高亮显示,无论它存在于哪个位置,通常是响应头内。
3.标记:
Ctrl+1~9,是给选中的url标记颜色的,这样我们就可以一眼看到标记的接口,keep xxx session我通常会设置成100,这样他左侧只存储最近的100次会话,而有有标记的会被保留,没有标记的会逐渐被删掉。keep 100是为了节约计算机的内存资源,否则达到一定的数量之后,电脑会卡顿。
4.慢网速:
在rules-performacne-simulate modem speeds这个选项,勾选后可以模拟高延迟或者不稳定的网络状况。它的用途是一些页面可以测试双击反应,以及超时反应。Ctrl+r可以调取出fiddler的脚本文件。

image.png

其中有这样一段代码,是可以设置延迟时间的,一个是上传延迟,一个是响应延迟。这里面的语法是.net,有精通这门语言的人可以仔细研究一下,可以对fiddler进行自定义的功能改造。
5.响应时间:
在入参栏内,statistics是关于接口的一个响应时间分析。
image.png

它会清楚的告诉你,客户端什么时候开始连接服务器,发出请求,服务器什么时候接收到的请求,什么时候开始响应等。以及在不同的语种下可能响应时间。
6.筛选和过滤:
左侧请求url的列表内,每个表头都可以点击,讲同一个host下的地址进行分类筛选。过滤则有两种方式,一个是右侧请求区内,勾选filters,在use filters里面输入想抓的域名,这样fiddler就不会显示其它没有用的接口了。但是我个人不建议使用,因为一个复杂的应用不仅仅是一个域名构成,比如里面可能还有一些SDK,比如地图,天气,H5,以及三方的一些调用,你把它们过滤掉的话,有可能会丢失重要的环节。所以我建议直接在左侧url上右键,选filter now,把不想看到的隐藏掉就好,隐藏之后,会显示在左下角,右键点击隐藏的链接,会把它们重新激活。
image.png

7.拷贝和删除:
在url点击右键,可以选择拷贝,可以只拷贝url,丢掉host,也可以拷贝完整地址。删除可以直接按delete删除选中的url,也可以crtl+i反选删除未选中的URL,也可以点击reply按钮右侧的X,选择全部删除。拷贝请求头不建议在这里拷贝,因为内容比较杂乱。拷贝请求头的时候最好选择请求区的header栏,点击右键view header,这样可以精确的复制到key和value。
image.png

8.重播:
首先说重播,reply键,可以将选中的一个或者多个url进行重复请求,参数不变。它的作用是可以看到哪些接口的参数可以重复使用,也可以排除不应该可以重复使用的接口。比如我在网站给一个用户进行了充值或者退款,那么我再重播这个接口的话,极有可能造成充值重复或者退款重复,这就属于安全漏洞。
重播还有一个自动化玩法,就是shift+r,这里可以设置重播次数。那么我们可以通过选择重播数量让fiddler产生并发请求,重播次数可以产生持续性的请求,没想到fiddler还是一个可以做压测的工具吧,但是不要太高兴,它只能做一些临时压力测试,在没有压测计划的时候,对查询类接口这样做,可以初步有一个性能评估,但是它毕竟不是压测工具,真的做压测还是该用locus或jmeter或loadrunner这些专业方法吧。有时候我们需要持续创建一些数据,如果服务器不校验重复的话,那么就可以使用reply去做。
9:断点
断点是fiddler的灵魂所在
image.png

有个比较隐蔽的位置,点一下,会出现上箭头,它就会阻断请求,再按一下,出现下箭头,它就会阻断响应,什么都不显示表示不给予断点。
image.png

这里还有一个隐蔽的按钮,打上断点的接口也会显示对应颜色的箭头
image.png

这个go的作用就是,放行,否则它会一直处于阻断的状态。
请求断点可以修改入参,这就等于模拟客户端去骗服务器。
响应断点可以修改出参,这就等于模拟服务器去骗客户端。
这里面我列举三个使用场景。
场景1:我不知道哪些请求头是有用的,所以我每次reply的同时,打上请求断点,每次删掉一个请求头的参数,以此方法去了解接口对哪些请求头做严格的校验。
场景2:类似于postman,打上请求断点,reply后,我们对请求参数做修改,删减等操作,以此来对接口进行测试。比如网页里请求每页10条,30条,50条记录,如果我们想让它每页显示100条怎么办,按照上述方法就可以实现了。
场景3:有时候测试或者开发遇到的麻烦就是数据量不足,比如我们需要很多数据,或者很长的字符串,各种字符类型显示在列表内,而制作一条数据是非常耗时甚至很难实现的。比如银行回盘,营业扎帐每天只能做一次,有些年终结算之类的每年生成一个。那我们开发调试或者测试测试的时候怎们去看前端的分页情况,展示情况,这个时候就用到了响应断点。我们可以根据相应数据的规则自己去制造一些响应数据,将要给到客户端的数据进行了篡改,以此来测试客户端的展示逻辑。
场景4:有时候我们需要看到各类不同的提示,比如三方的支付失败,加载失败之类的情况,或者有些报错很难去制造数据,它必须是依赖三方特定的情况下才能得到的,这个时候我们也可以强制让一个原本好好的接口响应报错信息,看客户端的显示效果。
10.代理服务器:
如果说断点重播的应用,符合fiddler“调试”的目的,那么代理服务器就真正的诠释了fiddler可以当服务器来用的情况。
案例:
有个老同事说,我们没有做公网域名,但是又想测试IOS app,怎么办?
解决方案1:修改手机的host文件,但是问题是,没有越狱的苹果手机不能访问host。
解决方案2:使用手机连接fiddler代理,在fiddler所在电脑上修改host映射,把公网不认识的域名映射给内部的ip地址,从而实现了fiddler作为代理服务器的意义。
例如:我们内网部署的测试平台域名是个ip地址。
平时我们使用的时候,访问http://192.xxx.xx.xxx:8000/api/login
这个时候打开fiddler,点击tools选择修改hosts,此处用法与windows一样。
image.png

这个时候呢,我在浏览器输入http://ecej/api/login/ 也可以访问测试平台。同理,我在手机浏览器里输入,也是一样的走到fiddler的代理服务器上。通过fiddler和windows都可以修改host,通过fiddler修改host的好处是,我可以随时去关闭和启用它,同时在关闭fiddler的时候,电脑则不再使用fiddler的映射关系。

结语:
各位看官,是不是很神奇,如果今后你在面试别人的过程中,提到fiddler的使用,你不妨通过他对fiddler的掌握程度,来推断他的内功深度。你甚至都不需要问其他的问题,因为只有用到的才能使用到它。你可能会猜到一个后端开发将来需要学会什么,或者一个前端开发将来需要学会什么,但是没人能猜透一个测试将来都能学会什么,这就是测试这项“找毛病”的工种的神奇之处。因为他会尝试你想不到的方法去找毛病。

你可能感兴趣的:(测试重器之-巧用fiddler)