一、Android App API接口测试
1.如何学好Android App API接口测试
postman可以用来实现API接口自动化测试,但是也有弊端,无法实现接口测试数据的参数化,为了达到接口测试数据的参数化,可以通过python脚本应用DDT的框架来实现。
2.什么是API
下面是用图来说明客户端和服务端“发送请求--接受请求”的过程
3.抓包神器Fiddler简介
使用Fiddler的两个场景,1:客户端对服务端返回数据的容错;2:服务端对异常请求数据的处理。
以下是需要做的准备和要掌握的知识点
4.Fiddler抓包原理解析
打开tools-->Fiddler Options--Https/Connections,分别按下图勾选:
配置好了之后,File-->exit退出Fiddler再重新启动。
Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888。当Fiddler退出的时候它会自动注销,这样就不会影响别的程序。不过如果Fiddler非正常退出,这时候因为Fiddler没有自动注销,会造成网页无法访问。解决的办法是重新启动下Fiddler。Fiddler原理图:
5.Fiddler修改客户端发出的请求
Fiddler设置断点修改Request有两种方式:1.通过工具栏设置断点;2.通过命令设置断点。
方式1:通过工具栏设置断点。
Rules-->Automatic Breakpoints-->Before Requests;设置之后,Fiddler会拦截到所有发送给服务器的请求。
接下来要做的演示是:1.打开谷歌(www.google.com.hk),输入查询词“mook”;2.点击搜索;Fiddler要完成的任务是在浏览器发送查询词“mook”给服务器之前,把查询词修改为“test”。从下图可以看到此时发出的请求被Fiddler拦截了,接下来点击session,点击下图框中的“Run to Completion”。
如图2,会新弹出一个session,修改此session下"WebForms"中的“mook”为“test”;然后再点击“Run to Completion”,到此请求已经执行完成了,搜索关键词已经由“mook”变为“test
”,可以通过查看当前浏览器的效果(图3)验证是否成功。
另外,可以看到用这种方式会拦截所有的请求,而我们所需要测试的站点只是“www.google.com.hk”,想要做到只测试某个站点,可以采用第二种方式:通过命令设置断点。
方式2:通过命令设置断点。
在命令行中输入“bpu www.google.com.hk”,回车(如图4),然后可以看到在底部出现如图5框中的信息,这时就做到了只针对“www.google.com.hk”站点进行拦截(可以打开一个其他的网址查看,其他的网址是可以成功访问的)。以上可以看出,通过命令设置断点可以做到针对某个站点进行拦截,也就是方式2的好处所在。当想要撤除断点时,可以在命令行中输入“bpu”,回车,来完成撤除。
6.Fiddler修改服务器端返回的内容
Fiddler设置断点修改Response有3种方式:1.通过工具栏设置断点;2.通过命令设置断点;3.AutoResponse设置。
方式1:通过工具栏设置断点。
Rules-->Automatic Breakpoints-->After Responses;设置之后,Fiddler会拦截到所有服务器返回的响应。
接下来要做的演示是:1.打开谷歌(www.google.com.hk),输入查询词“mook test”;2.点击搜索;Fiddler要完成的任务是在服务器发出响应之后把查询词修改为“test”。从下图可以看到此时返回的响应被Fiddler拦截了,接下来点击session,点击下图框中的“Run to Completion”。
此时浏览器中的tittle已经变成了“test”,说明刚才的修改已经生效了。
方式2:.通过命令设置断点。
在命令行中输入“bpafter www.google.com.hk”,回车。然后在浏览器中执行搜索“mook test”,点击session,删除服务器返回的所有内容,输入“mook test”,点击下图框中的“Run to Completion”,此时再查看浏览器,返回的所有内容就是“mook test”。当想要撤除断点时,可以在命令行中输入“bpafter”,回车,来完成撤除。
方式3:AutoResponse设置
在浏览器中输入“mook test”并搜索,完成正常的搜索过程;点击session,按下图所示,选中AutoResponder并勾选下方三个选项,然后点击“Add Rule”选择匹配方式,这里默认是“EXACT...”精确匹配,如果两个请求完全相同,那么这个规则生效,由于此次请求内的内容很长(如图6所示),就可能会出现“两次不匹配的情况”,解决的办法是选择模糊匹配(正则表达式)的方式,修改的规则是正则表达式的内容可以唯一匹配要拦截的请求,这里修改为“regex:(?inx)^https://www.google.com.hk/serah?.+”,因为所有session中只有我们要拦截的session才包含正则表达式中的内容,“.+”的作用是连接多个符号(如图7),然后选择返回状态“404_Plain.dat”,然后点击“Save”。
此时刷新浏览器,可以看到如图8所示的结果,证明本次的拦截成功了。
这是Fiddler提供的默认的返回内容,如果想自定义返回内容该怎么办呢?如图9,选择“Find a file”,选择一个实现编辑好的文件(txt,如图10),然后点击“Save”。
此时刷新浏览器,可以看到如图11所示的结果,证明本次的拦截成功了。
通过以上3种方式,我们就可以测试当服务器返回异常数据时,客户端的稳定性。
7.Fiddler实现会话的过滤、对比及请求的编解码
7.1,会话的过滤
在浏览器中执行多次请求,session区域会有大量的请求,如果想过滤出“www.baidu.com”的请求,可以通过图12所示的方式来完成。
7.2,会话的对比
Ctrl键选中两个session,右键选择如下图中的“Compare”,对比的结果如图13所示,用“标红”、“标黄”的方式来表明两个session的差异。
7.3,请求的编解码
选择一个sesion,点击Tools-->TextWizard,弹出如下图14的窗口,其中‘...Decode’是解码,‘...INcode’是编码,图中将发送的请求中的“mook+test”解码为“mook test”,而“mook test”正是我们所搜索的内容。
8.Fiddler实现Host的配置
方法:Tools->HOSTS,按下图15勾选,并点击蓝色链接,就可以在窗口中设置host了。
9.Fiddler构造HTTP GET请求
举例:构造一个在www.google.com.hk中搜索“mook”的请求;步骤:1.在浏览器中搜索“mook”,2.在回话中找到这个请求的session,复制图16中绿色框中的请求的头部信息(header),3.如图17,请求区域选择“Copmoser”,把红色框中的内容复制到绿色框中(注意去掉尾部的协议“HTTP/1.1”),4.修改绿色框中url的关键字,5.点击棕色框中的“Execute”按钮;至此完成了本次HTTP GET请求的构造。
10.Fiddler构造HTTP POST请求
举例:构造如图18中登陆的一次post请求。步骤:1.复制图19中的header信息,2.切换到“Copmoser”,粘贴到绿色框中,然后把图20中的红色框内容剪切到“Request Body”中,修改header中的内容,最终如图21所示,点击“Execute”按钮,结果如图22所示,证明我们成功的构造了一次post请求。
很多时候,需要修改post请求中的参数,可以在“Copmoser”中的“Request Body”内修改。
11.Fiddler抓取手机上的网络数据包
设置环境:1.配置Fiddler允许监听https,2.配置Fiddler允许远程连接,3.手机端设置代理服务。
Fiddler上的设置如前文中“4.Fiddler抓包原理解析”,手机上的设置如图23,其中“代理服务器主机名”为fiddler所在电脑的ip地址,“代理服务器端口”为8888。经过这样的设置之后,手机上所有访问网络的请求都会转发到fiddler,然后再由fiddler转发给后端服务。
上文中提到的客户端为pc浏览器时Fiddler的应用,在客户端为手机app时也同样适用。
接下来演示一下如何使用“AutoResponder”来修改服务器返回给app端的内容,通过这样的修改可以模拟各种异常数据返回给app端,从而验证app端的容错情况。步骤:1.选择一个session,在服务端返回的Response中找到一个在app上可以明显被看到的内容,如图24中的“谈姐弟恋的,原来都是这样的女人”,2.点击图24中的绿框,弹出编辑窗口,修改“谈姐弟恋的,原来都是这样的女人”为“谈姐弟恋的,原来都是这样的人”(如图25),保存txt文档。3.切换到“AutoResponder”,再次选中图24中的session,选择模糊匹配规则,并把步骤2中保存的txt文档导入到如图26中的绿色框中,点击svae,4.清除所有session,退出APP,再重新启动,此时我们可以看到之前修改过的返回内容已经生效了。
那么,使用fiddler抓取手机包有哪些优点呢?
1.无需root权限;2.Android&IOS都适用;3.操作简单、界面清晰。
12.为什么使用PostMan做API接口测试
既然已经有很好用的fiddler工具了,为什么还需要用PostMan呢?因为在做API接口测试时,会遇到以下的问题:
1.后端服务的提测时间要早于客户端,很难去构造测试需要的请求;2.很难用客户端模拟异常请求;3.Fiddler的Composer无法实现自动化验证。
而PostMan能够弥补以上的问题,那么PostMan能够应用于哪些产品呢?PostMan的适用范围:1.PC;2.WAP(无线);3.APP。
13.PostMan测试HTTP GET请求
步骤:1.启动app,通过fiddler获取一个get请求(如图28),2.启动postman,在fiddler中选中步骤1中的session,右键copy出url,3.copy出header部分,点击Send。
如图30,得到了本次请求的返回值,这样我们就可以在发送请求后对返回值进行校验;步骤:1.选中Request区域的Test,再选择右侧验证方法中红色框住的“Response body:contains string”(验证返回值中是否包含哪些内容),把返回值中的数据copy到绿色框中(两个参数间用&&连接),点击Send,如图31,Response区域的Test中新增了一个Pass记录,说明本次对返回值的校验通过了。以上也就是对Request设置检查点。如果想在回归测试的时候再次执行这次请求的话,可以把这次请求保存到Cellection中(如图32)。
自动执行一个Cellection中的所有Request
方法:1.如图33,点击Cellection上的“箭头”,点击“Run”;2.如图35,弹出一个新的窗口,在新的窗口中点击“Start Test”,此时就会自动执行Cellection中的所有请求,另外,还可以设置执行Cellection的循环测试和延时。这就是postman带来的好处:可以收集请求,在需要的时候可以批量的的执行请求。
14.PostMan测试HTTP POST请求
步骤:1.启动app,通过fiddler获取一个post请求(如图35),2.启动postman,在fiddler中选中步骤1中的session,右键copy出url,3.copy出header部分(如图36),4.post请求和get请求的最大区别就在于post请求中包含body,在fiddler请求区“Inspectors”中找到“webForms”,把“body”中的内容也逐一复制到postman的请求区的body中(注意选择第二个选项“x-www-form-urlencoded”),至此一个post请求就构造完成了;点击Send。
同样的,也可以对post请求的返回值进行验证;如图39,postman返回数据选择“Raw”,校验方法和结果同get请求,就不多介绍了。
15.数据驱动DDT实现API接口自动化测试简介
以上,我们认识到postman会在回归测试当中帮我们节省很多的人力,那既然postman这么好用,为什么我们还要把数据驱动应用在API接口测试中呢?这是由于我们测试的内容是API接口,在测试的过程中需要输入大量的参数和不同的数据值,如果使用postman去完成的话,需要不断地构造各种请求,而构造各种请求的过程其实是很耗时的,如果我们把这一个过程就脚本的方式去实现的话,会变得更加简单高效。
既然决定要通过脚本的方式去实现,首先就需要选择一种技术去支持我们来完成这样的实现。使用Python requests模块来实现脚本的自动化,之后我们就可以写出HTTP GET/POST请求的脚本,并且利用DDT将脚本实现参数化。
16.Python requsts测试HTTP中的GET、POST请求
代码构成;1.首先代码中引入requests模块和unittest框架;2.TestCase中用字典的形式配置herder、cookies和get/post请求部分。
17.数据驱动DDT实现API接口自动化测试实战
以上我们已经实现了get、post脚本,下面来把两条脚本实现参数化,那么如何参数化呢?使用数据驱动的方式。
代码构成;1.引入ddt模块;2.ddt.ddt修饰TestCase;3.ddt.data设置不同的参数集合;4.测试类中引入参数化的device_id;5.修改请求中的device_id。
如图46,4次执行的结果都pass了,一般情况下,device_id是“空”时,服务器应该返回一个定义好的状态码。也就是说本次测试发现了一个服务器对非法数据处理的设计缺陷。