一、接口测试
接口测试原理:【接口测试就是基于某种协议】模拟客户端向服务器发送请求。
接口测试测试点:
a)测试请求:测试请求地址是否正确,请求是否能正常通过。
b)测试数据:判断接口返回的数据是否和预期一样。
c)测试安全:有些接口不是暴露出来的,我们需要先进行验证才可以进行测试。
d)测试性能:例如某一个接口在同一时间点上要有很多的用户同时去访问。
接口测试分类:
a)Web接口:服务器接口 + 第三方接口(b/s架构)
b)模块接口:所谓的模块我们可以理解为是一个客户端软件内部的不同功能。所以模块接口就是这个软件内不同功能之间交互的一个标准。(c/s架构)
二、Jmeter
1、Jmeter简介****
Jmeter:它是一款由Apache开发和维护的一款开源软件。【由Java编写而成】可以做接口测试、性能测试、Java测试和数据库测试。
优点:
a)开源免费;
b)强大的第三方扩展【使用Java】;
c)相对于其他的商业测试软件来说,在实现相应功能的前提下它占用的体积更小。
缺点:
a)Jmeter没有办法实现IP欺骗;
b)Jmeter测试没有界面的,我们都是通过接口测试数据来完成结果。
功能组成:
在Jmeter当中所有的测试都是基于测试计划的,而在测试计划下面又需要有具体的模块来完成对应的功能,所以我们将Jmeter测试计划分为三个部分来组成:线程组 + 测试片段 + 元件
线程组:可以将线程组理解为是实际当中我们需要发送请求的用户。
测试片段:和线程组属于同一级别;测试片段里面存放的内容默认是不会执行的,一般是在需要的时候通过其他的元件让它能够执行。
2、元件的分类
元件:我们可以将Jmeter中实现某一些相同效果的组件集合称之为元件。【可以将它理解为是编程语言当中的数据类型】
线程组的八类可执行元件:
1、逻辑控制器:我们可以将它分为两类,其中一类就是用来对当前的具体操作进行分类;另外一类就可以用来对具体的操作执行进行相应的控制。
2、配置元件:这个元件一般是用来为具体的操作提供数据支持。
3、定时器:它可以帮我们控制当前操作的时间。
4、前置处理器:某一个请求真正发出之前有可能需要完成其它的操作,此时我们就可以通过这个元件来实现。
5、取样器:他就是Jmeter当中真正去执行请求的元件。
6、后置处理器:当某个请求完成之后如果想要做一些相应的操作就可以基于此元件来实现。
7、断言:我们可以基于预期的结果对当前请求的实现返回结果进行相应的判断。
8、监听器:它为我们的测试提供了可视化的图形显示界面。
3、Jmeter元件作用域****
作用域:在Jmeter当中我们可以将作用域理解为是元件起作用的范围。
在Jmeter当中存在八个元件,我们可以将他们分为三类:
a)逻辑控制器:它对它下面的“子元素”有绝对的控制权;
b)取样器:因为该元件最终都是需要被执行的,所以它在哪里无所谓,不影响作用域
c)另外六个:关于这个六个元件我们为他们准备了一句话,如果某个元件的父亲是一个取样器,那么该元件就对当前取样器起作用,如果这个元件的父亲不是取样器那么该元件就对当前父亲下面的所有子元件起作用(是可以穿透的)
Jmeter元件执行顺序:
默认情况下如果八个元件都存在那么他们的执行顺序就是:逻辑控制器配置元件前置处理器取样器后置处理器断言监听器
4、Jmeter录制脚本****
1、脚本:对于Jmeter来说我们可以将后缀名为jmx的文件称之为脚本。
2、录制:所谓的录制就可以理解为将原来手动添加的一些操作通过其他的形式保存为jmx的过程。
3、Jmeter如何实现录制:
a)在Jmeter的工作台当中添加一个HTTP代理服务器,然后将它属性当中的“目标控制器”设置正确【在测试计划中添加一个线程组,然后勾选此即可】,完成之后需要将当前服务启动才会生效。
b)建议大家选择IE浏览器【因为使用代理模式上网会被认为存在一定的安全问题】,此时我们需要在Internet选项中设置相应的代理服务器配置【127.0.0.1:8080】。
c)上述操作完成之后就可以在浏览器进行相应的手工操作,然后这些操作就会被Jmeter保存起来,方便我们后续的测试。
5、Jmeter实现参数化****
1、用户参数实现参数化
a)在请求的前面添加前置处理器用户参数;
b)在用户参数当中设置相应的变量名和变量值,名字和值都可以存在多个;
c)在具体的请求里去使用相应的变量【在jmeter里以${变量名}的形式来使用变量】;
d)用户参数如果想要做到值不同则应该在请求的时候分配多个用户数而不是循环次数。
2、用户自定义变量实现参数化
a)原理:此种方法实现的本质就是通过添加一个配置元件来完成;
b)在请求之前添加一个配置元件用户自定义变量;
c)在该元件中设置我们想要的数据,基本格式为:变量--变量值;
d)在需要使用的数据的地方直接通过${变量名}的格式来获取数据;
e)该元件可以配合逻辑控制器For Each控制器实现多个参数循环使用的效果。
3、读取外部文件数据实现参数化(重要)
a)原理:这种方法本质就是通过jmeter去读取外部文件的数据,然后实现数据的可变调用;
b)在请求之前添加一个配置元件csv data set config;
c)在该元件当中引入相应存放数据的文件【通过路径来引入】;
d)设置具体的调用参数;
e)在需要使用数据的地方直接调用相应的变量即可。
4**、CSV data set **config属性
a)filename:该选项就是用来设置被引入文件的路径【绝对路径或者相对路径】;
b)文件编码:只有保证编码统一,里面的数据才会正常显示【utf-8】;
c)变量名称:在外部文件中可以存放多个不同类型的数据,我们在Jmeter里需要通过变量来进行调用,此选项当中就是用来设置具体的调用变量名,多个变量名之间用逗号隔开;
d)分隔符:默认是逗号,如果在文件当中是用tab空格来分割的,我们就需要写入\t;
e)数据读到文件结尾之后是否循环:true表示重头循环,false表示不循环;
f)数据读到文件结尾之后是否停止错误线程:true表示停止,false表示不停止;
g)线程共享模式:前两个我们可以理解为一样,表示将当前的数据给所有的用户去使用,第三种操作方式就是给每一个用户都单独的分配一份数据。
6、Jmeter集合点****
1、定义:在实际应用我们对于某一个接口可能存在多个用户同时请求的场景(并发)。
2、原理:在jmeter里实现集合点的方式本质上就是设置一个定时器元件。
3、具体实现操作:
a)在请求之前添加一个定时器synchronizing timer;
b)在该定时器当中设置我们想要的集合的用户数,以及相应的等待时间。
7、Jmeter关联****
1、定义:在一个完整的测试请求当中可能会分成不同的请求步骤,而关联指的就是让这些不同的操作步骤之间存在着某种数据联系。
2、原理:在jmeter里实现关联的本质就是设置相应的后置处理器。
3、具体实现操作:
a)在需要获取数据的请求下面添加一个后置处理器正则表达式提取器;
b)在正则表达式提取器中定义规则,来完成数据的提取;
c)为了方便我们查看有没有获取到相应的数据,所以我们可以添加一个debug取样器,通过这个取样器在请求执行之后我们就可以在监听器中查看到jmeter当中的所有变量及变量值。
8、正则表达式提取器****
1、正则:它本身就是一门语言,主要的功能就是可以通过书写自己的规则然后从一堆字符串当中获取到我们想要的内容。
2、正则常见的元字符:
元字符:它就可以理解为是当前这门语言中用来与实际的字符进行对应的符号。
a). 号:表示任意的字符。
b)* 号:表示数量(表示0个或者多个)。
c)+ 号:表示数量(表示1个或者多个)
d)?号:默认情况下我们定义的正则是贪婪匹配的原则,但是通过?可以让其只匹配第一个。
应用场景:返回数据是字符串格式
9、json-path后置处理器****
安装插件 options plugins manager Available Plugins
勾选JSON/YAML Plugins(deprecated) 点击【Apply Changes and Restart JMeter】
谷歌插件json-handle:是一款对JSON格式的内容进行浏览和编辑,以树形图样式展现JSON文档,并可实时编辑。
应用场景:返回数据是json格式
1、在实际的接口请求获取数据操作过程中我们得到的数据格式不一定都是字符串;其中还有一些json格式(这种格式当前是最常用的)。
2、默认情况下jmeter中是不存在json-path后置处理器,它是我们自己安装上的一个插件。
3、如何安装插件:将我们下载得到的插件jar包直接复制到lib目录下的ext子目录或者lib下的直接目录。
4、如何使用json-path插件:
a)在某一个请求的下面添加该后置处理器JSON/YAML Path Extractor;
b)将我们在Chrome浏览器插件中获取到的数据路径赋值到这个后置处理器中【将json修改为$】
c)在使用这个处理器的时候我们一定要给出一个变量名,在需要使用数据的时候直接写入变量名即可。
10、Jmeter断言****
1、定义:在测试中我们有一个实际的返回结果,同时还有一个测试之前的预期结果,而断言要做的事情就是让二者进行比较从而判断我们的测试是否通过。
2、原理:在jmeter中断言操作的本质就是使用断言元件。
3、具体实现操作:
a)在请求之后添加断言元件响应断言;
b)选择需要的匹配模式,然后输入具体的期望值;
c)可以添加监听器(断言结果或者查看结果树),从中得到当前断言是否通过的结论。
4、断言相关
响应断言属性:
a)默认有四种匹配模式,我们将他们分为两组,其中前两个为一组;
b)两组之间的区别就是,前两个可以书写正则表达式,而后两个只能书写具体的字符串;
c)包括:只要我们的期望值是被包括在实际结果中的就允许通过;
d)匹配:要求我们的期望值必须和实际值完全一样才允许通过。
持续断言时间:
a)每一个请求都会有一个实际的请求时长(load time),而我们这个持续断言时间可以用来设置一个期望值的请求时长,如果二者不同且我们的实际值大于期望值,那么该断言就不会被通过。
11、HTTP请求取样器****
1、服务器名称或ip:不能填写http字样,其不能有子路径(子路径注意结尾是否有空格)。
2、自动重定向和跟随重定向:二者的区别就在于后者会将整个请求过程中遇到的地址都记录下来。
12、逻辑控制器****
1、逻辑控制器我们可以分为两类,其中一类是专门用来控制取样器的执行顺序,另外一类就可以用来对我们的取样器进行分组整理操作。
1、for each控制器
a)该组件的主要就是用来从某一个配置元件中循环的读取数据,同时控制它下面取样器的执行次数。
b)将配置元件和取样器都放置在逻辑控制器的下面进行管理,在配置元件中定义具有相同前缀的变量名。
c)在for each控制器中进行相应的属性设置(输入变量名前缀和输出变量、起始编号)。
for each控制器相关属性:
a)输入变量名前缀:提示我们在配置元件中设置的变量名前缀;
b)开始循环的编号:在jmeter中默认从0开始;
c)结束循环的编号:我们想要循环多少次就写上相应的数字;
d)输出变量名:将来我们具体调用数据的名字;
e)是否添加“_”:根据我们配置元件中是否存在来决定要不要勾选。
13、Jmeter连接数据库****
说明:因为jmeter默认是不能连接数据库,所以我们需要将相应的数据库jar包复制到Jmeter的lib目录下,然后重启Jmeter;
1、环境配置
a)安装数据库及相应的数据库图形管理软件【MySQL5.7、Navicat】;
b)准备一些相应的测试数据。
2、连接操作步骤
a)在jmeter中设置一个MySQL连接配置元件JDBC Connection Configuration,在这个元件当中我们需要给当前的连接起一个名称,同时设置相应的连接参数。
b)连接参数:
c)上述操作完成之后就可以添加一个MySQL取样器JDBC Request,然后写上相应的连接名称,执行具体的sql语句,此时就可以在jmeter中查看返回的结果。
14、Jmeter中的函数
1、函数:在Jmeter中我们可以将函数理解为是工具本身已经封装好的一些功能,我们只需要去使用就可以得到相应的结果。
2、函数的基本语法和使用
a)${__functionName(参数)}【在jmeter中我们不需要死记函数,因为有函数助手】;
b)在使用的时候可以通过函数助手直接来复制它自动生成好的调用代码;
c)通过函数助手我们可以得到一个调用函数的代码,直接使用即可。
3、常见函数
a)CSVRead:它的功能就是可以帮助我们从外部的文件当中读取数据,默认读的是第一行第一列,其中可以设置两个参数,第一个参数就是被读取文件的绝对路径,第二个就是想要数据的列号,默认从0开始,如果存在多行数据,那么csvread函数会以线程数来进行区分,第一个线程读第一行,第二个线程读第二行……
b)counter:它的功能就是可以调用一个计数器,每次都只增加1,可以设置第一个参数值为false或者true,其中设置为false就表示不论有多少个线程他们都使用同一个计数器,而true的作用就是每个线程都会有一个属于自己的计数器。
c)threadNum:该函数可以返回当前线程的编号,默认从1开始。
d)random:该函数可以设置两个参数,分别表示开始和结束的值,然后它会生成并返回一个二者之间的随机数字。
e)randomString:该函数可以在我们设置的长度及取样范围内生成一个随机字符串。
15、Jmeter全局变量****
1、所谓全局变量我们就可以理解为是在一个jmeter测试脚本中可以到处起作用的变量。
2、基本步骤:
a)在获取数据的线程中现将我们想要的数据通过相应的后置处理器拿出来,然后放在一个变量当中。
b)通过setproperty函数来设置具体的属性名及属性值,但是这句话只是相当于在调用一个函数,我们必须要通过一个bean shell取样器让它执行起来才会起到作用。【这个操作完成之后我们就相当于让这个数据变成了全局变量】
c)此时我们就可以在想要使用该数据的地方通过property函数来直接找到相应的变量去使用即可。
16、HTTP Cookie管理器****
如果你有一个HTTP请求,其返回结果里包含一个cookie,那么使用JmeterCookie管理器会自动将该cookie保存起来,而且以后所有对该网站的请求都使用同一个cookie。每个Jmeter线程都有自己独立的“cookie保存区域”。
Cookie是储存在用户本地终端上的数据,实际上是一小段的文本信息。
作用:帮助web站点保存有关访问者的信息,方便用户的访问。如记住用户名、密码实现自动登录。
17、Jmeter测试报告模块****
1****、聚合报告
聚合报告是一个比较精简的报告元件,可以查看每个接口的性能情况与执行结果。
2****、HTML报告
Jmeter3.0以后引入了Dashboard Report,用于生成HTML页面格式图形化报告的扩展模块。
生成步骤:
打开cmd进入jmeter目录bin目录执行命令
jmeter –n –t 文件名.jmx –l 文件名.jtl –e –o 路径\目录
命令参数:
-n:以非GUI形式运行Jmeter
-t:Jmeter脚本路径
-l:result.jtl运行结果保存路径,(.jtl)此文件必须不存在。
-e:在脚本运行结束后生成html报告。
-o:用于存放HTML报告的目录,不加该参数默认生成到bin\report-output
路径\目录为空
三、功能脚本
1、测试接口清单整理
因为原始的API文档包含的信息很难快速直接的供我们测试使用,所以我们需要对它进行相应的整理和分析得出具体的接口清单。
2、功能脚本设计
所谓的功能脚本设计指的就是将我们整理好的接口清单还原到jmeter测试工具中生成相应的jmx脚本文件,方便我们后续其他的操作。
1、在进行功能脚本设计的时候,我们可以将请求中需要的共同部分作为默认值提前准备在配置元件当中,供所有请求都可以使用。
2、HTTP请求默认值配置元件:它的功能就是可以将它里面定义的所有内容都用于每一个http请求。
3、HTTP信息头管理器配置元件:他的功能就是定义了当前请求发送后需要使用的一些必须信息。
4、在进行功能脚本设计的时候我们需要将接口测试中涉及到的一些可变值都实现参数化。
5、在具体的功能脚本定义时,我们为了后期维护方便,所以我们想让数据与脚本分离,因此我们采用的是csv data set config的配置元件来实现参数化,其中我们需要注意文件路径和变量名的定义。
四、自动化脚本
1、自动化脚本设计****
我们的后台程序在更新/发布之前我们需要保证它们的执行是没有问题的,此时我们就可以使用自动化脚本。
2、自动化脚本设计原则
1、每个用例都可以独立执行。
2、测试用例可以重复执行。
3、测试数据需要与业务相分离。
4、测试完成之后需要删除不必要的数据。
五、性能脚本设计
1、为什么需要性能脚本:当某一个接口在某种特定使用场景下需要考量它的响应处理能力是就要用到性能脚本。
2、什么是性能脚本:其本质就是把某一个具体的接口放在特定的环境去执行而产生的脚本。
3、设计性能脚本的技巧:对于查询类我们一般是通过时间进行压测,对于新增、更新、删除类我们只需要模拟大量用户进行访问即可。
1、设计查询类接口性能脚本:****
1、用户数量:100个用户
2、时间:对于查询操作来说我们一般是设置固定时间的不停访问【】
3、需要设计调度器里的时间
4、断言:判断查询的资源的属性
5、报告:聚合报告 tps(服务器处理事务的能力) rtt(平均响应时间)
2、设计新增、更新、删除类接口性能脚本:****
1、用户数量:100个用户
2、时间:启动100个用户需要10s
3、断言:判断新增的资源的属性
4、报告:聚合报告 tps(服务器处理事务的能力) rtt(平均响应时间)
六、接口自动化测试平台
一个完整的接口自动化测试平台需要支持接口的自动执行,自动生成测试报告,以及持续集成。Jmeter支持接口的测试,Ant支持自动构建,而Jenkins支持持续集成,所以三者组合在一起可以构建一个功能完善的接口自动化测试平台。
1、环境依赖****
JDK环境配置
Jmeter安装
Ant安装环境变量配置
Jenkins安装
2、Ant简介****
Apache Ant是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。
下载安装:
下载地址:Apache Ant - Binary Distributions
下载之后解压到任意文件路径
环境变量配置:
1)ANT_HOME:解压路径
2)Path :%ANT_HOME%\bin
3)ClassPath:%ANT_HOME%\lib
配置检测:ant -version
3、Jenkins****
Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:持续的软件版本发布/测试项目,监控外部调用执行的工作。
4、平台搭建****
1、依赖文件配置
1)首先在Jmeter目录下新建一个文件夹TestCase(文件夹名称不要使用下划线,空格字符),并将Jmeter测试脚本放置到该文件夹中。
2)将Jmeter工具extras文件中的ant –jmeter-1.1.1.jar放到Ant中的lib目录下。
3)将Jmeter工具extras文件中的jmeter-results-detail-report_21.xsl,build.xml、collapse.png、expand.png放到ant目录中的bin目录下。
2、build.xml配置****
<property name="testpath" value="${user.dir}"/>
<property name="jmeter.home" value="${basedir}/.."/>
<property name="report.title" value="Load Test Results"/>
<!-- Name of test (without .jmx) -->
<property name="test" value="Test"/>
参数说明:
testpath测试计划,这里用于存放测试脚本、测试生成的文件、测试报告
jmeter.home,Jmeter目录文件
report.title测试报告标题
test,Jm测试脚本的名称(无需后缀.jmx)
ant工具bin目录下cmd运行:ant –buildfile build.xml
报错:
解决:
在jmeter的bin目录下找到jmeter.properties文件并打开编辑
找到这行jmeter.save.saveservice.output_format=csv,修改csv为xml
3、报告优化
Jmeter默认生成报告不是很详细,因此我们需要进行优化。这里我们使用新的报告模板:
jmeter-results-detail-report_30.xsl默认的报告模板是jmeter-results-detail-report_21.xsl,打开build.xml将21改为30
进入Jmeter的bin目录,找到jmeter.properties文件打开。然后将一下代码取消注释状态,并改为true
版权归原作者 林兮木枫 所有, 如有侵权,请联系我们删除。