初步探究Android App API接口测试--实战_weixin_30660027的博客-程序员宝宝

技术标签: postman  测试  移动开发  

一、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是“空”时,服务器应该返回一个定义好的状态码。也就是说本次测试发现了一个服务器对非法数据处理的设计缺陷。

以上,简单介绍了API接口测试的流程,为了节省时间,排版不够好,还是希望对初接触API接口测试的同学有所帮助。

转载于:https://www.cnblogs.com/ailiailan/p/hanxiaobei.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30660027/article/details/97227074

智能推荐

osgi会崛起吗_OSGi会渗透到企业中吗?_diluan6799的博客-程序员宝宝

“在全世界超过600万的Java开发人员中,使用OSGi和设计模块化应用程序的开发人员只占很小的一部分,” Kirk Knoerschild在最新的博客文章中说道。 为什么会这样呢? 克诺尔德希尔对此事有一些想法。 阻碍OSGi采用的两个技术因素,尤其是在企业中,包括缺乏平台和工具支持,无法构建基于OSGi的服务器端应用程序。 在先前的博客中 ,Knoerschild将SpringSo...

【CPU篇 01】上下文切换context switch_扶我起来我还要写代码的博客-程序员宝宝_context switch

文章结构概念 指令 症状 资料目录上下文切换 Linux context_switch注释 context_switch的两种子状态:CSWCH和NVCSWCH 基础知识 指令 症状 context_switch细分情况 进程 线程 中断 系统调用 资料 一、上下文切换context switch:主要是切换mm(switch_mm函数)和cpu register state(switch_to函数,包括寄存器和堆栈)。.

H.264分层结构:VCL、NAL_道道道人间道的博客-程序员宝宝

H.264的功能分两层VCL (VideoCoding Layer,视频编码层):负责高效的视频内容表示。NAL(NetworkAbstraction Layer,网络提取层):负责以网络所要求的恰当的方式对数据进行打包和传送。H264编码过程中的三种不同数据形式SODB(String ofData Bits)数据比特串:最原始的编码数据,即VCL数据,没有任何附加数据。RBS

Click Once不能正常安装的问题_easyboot的博客-程序员宝宝_clickonce 无法安装

我遇到一个问题,ClickOnce发布后,客户端不能安装程序,提示“无法安装此应用程序,因为已经安装了一个相同的应用程序”思考应该是安装目录中的文件没有删除干净造成的。在我的电脑上找到如下目录,把此目录下的所有文件夹删除,然后重新安装即可。C:\Users\Administrator\AppData\Local\Apps

right计算机等级考试4,计算机等级考试四级笔试试卷及答案四之三_悦舟的博客-程序员宝宝

(61)There are several periods in a computer,the shortest period isA)Instruction period B)Machine period C)Beat period D)CPU period(62)Which set is empty?A){x|x is a real number and x2=9B){x|x is a rea...

关于ajax的responseText乱码的问题_movie__movie的博客-程序员宝宝

关于ajax的responseText乱码的问题这个问题让我和纠结百度了好多都说是javascript

随便推点

mysql-5.6.30.tar.gz源码安装_nju2012的博客-程序员宝宝

# groupadd mysql# useradd mysql# tar -zxvf mysql-5.6.10.tar.gz# cd mysql-5.6.10# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql5.6 --设置安装路径(5.6起已改用cmake 安装了)可能会遇到错误:Could NOT find Curses (m

gcc 、configure 用法_yhcs1213的博客-程序员宝宝_configure gcc

make LDFLAGS="-static"                  #静态编译./configure --disable-nls               #禁止对国际化支持gcc优化及特定编译安装示例:#!/bin/shCFLAGS="-O2 -mcpu=i386 -march=i386 -pipe -fomit-frame-pointer"CXXFLAGS

LeetCode012 : 反转字符串_简说Python的博客-程序员宝宝

一、写在前面LeetCode 第二题两数之和传输门:LeetCode011 : 字符串相乘今天给大家分享的是LeetCode 数组与字符串 第十二题:反转字符串,为面试而生,期待你的加入。“Use the utility in the API is recommended in the project. But if you use it in an interview, you will ...

oracle数据库概念理解_Mar.三月的博客-程序员宝宝_oracle没有数据库的概念吗

数据库:Oracle数据库是数据的物理存储。这就包括(数据文件ORA或者DBF、控制文件、联机日志、参数文件)。其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大数据库。实例:  一个Oracle实例(Oracle Instance)有一系列的后台进程(Backguound Processes)和内存结构(Memor

java a201游戏,机身四周详细看_wonder-yyc的博客-程序员宝宝

机身四周详细看机身四周详细看欣赏过整机风采,再来看看机器的细节处理。首先在机身左侧,从上到下依次为耳机插孔、数据线接口与吊饰孔。虽然microUSB接口通用性不错,但2.5mm耳机插孔却不利于用户更换。图为:OPPO A201左侧再来是机身右侧,音量调节键与相机快门的设计中规中矩,摆放位置也比较顺手。双导向滑轨的设计与处理,使得推滑过程非常顺畅,且系统反应也是相当迅速,完全没有延迟或死机现象。图为...

Java 求一个整数的个位,十位,百位,千位。_yang_le_le的博客-程序员宝宝_java求一个数的个位十位百位

import java.util.Scanner;public class Text {   public static void main(String[] args){    Scanner scanner = new Scanner(System.in);    System.out.println("请输入一个小于一万的数");    int num = scanner.nextInt()...

推荐文章

热门文章

相关标签