引言
研发经常有疑问:后端接口测试一遍 ,前端也测试一遍,是不是重复测试了?
回答这个问题,我们直接对比接口测试和app端测试活动的内容
通过对比可知,两个测试活动中相同的部分有功能测试、边界分析测试和性能测试。其它部分由于各自特性或关注点不同需要进行特殊的测试。
关于边界分析测试:
前端的输入输出很多是提供固定的值让用户选择,测试的边界范围非常有限;但接口测试不存在这方面的限制,可以覆盖的范围更广,同样出现问题的概率也更高。
(接口层面的强校验主要是为了提高软件的健壮性、兼容性、安全性)
综述:
1、接口测试和app测试有部分重复的内容,主要集中在业务功能测试方面。
2、接口测试关注于服务器逻辑验证,App测试关注于页面展示逻辑及交互验证。
一、环境准备
Jdk1.6或以上:http://www.oracle.com/technetwork/java/javase/downloads/index.html
Jmeter3.2或以上:http://jmeter.apache.org/download_jmeter.cgi
BadBoy下载官网:http://www.badboy.com.au/
二、常用元件介绍
一)配置元件
1、thread group(线程组)
一个线程组,,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。线程组中包含的线程数量在测试执行过程中是不会发生改变的。
1)名称:最好有业务意义
2)取样器错误后执行的动作:也就是某一请求出错后的异常处理
继续:如果取样器里的执行出现错误失败的时候,请求不会停止,继续执行。
Start Next Thread Loop : 忽略错误,线程当前循环错误,执行下一个循环。
停止线程 : 只限当前线程停止,不影响其他线程执行
停止测试 : 当前执行的线程全部执行完毕后结束
Stop Test Now: 立刻停止
3)线程组属性
线程数:运行的行程数设置,1个线程对应1个模拟用户。
Ramp-up Period (in Seconds):所有线程在多长时间内开始运行。默认值是1。假设ramp-up period 设置成T 秒, 全部线程数设置成N个, JMeter 将每秒启动N/T个线程。
循环次数:就是决定一个线程要跑多少次测试。
4)调度器配置
启动时间:测试计划什么时候启动,启动延迟会覆盖它。当启动时间已过,手动运行脚本时也会覆盖它。
结束时间:测试计划什么时候结束,持续时间会覆盖它。
持续时间(秒):测试计划持续多长时间,会覆盖结束时间。
启动延迟(秒):测试计划延迟多长时间启动,会覆盖启动时间。
2、HTTP信息头管理器
用于管理请求头内容
常用:
User-Agent:浏览器信息设置
Content-Type:application/json 定义json格式的http请求
3、HTTP请求默认值
当脚本中存在多个HTTP请求使用相同的服务器,端口等值时,设置默认值方便统一管理。
1)Protocol:协议,HTTP or HTTPS
2)Server:域名或IP
3)Port:端口号
注意:
(1)如果某个单独的HTTP请求中设置的值与请求默认值中设置的值不一致,Jmeter会选择使用HTTP请求的设置。
(2)注意HTTP请求默认值作用范围,只在同一个线程组内有效,如果有多个线程组的话, 需要分别设置。
(3)所有值都是可以为空的,意义与HTTP请求中设置是一样的。
4、HTTP Cookie管理器
存储和管理Cookie
接受到的Cookie的值能被存储到JMeter 线程变量中(2.3.2版本后的JMeter不自动做这个事情)。要把Cookies保存到线程变量中,要定义属性"CookieManager.save.cookies=true"。
注意:
一个测试计划内最好只有一个cookie manager。并且,一个manager里的 cookie 并不能被其它manager所引用。
5、用户定义的变量
可实现参数化的配置,通常用户定义的变量一般作为全局变量使用
引用已定义的变量:${变量名},比如: ${name}
如果变量未定义的话,引用变量会直接返回表达式
注意:如果在其他地方定义了一个同样名称的变量,该变量的值会跟着更新。
6、CSV Data Set Config
从文件中读取数据,并将它们分割存储到变量中,适合处理多变量
属性 | 描述 | 备注 |
Filename | CSV 文件名称 | 如果不带路径的话,jmeter会在/bin目录下查找 |
File encoding | 文件编码 | 当文件中有中文,指定编码可以避免乱码 |
Variable Names(comma-delimited) | 变量名 | 默认使用逗号分割符 |
Ignore first line | 是否忽略csv文件第一行 | 第一行可以用来写字段名了。 |
Delimiter(use ‘\t’ for tab) | csv文件内容分割符,默认是逗号 | Csv默认使用逗号分割,一般不需要换其他的吧(虽然是可以的) |
Allow quoted data? | 是否允许双引号? | 如果你的内容本身包括双引号,需要选择true了(注意只针对括起整个字段内容的双引号,内容中间用到的就没所谓了) |
Recycle on EOF? | 到文件末时是否重新读取? | 值为true的话,当设置的读取次数超过csv文件的行数时,会重新从第一行开始取值。false的话会结束读取。 |
二)定时器
固定定时器
让每个线程在请求之前按相同的指定时间停顿
注意:
1、定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面);
2、当执行一个sampler之前时,所有当前作用域内的定时器都会被执行;
3、如果希望定时器仅应用于其中一个sampler,则把定时器作为子节点加入;
三)逻辑控制器
简单控制器(Simple Controller)
作用:用来组合取样器和其他逻辑控制器
简单控制器是最基本的控制器,对jmeter测试运行没有任何影响,可用来模块分类
四)sampler(取样器)
1、HTTP请求
模拟浏览器行为,在HTTP协议层上发送给被测应用的http请求
属性参数说明:
1)名称:用于标识一个sample。建议使用一个有意义的名称
2)注释:对于测试没任何影响,仅用来记录用户可读的注释信息
3)服务器名称或IP:http请求发送的目标服务器名称或者IP地址,比如http://www.baidu.com
4)端口号:目标服务器的端口号,默认值为80,可不填
5)协议:向目标服务器发送http请求时的协议,http/https,大小写不敏感,默认http
6)方法:发送http请求的方法(链接:http://www.cnblogs.com/imyalost/p/5630940.html)
7)Content encoding:内容的编码方式(Content-Type=application/json;charset=utf-8)
8)路径:目标的URL路径(不包括服务器地址和端口)
9)自动重定向:如果选中该项,发出的http请求得到响应是301/302,jmeter会重定向到新的界面
10)Use keep Alive:jmeter 和目标服务器之间使用 Keep-Alive方式进行HTTP通信(默认选中)
11)Use multipart/from-data for HTTP POST :当发送HTTP POST 请求时,使用
12)Parameters、Body Data以及Files Upload的区别:
(1)parameter是指函数定义中参数,将URL中所有参数设置在本表中,表中的每一行是一个参数值对
(2)Body Data指的是实体数据,就是请求报文里面主体实体参数,适合传送json格式请求
(3)Files Upload指的是:在请求中发送文件,通常用来上传文件
2、Debug Sampler
写脚本难免会有bug,Debug Sampler可以查看脚本中的变量或属性,方便调试
1)JMeter properties和System properties:通常都选false,这两个就是JMeter和系统的属性,在Jmeter的bin的jmeter.properties中定义,一般都不会变。
2)JMeter variables:这个是我们自已定义的变量,默认为false。
五)前置处理器
1、BeanShell PreProcessor
在发生采样之前,调用自己写的工具类,工具类实现了密码的加、解密功能。
属性 | 描述 |
名称 | 该元件的描述性名称,用于在测试树中标识元件。 |
Reset bsh.Interpreter before each call | 如果设置该选项,那么就会为每个采样器重新创建解释器。 |
Parameters to be passed to Bean Shell | 传递给BeanShell脚本的参数。参数存在于如下变量表中: |
Script file | 一个文件,其中包含有待运行的BeanShell脚本 |
Script | BeanShell脚本。返回值将被忽略。 |
六)后置处理器
1、BeanShell PostProcessor
在发生采样之后,调用自己写的工具类,工具类实现了密码的加、解密功能。使用方法参照BeanShell PreProcessor。
2、正则表达式提取器
允许用户从服务器的响应中通过使用正则表达式提取值。该元素会作用在指定范围取样器,用正则表达式提取所需值,生成模板字符串,并将结果存储到给定的变量名中。
属性
1)引用名称:下一个请求要引用的参数名称,如填写title,则可用${title}引用它。
2)正则表达式:
():括起来的部分就是要提取的。
.:匹配任何字符串。
+:一次或多次。
?:不要太贪婪,在找到第一个匹配项后停止。
3)模板:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$$3$等等,表示解析到的第几个值给title。如:$1$表示解析到的第1个值
4)匹配数字:0代表随机取值,1代表全部取值,通常情况下填0
5)缺省值:如果参数没有取得到值,那默认给一个值让它取。
七)断言
响应断言:用于检查测试中得到的响应数据等是否符合预期
属性 | 描述 | 备注 |
Apply to | 应用范围,设定匹配的范围 | 选择从哪个Sampler中进行提取 |
要测试的响应字段 | 针对响应数据不同部分进行匹配 (1)响应文本:响应服务器返回的文本内容,http协议排除header部分 (2)响应代码:匹配响应代码,比如http请求中‘200’代表成功 (3)响应信息:匹配响应信息,处理成功返回‘成功’或者“ok”字样 (4)Response Header:匹配响应头中的信息 | 可以参照正则表达式中的要检查的响应字段的说明。 |
模式匹配规则 | 包括:响应内容包括需要匹配的内容就算成功 匹配:响应内容要完全匹配匹配内容,不区分大小写 equals:完全相等,区分大小写 substring:响应内容包括匹配内容即为成功。 可以通过添加断言结果来查看断言的执行情况。 | 包括、匹配: 使用Perl5的正则 |
要测试的模式 | 添加要测试的内容,可以添加多个。 |
|
在“察看结果树”或“断言结果”中可以看到断言成功或失败
察看结果树,断言成功,请求显示为绿色;断言失败,请求显示红色。
八)监听器
用来显示Sampler运行结果的
1、查看结果树
察看任意一个请求的详细信息,最常用的监控器之一。
通过这个监听器,我们可以看到很详细的每个请求及所返回的结果,其中红色是指出错的请求,绿色则为通过的。
2、聚合报告
汇总所有请求运行结果到一个表格
属性:
Write results to file / Read from file:结果读写路径
Label:每个JMeter的element的Name值。例如HTTP Request的Name
#Samples:发出请求数量。如第三行记录,模拟20个用户,循环100次,所以显示了2000
Average:平均响应时间(单位:)。默认是单个Request的平均响应时间,当使用了Transaction Controller时,也可以以Transaction为单位显示平均响应时间
Median:中位数,也就是50%用户的响应时间
90%Line:90%用户的响应时间
95%Line:95%用户的响应时间
99%Line:99%用户的响应时间
Min:最小响应时间
Max:最大响应时间
Error%:本次测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量。默认情况下标示每秒完成的请求数(具体单位如下图)
KB/sec:每秒从服务器端接收到的数据量。
3、jp@gc - PerfMon Metrics Collector
服务器资源监控插件,几乎可以在所有平台 上监控CPU,内存,交换,磁盘I/O和网络I/O。
属性
Servers to monitor:要监视的服务器
Host/IP:主机
Port:端口
Metric to collect:需要收集的资源信息
九)函数助手
JMeter函数是可以被任何采样器引用的特殊值。 函数调用如下所示:
${__functionName(var1,var2,var3)}
1、_Random
随机函数返回一个介于给定最小值和最大值之间的随机数。
函数参数 | 描述 | 是否必需 |
最小值 | 最小数值 | 是 |
最大值 | 最大数值 | 是 |
变量名 | 重用函数计算值的引用名 | 否 |
三、脚本编写
Jmeter脚本编写主要有两种方式
1、录制
1)通过bodboy来录制脚本
2)通过JMeter自身设置来录制脚本
2、手动编写
推荐方式,手动编写更加灵活
参照接口文档,自己编写
参考《接口测试工具-Jmeter的使用.pptx》
步骤:
(1)添加线程组:在“测试计划”上点击鼠标右键-->添加-->threads(Users)-->线程组,添加测试场景设置组件,接口测试中一般设置为1个“线程数”。
(2)添加“HTTP Cookie管理器”
(3)添加“Http请求默认值”组件,填写被测系统的域名和端口,http请求的实现包版本以及具体协议类型,线程组里的所有“HTTP Sampler”可默认使用此设置。
(4)添加“HTTP Sampler,录入被测接口的详细信息,包括请求路径,对应的请求方法,以及随请求一起发送的参数
l 一般请求参数
l Jason格式参数
(5)设置检查点:在被测接口对应的“HTTP Sampler”上,添加“响应断言”,设置断言内容
(6)添加监听器:添加查看结果树,方便查看运行后的结果
3、常用功能
1)正则表达式
运用Jmeter正则提取器,可以从上一请求的响应结果中取到下一个请求需要的内容,从而实现数据的传递。
例如获取登录后返回数据中的customerID,查询用户个人信息
(1)添加正则表达式提取器,获取返回后的登录数据,提取customerID
(2)引用提取到的值
2)参数化:
参数化的一般用法就是将脚本中的某些输入使用参数来代替,在脚本运行时指定参数的取值范围和规则;脚本在运行时就可以根据需要选取不同的参数值作为输入。
(1)添加CSV Data Set Config
(2)配置参数:
(3)使用变量:
3)加解密
http请求里的一些参数进行过加解密,为了正常处理带加密参数的请求,需要使用jar包特殊处理。
(1)在eclipse写好代码,然后把该类打成jar包;或者研发提供相关jar包
(2)把jar包放到jmeter目录\apache-jmeter-2.13\lib\ext下
(3)打开jmeter,添加一个http sampler(登录接口),在sampler下添加一个BeanShell PreProcessor
(4)在beanshell PreProcessor中导入我们的jar包,调用里面的加、解密码方法,把结果保存在jmeter变量中
(5)把加密后的密码存到jmeter变量中,然后在http sampler中就可以通过${encode}进行使用了
beanshell脚本
1)引入jar包
2)定义变量
3)调用方法
4)存取变量值
四、脚本执行
1、界面执行
2、命令行执行
1)进入jmeter安装目录下
2)执行测试
jmeter -n -t E:\file\Autotest\Test.jmx
3)指定执行结果、日志路径
jmeter -n -t E:\file\Autotest\Test.jmx -l E:\report\report03\test03.jtl -e -o E:\report\report03 -j E:\report\report03\report03.log
结果:
五、调试
1、JMeter常用的调试工具有如下四种:
1)View Tree:查看结果树。含请求信息、响应信息等,请求头信息中的cookie信息一般默认不会显示,可通过修改JMeter配置参数进行显示。日常大家用的挺多的,在此不再赘述。
2)jmeter.log:查看log日志。
3)Debug Sampler:样本调试工具,含输入输出信息。
4)Debug Pre/PostProcessor:用于查看系统中存在变量等信息。
这边着重介绍jmeter.log和Debug Sampler。
2、Jmeter.log
每次执行都会生成相应的日志信息,通过日志可以查看报错信息
3、Debug Sampler
主要用来查看JMeter用户定义变量、JMeter属性变量,以及系统环境变量信息,在查看结果树对应调试器响应结果面板中查看信息。