1、接口测试理论
接口测试主要是检查数据的交换、传递和控制管理过程,发送数据后,看返回数据是否正确,返回值类型是否正常。
接口测试主要分为两类:模块接口测试和Web接口测试
模块接口测试:是单元测试的基础,它主要测试模块的调用与返回
web接口主要分为:服务器接口测试和外部接口测试
服务器接口测试:主要是测试浏览器和服务器之间的接口,
外部接口:第三方提供的接口
2、接口测试工具
Postman --Charles--Fiddler:只接受单次单个接口的测试,很难满足多接口调用逻辑验证问题,也不太灵活,没办法做到数据化
Jmeter:可实现接口自动化测试
3、测试要点
(1)检查接口返回的数据是否与预期结果一致
(2)检查接口的容错性,假如传递数据的类型错误时是否可以处理。例如上面的例子是支持整数,传递的是小数或字符串呢?
(3)接口参数的边界值。例如,传递的参数足够大或负数时,接口是否可正常处理。
(4)接口的性能,接口处理数据的时间也是测试的一个方法
4、状态码
200:返回成功
404:错误的请求,请求的资源不存在
500:服务器内部错误
5、Get与post请求的区别
Get:从指定的服务器中获取数据,Get请求的参数数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,参数明文展现在URL上,GET请求能够被缓存
Post:提交数据给指定的服务器处理,参数不会展现在URL上,请求不会被缓存
6、环境准备
安装jmeter需要有jdk的支持
(1)下载jdk+安装jdk+配置环境变量
变量名:JAVA_HOME
变量值: C:\Program Files\Java\jdk1.8.0_51 (即jdk安装的位置)
变量名:Path
变量值: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
变量名:CLASSPATH
变量值:.;%JAVA_HOME%lib;%JAVA_HOME%lib\tools.jar(记住前面的.)
附:查看jdk是否安装成功:命令行中输入Java -version,如有版本号显示表示安装成功
(2)下载jmeter+安装jmeter+配置环境变量
变量名:JMETER_HOME
变量值:C:\Program Files\apache-jmeter-2.11
变量名:CLASSPATH
变值:%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;
%JMETER_HOME%\lib/logkit-2.0.jar;
附:看是否安装成功:双击jmeter.bat,会弹出两个窗口,一个是windows窗口,一个是Jmeter界面
7、接口测试步骤
前提:从开发人员那里获取接口文档,接口文档应该包括完整的功能接口、接口请求方式、接口请求URL、接口请求参数、接口返回参数。如果当前项目没有接口文档,则可以使用fiddler或Charles对APP进行抓包确认。
方式1:fiddler接口测试步骤
(1)准备工作
下载安装fiddler
安装fiddler证书:这是为了让Fiddler能捕获HTTPS请求,如果你只需要截获HTTP请求, 可以忽略这一步;打开IPhone 的Safari, 问 http://本机IP地址:8888;证书的密码就是手机设置的锁屏密码
配置fiddler为代理:打开手机,找到你的网络连接,打开HTTP代理,输入Fiddler所在机器的IP地址(比如:192.168.1.104)以及Fiddler的端口号8888
(2)通过请求构造器进行接口测试
步骤如下:
- 将左侧栏接口直接拖到composer下,如下所示
- 在【Request Body】中输入或修改请求参数,点【Execute】,发送模拟请求
- 在左侧可以看到请求的session,双击或点击【Inspector】,可以查看请求响应结果
注意:get请求,request body中无内容,只能通过复制接口URL后的参数
(3)通过设置断点进行接口测试
作用:能够让你清晰地看到程序执行的具体步骤,便于程序的调试运行和分析其中的变量变化和出错的地点.
设置好断点后,你可以修改httpRequest的任何信息包括host, cookie或者表单中的数据,模拟真实用户请求。步骤如下:
- 打开Fiddler点击Rules-> Automatic Breakpoint->Before Requests或者按F11
- 左侧栏中选择一个接口,按R键
- 点击Inspectors tab下的WebForms tab或testview tab修改参数信息,然后点击Run to Completion
break on response :拦截修改服务器返回数据(可在webform或textview)
run to complete :执行修改过的请求数据(可在webform或textview)
查看返回的数据是否正确
方法2:jmeter自动化接口测试
(1)导入fiddler测试脚本方式
用fiddler抓APP接口,然后导出jmx格式,在jmeter中打开此文件,测试计划会自动添加上【http请求默认值】、【http信息头管理器】、【http cookie管理器】和监听器【查看结果树】
【http请求默认值】:设置公共的域名和端口号
【http信息头管理器】:在添加http请求之前,添加一个HTTP信息头管理器,发请求头中的数据通过键值对的形式放到HTTP信息头管理器中。在往后端请求的时候就可以模拟web携带header信息了。
(2)手动在Jmeter中添加相关组件
- 添加线程组(右击测试计划-添加-线程组)
名称:待测接口的名称
线程数:虚拟用户数即并发数,一个线程表示一个虚拟用户
Ramp-Up Period(s):所有线程启动的时间,设置每个线程间的启动间隔
循环次数:测试循环的次数,如果勾选了“永远”,那么所有线程会一直发送请求,直到手动停止运行脚本;
- 添加http请求默认值
主要是用来设置被测系统的域名和端口,线程组里的所有“HTTP Sampler”可默认使用此设置。
https://edu.csdn.net/course/detail/22948
https://edu.csdn.net/lecturer/3215
https://edu.csdn.net/course/detail/30898
https://edu.csdn.net/course/detail/25768
- 添加http cookie管理器
cookie manager实际上就像一个容器一样,自身就是Jmeter声明出来的一块存储空间,他会接受服务器发来的所有cookie的赋值命令,自动在cookie manger里面建立相应的变量,记录值。这个过程仅仅需要我们添加一个cookie manger到测试脚本里(jmeter.properties中需要开启CookieManager.save.cookies=true这项),且特别需要注意的是,一个脚本里最好只有一个cookie manger否则会混乱。
之后再确定服务应答的时候已经设置了cookie值之后,在需要的地方用${COOKIE_变量名}的取值方法取得cookie数据。
此外还有一点需要注意,当我们的脚本有跨域的情况时,${COOKIE_变量名}只能取到当前域中的cookie值,如果需要使用其他域中的cookie,那只能通过正则来提取。提取sample或者sub-samples的header部分,把值当成变量记录下来。
HTTP Cookie 管理器具备三个功能:
1. Cookie 管理器就像一个 web 浏览器那样存储并发送 cookie。
如果你有一个 HTTP 请求,其返回结果里包含一个 cookie,那么 Cookie 管理器会自动将该 cookie 保存起来,而且以后所有的对该网站的请求都使用同一个 cookie。每个 JMeter 线程都有自己独立的"cookie 保存区域"。因此,如果你在测试网站的时候使用了 Cookie 管理器来存储 session 信息的话,那么每个 JMeter 线程将会拥有自己独立的 session。**注意这些 cookie 不会显示在 Cookie 管理器里,你可以通过察看结果树来对其进行察看。
2. 接收到的 cookie 数据可以作为 JMeter 线程的参数进行存储(JMeter 2.3.2 之后的版本默认不再打开这个功能)。
要将 cookie 存储为参数,定义属性"CookieManager.save.cookies=true"。cookie 在被保存之前会在名字上加上 "COOKIE_" 前缀(避免和本地参数重复)。设置好名称为TEST 的cookie可以用 ${COOKIE_TEST}进行引用。如果不希望这个前缀可以对属性 "CookieManager.name.prefix=" 进行定义。
3. 手工添加一个 cookie 到 Cookie 管理器。
注意如果你这么干了,这个 cookie 将被所有 JMeter 线程所共享。这种方式用于创建有很长过期日期的 cookie。
HTTP Cookie 管理器应用实践。
对于 bug 跟踪系统的测试,测试场景将会包含一个 "仅登录一次" 操作,这个明显仅需新用户登录。新建一个项目,我们把登录请求放到 "Only Once Controller"。这意味着登录请求将仅被执行一次。之后,cookie 将被 HTTP Cookie 管理器所保存并用于以后的请求。
现在我们将执行一次仅一个用户的场景。之后我们会切换到察看结果树以核实 JMeter 是否已对 cookie 做了处理。
你会看到在 POST 请求的时候 JMeter 捕捉到了 cookie。现在我们来验证这个 cookie 是否会被应用于后续的请求。
- 添加http请求(右击线程组-采样器-http请求)
录入被测接口的详细信息,包括请求路径,对应的请求方法以及随请求一起发送的参数列表.
协议:可以是http或https,一般都是http
请求的方法:GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE
路径:填入接口请求的URL
请求参数:如果是GET方法的请求,请求参数直接写在URL后面
如果是POST的方法,则需要在Body Data中填入包含请求参数的数据(Body Data可以从Fiddler抓的包中获取,将Fiddler抓取的到数据包中Inspectors-TextView中的数据复制到Body data中即可);
- 设置检查点:添加-断言-响应断言
查看测试结果时,有时会发现返回数据不符合要求时,Jmeter给出的结果仍是通过的。这时候我们需要通过断言来判断返回数据是否符合要求。
比如,我们可以添加一个断言来检查返回信息中是否包含关键字“errMsg”来判断错误信息:首先添加一个响应断言,在要测试的响应字段中选择响应文本,在模式匹配规则中选择包括,勾选否,在要测试的模式中添加提一条,输入关键字“errMsg”;检查网络返回结果中不包含“errMsg”的才会判定为通过。
- 添加监听器--查看结果树
查看结果树:在结果树中会以树形结构展示每个接口请求的测试结果,包括取样器结果、请求、响应数据,在响应数据中可看到网络侧返回的数据,可以以接口文档中期望返回的参数做比较以判断返回是否正确。在结果树中通过颜色可以直观的看到接口测试的结果,绿色为通过,红色为失败。
另外,我们还可以从监听器中添加一个断言结果,在断言结果中可查看断言的详细返回信息。
8、参数化详细介绍
参数化:如果系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统。这个时候就需要对用户名和密码进行参数化,使每个虚拟用户都使用不同的用户名和密码进行访问。断言中也可以使用到参数化。对于这种接口不变,只是改下请求参数的测试,我们可以考虑引入参数化到概念。
参数化只需简单五步就能搞定:
准备数据、配置元件、设置参数、引用参数和执行用例
这里介绍两种参数化的方式:函数助手,CSV Data Set Config
1、数据准备
用记事本写了五个用户名和密码,保存为.dat/.txt/.csv格式的文件,编码问题在使用CSV Data Set Config参数化时要求的比较严格,记事本另存为修改编码UTF-8.注意用户名和密码是一一对应的,中间用户逗号(,)隔开。将这个文件放在( C:\JmeterWorkSpace\t.dat )路径下
2、设置引用参数
方式1、借助函数助手的方式
a、点击菜单栏“选项”---->函数助手对话框,看下图: CSV文件列号是从0开始的,第一列0、第二列1、第三列2、依次类推。
b、复制生成的参数化函数,打开登陆请求页面,在右则的参数化中找到我们要参数化的字段,这里对用户名和密码做参数化,第一列是用户名,列号为0;第二列是密码,列号为1;修改函数中对应的参数化字段列号就可以啦。
方式2、借助jmeter中的配置元件(CSV Data Set Config)
a、选中线程组,点击右键,添加-配置元件-CSV Data Set Config
b、引用以上设置的参数
这里设置了两个参数,第一个地方是请求路径里面,将citycode参数化了,第二个地方是断言里面,将城市参数化了
1.讲请求路径里面的citycode换成:${citycode}
2.将断言里面的城市名称,换成:${city}
9、逻辑控制器
仅一次控制器:表示在该控制器下的Http Request,每个Thread只执行一次,不会循环loop
交替控制器:表示在该控制器下的Http Request,Thread会依次执行,而不是乱序执行
10、如何解决json中文乱码问题?
方法1:将该采样器中的“http请求”中的“contentencoding”值改成utf-8
方法2:将jmeter.property文件中“sampleresult.default.encoding=。。”改成sampleresult.default.encoding=utf-8
方法3:线程组添加后置处理器-beanshell postprocessor,在框子输入:prev.setDataEncoding(“utf-8”)
了解更多测试知识访问如下链接
https://edu.csdn.net/course/detail/22948
https://edu.csdn.net/lecturer/3215
https://edu.csdn.net/course/detail/30898
https://edu.csdn.net/course/detail/25768