如何用Jmeter做接口自动化测试_跟着操作一次就明白了

Jmeter是Apache公司组织开发的一款基于Java压力测试工具,开源且支持多个操作系统,可以对测试静态和动态资源进行大并发负载模拟,或对服务器网络进行高强度并发测试,业界多将该工具应用于性能测试。本文则利用该工具特点,结合接口级功能测试的属性、特点,开展了自动化测试方法探索与实践,以期与大家交流和分享。

一、实践背景

在自动化功能测试领域,按照业界普遍认同的单元级、接口级、UI界面级7-2-1占比原则,接口级功能测试能够屏蔽案例对某些特殊环境依赖、适用范围广,可实现复杂案例设计,能收益率适中(占比20%),可提前开展等特点,但接口级自动化测试一般需要依据系统接口特点和报文格式进行适应性开发,工具研发周期较长的缺点,因此选择一款不用开发,即可适合接口级自动化测试工具是非常有意义的。

Jmeter因支持对服务器进行大规模的高强度负载测试,来检测不同并发数量下系统的整体性能情况,并可以通过内置的Jmeter控件,以文本表格或图形展示的形式生成吞吐量、响应时间等指标的统计分析,在业界被广泛应用于性能测试。而该工具同时具有可移植性,并支持多线程工作,允许通过多个线程并发取消,同时可以通过单独的线程组对多个不同的功能同时取样,操作者可通过GUI操作界面进行方便友好的操作,上手很快。

此外,该工具具有高可扩展性,它的远程发压机可支持无限制的测试能力。并且它不仅具有多种配置元件、处理器、监听器可供选择,还支持脚本编程、动态输入及自定义插件等,用户可根据自身需要进行功能扩展。因此,基于Jmeter的高扩展性以及支持GUI界面等特性,本文结合使用Jmeter工具开展接口自动化功能测试,进行了有益的探索和总结。

测试方法及步骤

图1 基于Jmeter进行接口功能测试的步骤图

基于Jmeter进行接口功能测试主要分为报文准备、数据准备、断言设置、测试执行、结果统计等五个步骤,如图1所示。这种方法不仅适用于单交易场景,也适用于混合交易场景。

1.报文准备

报文准备共有三种方法,分别是:直接复制粘贴报文、浏览器录制协议报文、手动添加参数三种方法。

(1)直接复制粘贴报文

这种方法适用于开发人员已完成单元测试,此时开发人员可提供给测试人员能够直接使用的测试报文。

以HTTP请求为例,先在Jmeter工具里新建一个HTTP请求,然后在Body Data中复制粘贴请求报文。对于HTTP请求而言,JSON和XML数据格式请求要选择此方法,并且在HTTP请求控件下新增HTTP信息头管理器。设置Content-Type为对应的application/JSON或application/XML。

(2)浏览器录制协议报文

这种方法适用于B/S结构的系统。使用本地浏览器访问客户端,通过给浏览器设置代理服务器来录制协议报文。

使用这种方法时,我们首先要新建一个带录制功能的模板(Recording Templates),然后在浏览器中设置局域网的监听端口,监听地址为本机,即localhost。在Jmeter工具中打开启动按钮后,在浏览器中访问客户端地址,进入操作界面,开始录制交易。录制完成后在Jmeter工具中选择停止录制。最后获取到的报文可能会包括一些无关的HTTP请求,需要删掉这些无关请求,完成交易报文裁剪。

录好的报文请求分为几种:

HTTP请求方法为POST,指的是向服务器提交数据。比如完成表单的数据提交,将数据提交给服务器处理。

GET方法用于请求服务器发送某个资源。

PUT方法是让服务器用请求的主体部分来创建一个由所请求URL命名的新文档。

DELETE方法是请求服务器删除指定URL所对应的资源。

HEAD方法与GET类似,但这种方法允许客户端在未获取实际资源时对资源的首部进行检查。

(3)手动添加参数

这种方法适用于测试人员无法从开发人员处获取到报文,或者无法通过浏览器录制到报文的情况。也就是说当第(1)、(2)种报文准备方法都无法获取到报文时,可以通过手工添加参数来拼装报文。

以HTTP请求为例,首先需要在Jmeter里新建一个HTTP请求,然后在Parameters中按照报文的参数格式手工添加参数名称和参数值。需要注意的是,在HTTP请求控件下,需要新增HTTP信息头管理器,否则有些报文执行时会报错。一般来说,GET请求和POST请求使用此方法时,GET请求一定要设置Content-Type为application/x-www-form-urlencoded。而对于POST请求方式,本身默认就会以application/x-www-form-urlencoded方式提交数据,不需要单独设置Content-Type。

2.数据准备

数据准备主要有三种方式,分别是以文件格式保存、从数据库动态读取、关联。

以文件格式保存

这种方法适用于需要每次进行接口功能测试时,使用不同数据进行迭代的情况。

首先,将数据信息存在文件里,用分隔符分隔。然后新建CSV Data Set Config控件,定义路径、分隔符,参数名等。并在后续使用参数名在报文中进行引用。

它可用于快速测试多种类型数据的情况。如在文件中提前准备好基本账户、一般户、专用户、注册验资户、外币户等多种类测试数据。

从数据库动态读取

如果需要从数据库获取数据及参数,或者快速批量准备基础数据,可通过连接数据库传递参数的方式,从数据库动态读取数据。

以ORACLE数据库为例,首先新建JDBC Connection Configuration配置元件,然后添加JDBC Request控件,将获取结果集的SQL语句填入JDBC Request中,并将结果集定义成变量。以便在报文中进行引用。

这种方法可以用于快速批量准备基础数据。如往1000个账号中存入现金、批量签约等。

(3)关联

关联,即前一个交易的输出是后一个交易的输入。关联方式有多种,其中正则表达式的应用较为广泛。

首先需要新建正则表达式提取器,填写相应字段,然后再在后续报文中对参数名进行引用即可。

字段含义如下所示:

①引用名称:下一个请求要引用的参数名称。

②正则表达式:():括起来的部分是要提取的内容

.:匹配任何字符串

+:一次或多次

?:找到第一个匹配项后停止

③模板:如果正则表达式中有多个提取表达式,则$0$代表全部,$1$代表第1个,以此类推;$1$$2$代表第1个和第2个,中间没有间隔,以此类推。

④匹配数字:0代表随即取值,-1代表全部取值,正数n则表示取第n个值。

⑤缺省值:如果参数没有取到数值,那默认赋予一个值。

3.断言设置

断言主要分为三种形式,分别是通过性测试断言、反向案例断言、功能测试断言。

(1)通过性测试断言

在测试正向案例的时候,返回报文中带有成功标示或返回了成功码,则认为交易成功。

如在断言中加入响应文本:交易成功。B/S结构网站,交易成功的标志是在断言中加入响应代码:200。

(2)反向案例断言

在测试反向案例的时候,返回报文中带有错误标志或返回错误码,则认为反向案例通过。如B/S结构网站要测试登陆的接口,当用户名和密码不合法的时候,会响应一个提示,然后状态码是400,此时可在断言中加入响应代码:400。或XML格式接口报文的日期字段输入非数字字符时,可在断言中加入响应文本:日期格式输入非法。

(3)功能测试断言

对接口进行系统功能测试时,要设计符合业务需求的功能测试断言。此时可以通过添加后置处理器JSON Extractor,以及响应断言。首先获取响应报文中的变量字段,然后在断言中使用Jmeter Variable去校验得到的变量与预先设置的值是否一样。

举个例子,若交易的响应报文为:

  {"records":[{"num":"","name":"TONY","age":3}],"total":1,"size":10,"current":1,"pages":1}

假定我们想去判断num是否为,name是否为TONY。需要首先添加后置处理器JSON Extractor。将变量名称设置为num;name,要取的JSON表达式设置为$.records[0].num;$.records[0].name。

JSON Extractor使用JSON path表达式匹配,可以一次取多个变量值。多个变量间用";"作为分隔符。用"$"表示响应的根对象。取子对象或对象的属性用"."表示。取数组里的对象用"[ ]"表示,数组索引从0开始。

这里需要特别注意,JSON Extractor中的Variable names、JSON Path expressions、Default Values的数量必须一致,否则无法取到响应报文中的变量。

之后,添加响应断言,注意要选择Jmeter Variable类型的响应断言,并把JSON Extractor设置的变量名称填入Apply to中。

在运行前可以添加一个Debug PostProcessor控件,以便查看响应报文对应的变量返回值。

4.测试执行

在线程组中定义好线程数是1(单并发),根据需要选择取样器错误后要执行的动作,例如是继续还是停止线程。然后点击启动按钮,开始进行测试执行。

5.结果统计

通过监听器的聚合报告来统计测试结果。如果交易运行失败,可通过查看结果树中的取样器结果以及请求和响应数据排查错误,进行报文调试。

三、实践总结

本文所述的这种使用Jmeter进行接口功能测试的方法具有一定的优势。

第一,Jmeter工具可以通过灵活设置断言来验证程序返回结果是否正确,实现各种功能测试需求;

第二,它能够方便快速的测试多种协议的无前台界面交易,对于一些B/S结构的系统,它可以不依赖于前台界面,并且可以跳过界面限制,直接向后台发起正向数据的功能逻辑测试或反向数据的健壮性测试。

第三,利用测试数据自动装填的方式,快速测试多种类型数据,用自动化测试来代替手工执行案例,提高测试效率;

最后,由于它支持由多个交易组成的业务场景测试,所以可灵活、高效地为测试团队完成测试数据准备。

比如:我们可将对公账活期账户开户、启用、现金存入3个交易关联在一起,快速准备出大量有余额的对公活期账户,以供测试团队分配及使用。

以上测试方法的探索与实践,一方面有助于提升测试效率。另一方面,也为今后的测试工作积累了宝贵的经验。随着测试技术的不断发展,测试方法越来越多样化,每种测试方法都有不同的针对性。对于不同类型的测试项目来说,测试策略和方法要根据实际情况来决定,选择合适的测试方法可以让我们的测试工作事半功倍。

我是谁?

我是一名从事了多年软件测试的老测试员,今年年初我花了一个月整理了一份最适合2020年学习的软件测试学习干货,可以送给每一位对软件测试(包括接口测试)感兴趣的小伙伴,想要获取的可以关注我的头条号并在后台私信我:【测试】,即可免费获取。