【背景】
关于自动化,以前公司提供了一个python project,测试人员需要在本地启动这个项目,在excel驱动中填写接口信息编写测试用例,大量的excel维护以及python IDE在测试本地运行终究不便。后来开发改了UI界面的第二版本,但数据驱动用了MySql,一方面没提供公共数据库每个测试人员本地都要自己装MySql,另一方面工具本身未稳定,表结构时常会变动导致使用时的不便。
后来偶尔了解到jmeter可以完成该框架的全部功能且环境更简单,正好最近有个公司刚上线的绩效管理系统,功能简单版本稳定。故借此项目试下JMeter做web接口自动化。
JMeter版本:3.3
ANT版本:1.10.5

【正文】
一、写脚本
1、抓包
抓包主要是为了了解每个操作涉及到哪些接口,这些请求之间有什么逻辑,发出的请求内容是什么,返回的信息又有什么特征等等。
以该项目的登录功能为例,我们抓取到一下4个接口信息。

结合返回的发出与报文信息分析可知,第一次请求是为了校验该登录ID是否存在需要提供验证码(比如发送过上一次登录失败等情况),根据这个返回结果分两种情况,在第二次请求登录接口时是否提供验证码节点。登录成功后发生第三次和第四次请求主要为了获取操作权限和界面菜单。
这些情况都是在接下来编写脚本时需要注意的。
如果项目的接口文档比较全面的话可以省略这一步,根据文档信息直接写脚本。
2、HTTP请求
新建一个http request sampler,需要注意的一点是post类型。如果是application/json类型的,则在body data中直接填入json串即可,如果是application/x-www-form-urlencoded类型的,则需要在parameters中按form格式逐个填写传参值。

这个差异类似于LR写脚本的时候用web_custom_request函数还是用web_submit_data函数。
3、变量
变量分为两部分,一部分是可以事先定义的,比如用户名;另一部分是在测试执行过程中动态生成的,比如csrfToken值(防御CSRF攻击的动态令牌值,随机生成不可预测的)。
用户在登录成功后系统会给予一个Token值,之后的所有请求需要加上这个节点值才有权限操作。这不是一个可以事先设定的变量。
对于前者的变量,我们可以在“配置原件”中添加用户定义的变量,如下图。

对于后者,又要再细分为两类,一个是从接口返回的信息中提取的变量值,另一种则是从数据库获取的变量值(比如从数据库获取某条数据的主键值,在下一次修改接口传参时作为变量提交,又比如事先在数据库查出某表数据量值,以供后续增删操作后的数据量断言与校验)。
从接口返回的信息中提取的变量,以json格式为例,可以用json path extractor提取。从数据库获取变量在[4.JDBC请求]中描述,请看下文。

4、JDBC请求
不管是清理测试数据还是获取变量都需要通过数据库进行操作,JMeter有JDBC request sampler可以实现。首先要配置JDBC Connection Configuration。可以配置多个不同类型的数据库连接,但是要注意请求对应的数据库对象是否一致,该项通过“variable name”进行区分。

将查询结果作为变量,需要填写变量名。


已数组形式保存结果,之后引用需要添加序号。(即${变量名_序号}格式)

5、json断言
用json path assertion对指定节点值进行校验。如操作成功则接口返回json串中有一个success节点的值为true,失败的话就是false。那么就可以如下图设置断言。

如果整个系统的接口都有这样统一的“标识”那么做断言就会方便很多,直接复制到下一个http请求后重复使用,操作便利。
6、管理器
主要用到HTTP相关的几个管理器。
HTTP信息头管理器,填写默认头部信息如host等。

HTTP请求默认值,填写默认IP和端口,这样后面的每个http请求就不需要重复填写了。

HTTP Cookies管理器,沿用上一次请求后的cookie。

7、控制器
这个案例用到了两种控制器:if控制器和循环控制器。
if控制器,当条件命中则进入请求。以[1、抓包]中提到的登录为例,如果第一个接口某节点返回true则表示下一次请求需要多带一个节点传参值。那么这个环节的脚本设计就需要用到if控制器。


循环控制器,就是控制这个环节下的内容执行次数,简单点考虑,如果设置“0”或“1”,就是执行与不执行(跳过)的差异。在脚本编写调试阶段十分实用。还能根据系统菜单分列模块。

二、生成报告
1、配置ANT环境变量
下载地址:http://ant.apache.org/bindownload.cgi
具体配置操作跟jdk一样,略。

2、配置ANTbuild.xml

找个目录,放入脚本(.jmx文件),新建一个report目录,新建一个build.xml文件。
编辑build.xml,放入以下信息:
主要是设置模板路径,报告生成路径,直接脚本路径等内容。
(截图可在网上找到,由于篇幅限制这里不放文本)


3、修改jmeter.properties
jmeter.save.saveservice.output_format=xml

4、运行后查看生成报告
在脚本所在目录打开cmd,输入“ant run”即可直接运行测试计划,无需另启jmeter。


运行成功后在之前设定的生成目录下即可查看测试结果报告。

5、关于报告模板
jmeter自带的有两个,在\extras路径下,jmeter-results-detail-report_21.xsl和jmeter-results-report_21.xsl。顾名思义detail版本在后者基础上增加了更多一下的运行信息,总体而言这两个模板都是偏向于性能测试执行结果的。
如果有能力的话可以自己去调整模板,是用xsl写的。
网上找了个[jmeter.results.shanhe.me.xsl]模板,感觉也不是很好看。

【结语】
后续就是配置到Jenkins中实现持续构建,此文略。
总体来说很便捷,尤其是json格式发出的请求可以从抓包结果直接复制进去,稍微做下参数化,很多断言也是可以重复复制使用的(如果接口设计合理)。最后保存的脚本也就一个jmx文件,干净简洁便移植便调整,ant运行方便,Jenkins构建更不用说了。
自己搭框架让初级测试人员去填写繁琐的excel数据驱与此相比,运行累赘,文件冗杂,推广难度也大。
当然具体的还是因项目而异。
不管怎么说,测试小伙伴们,用jmeter做简单自动化测试的技能你GET了吗~

↓↓扫一扫,防脱发↓↓





