摘要:JMeter工具在实际测试场景中不仅限于单个线程组和请求,还须根据业务需求和逻辑进行接口间的关联,以实现正常通信。接口间的通信主要依赖数据驱动,数据可在同线程组和跨线程组间传递,解决接口数据传递问题在接口测试中尤为重要。文章结合某系统的购物车接口,详细阐述了JMeter工具如何通过文件和数据库获取外源数据,驱动同线程组和跨线程组的接口测试执行,从而优化测试脚本,帮助用户设计复杂场景,提高测试效率。
关键词:JMeter;接口关联;数据驱动;同线程组;跨线程组
中图分类号:TP311文献标识码:A
文章编号:1009-3044(2024)34-0043-03开放科学(资源服务)标识码(OSID):
0引言
随着软件行业的迅速发展,企业对软件产品的要求日益提高,简单的功能测试已无法满足市场需求。在日常测试中,不仅需要测试界面功能,还须绕过前端,接口先行进行测试,以确保前后端数据通信畅通。在接口测试过程中,往往需要结合业务需求同时测试多个接口,而这些接口之间通常存在依赖关系。因此,使用接口测试工具可以提高测试效率。目前,市场上主流的接口测试工具包括JMeter、Postman和LoadRunner等,它们各具特色,用户可根据项目需求选择最优工具。本文主要介绍JMeter工具如何通过CSV文件和关联数据库,将测试数据与测试逻辑分离,通过不同的方式输入数据集来驱动测试执行,从而更好地模拟真实的用户场景,使测试结果更趋于真实。
1JMeter介绍
JMeter是一个基于Java的开源免费工具,拥有图形用户界面,适用于多种测试场景,如性能测试、分布式性能测试、功能测试和接口测试等[1]。其可扩展性强,用户可通过插件和定制脚本扩展功能,以满足复杂测试场景的需求。因此,许多公司将JMeter作为首选的接口测试工具。此外,JMeter能够灵活处理外源数据驱动测试,并支持HTTP、SOAP等多种服务,采用多线程框架,允许通过多个线程并发取样[2]。
2JMeter接口关联
在接口测试过程中,通常会遇到下一个请求的参数需要取自上一个请求的响应值,这一过程体现了接口的关联。最常见的示例是登录接口与其他任意接口之间的通信。在使用软件产品时,第一步通常是登录,登录后才能进行后续操作,接口测试同样需要获取登录响应中的鉴权码,并将其传递到其他接口中,以便访问接口信息。接口关联的本质是接口间的数据传递,将一个接口的响应数据提取出来作为另一个接口的请求参数,从而实现数据之间的通信[3]。
3JMeter数据驱动
JMeter支持数据驱动测试,旨在模拟真实的测试场景,通过使用外源数据来驱动测试场景的执行。这种测试方法灵活多样,支持不同输入数据测试同一套脚本以覆盖多种测试场景。其扩展性强,支持各种数据源,数据可来自文件和数据库,处理数据库数据时只需要修改SQL语句即可满足不同测试场景的要求。
4通过CSV文件获取外源数据驱动测试执行
在测试加入购物车接口的过程中,为验证不同商品加入购物车功能的正常性,可将商品的ID放在CSV文件中,以模拟不同商品的加入。由于每次迭代的数据不同,须进行参数化,从参数化文件中取值。CSV数据文件的设置如下:文件名可通过预览按钮选择,文件编码默认UTF-8,变量名称可自定义,列数与变量名称一一对应,用英文逗号隔开(id,nums),忽略首行根据数据而定,若有列名则选择True,否则选择False,其余项保持默认[4]。具体操作步骤如下:
打开JMeter脚本文件,切换到存放加入购物车请求的线程组,右击线程组,选择“添加”→“配置元件”→“CSVDataSetConfig”以添加数据文件设置元件。
在桌面创建一个文本文件,添加id和nums两列数据,使用英文逗号隔开,保存后修改文件后缀为.CSV。
双击打开CSV文件,数据将自动分为两列,其中id为商品的ID,nums为对应商品的加入数量。
至此,CSV数据文件设置配置完毕。可在加入购物车接口通过${id},${nums}将CSV数据文件设置中的数据进行调用传递。
5通过数据库获取外源数据驱动测试执行
5.1数据库连接配置和JDBCRequest请求取样器
在使用数据库获取外源数据驱动测试执行前,须进行一些准备工作。首先,下载jdbc驱动包,解压后放在JMeter安装目录的lib文件中,并重启JMeter以使其生效。接下来,在JMeter中完成数据库连接配置,具体步骤如下:
在测试计划底部的“库”中复制粘贴刚才加入lib目录下的jdbc驱动包全路径。
在线程组下添加配置元件“JDBCConnectionCon⁃figuration”。步骤:右击线程组,选择“配置元件”→“JDBCConnectionConfiguration”[5]。
添加完成后,在该模块下配置数据库地址、选择jdbc驱动类型(填写所用数据库的类型)、输入数据库账户和密码。完成数据库配置后,即可添加“JDBCRequest”请求取样器进行SQL的编辑[6]。JDBCRe⁃quest取样器配置步骤如下:
右击线程组选择取样器→JDBCRequest。
将数据库配置中连接池名称mypool关联到JDBCRequest取样器顶部variablenameboundtopool中。
在底部Variablenames定义一个变量名用于接口请求调用。JDBCRequest取样器配置如图1所示。
为清楚展示SQL语句查询到的数据并方便其他请求调用,须在JDBCRequest请求取样器下方添加调试取样器和查看结果树以获取数据传参的格式。添加调试取样器的步骤:右击线程组选择“取样器”→“调试取样器”;添加查看结果树的步骤:右击调试取样器选择“添加”→“监听器”→“查看结果树”。添加完成后运行脚本,可在查看结果树中看到goods_id_序号中变量名引用的是JDBCRequest请求取样器中设置的变量名称goods_id。调试取样器查看结果树结果如图2所示。
5.2同线程组接口关联实现数据驱动
完成数据库配置后,通过JDBCRequest请求取样器查询到商品ID,为将查询到的商品ID传递给同线程组下的加入购物车接口,须将JDBCRequest请求与加入购物车接口进行关联[7]。以下介绍三种同线程组读取数据库查询结果的方法,并分析各方法的特点和适用场景。
添加循环控制器:设置循环次数为${goods_id_#},该值调用图2调试取样器中的goods_id_#=10,表示循环遍历10次以获取数据库查询的10个ID结果,用于加入购物车接口的商品ID传参。须添加计数器,设置开始遍历值为1,依次增加1,以获取查询到的10个goods_id_后的序号。此外,还须设置引用名称,该名称可自定义[8]。完成设置后,在加入购物接口中通过${__V(goods_id_${cishu},)}完成goods参数的调用。计数器设置如图3所示。
以上通过循环控制器获取数据库查询结果驱动测试执行的方式,其特点是可以指定循环次数。这种方式适用于对某个请求进行多次或者重复执行的场景。该方法存在一个缺点:只能通过goods_id_N表示第几个id,永远都是从1开始,与所取得的值没有任何关系,使用不够灵活,较为死板。
使用ForEach控制器:相较于循环控制器,ForEach控制器获取数据库结果更为简洁明了。配置时须输入变量前缀,开始循环字段应该为0,结束字段通过${goods_id_#}调用总个数[9]。输出变量名称可自定义,用于加入购物车接口请求的参数调用。以上通过ForEach控制器获取数据库查询结果驱动测试执行的方式,其特点是可以通过输入的数据数量自动调整循环次数。这种方式适用于处理变量数量的场景,不像循环控制器一样固定循环次数,相比较而言更为灵活。使用函数嵌套:此方法更为精简,直接使用随机函数随机获取查询结果。通过随机函数${__Random(1,${goods_id_#},)}在[1,goods_id_#]之间随机取值,结合V函数完成商品ID的参数调用。
以上通过函数嵌套获取数据库查询结果驱动测试执行的方式,其特点是具有强大的逻辑处理能力,无须编写复杂的脚本,允许用户在测试计划中执行计算或者逻辑判断。这种方式适用于在测试计划中处理计算和逻辑判断的场景,相较于循环控制器和ForEach控制器来说更易于处理变量。
5.3跨线程组接口关联实现数据驱动
当接口分布在不同的线程组时,仅使用后置处理器提取数据的JMeter变量无法完成跨线程组接口间的数据传递,因为该变量是局部变量,只能在同线程组间传递。为实现跨线程组接口数据的关联,须将局部变量修改为全局变量。在JDBCRequest请求下面添加BeanShell后置处理器,通过编写BeanShell脚本将局部变量设置为全局变量。示例代码如下:
在BeanShell取样器中已将查询到的商品ID设置为全局变量,但在调用查询结果时需要在加入购物车接口所在的线程组添加一个计数器。由于BeanShell后置处理程序中已将获取到的商品ID存放在新的列表中,故须添加计数器逐一获取商品ID变量前缀(goods_id_)后对应的序号。新列表商品序号从下标0开始计数,且最后一位需要向前进一位。同时,在BeanShell后置处理程序中的num-1已赋值给count,故通过P函数${__P(count,)}调用即可获得计数器所需最大值。此外,还须在计数器下方添加一个BeanShell预处理程序,通过脚本获取全局变量并进行处理,然后将“goods_id_”与计数器遍历获取到的序号进行拼接,从而获取真正的商品ID。预处理程序示例代码如下:
6结束语
本文主要介绍JMeter通过文件和数据库获取外源数据在同线程组和跨线程组之间驱动测试执行的各种方法,同时使用BeanShell后置处理程序和BeanShell预处理程序解决了数据库数据在跨线程组间关联的问题,并结合某网站加入购物车接口调试验证了接口间的关联性。以上数据驱动场景的探索研究可帮助用户完成复杂测试场景设计,同时亦能更好地维护JMeter接口测试脚本。JMeter工具不仅可实现接口的功能测试,而且可测试接口的性能。下一步将在接口数据驱动的基础上进行接口性能测试研究,以优化被测系统性能,使软件产品更趋稳定。
参考文献:
[1]张亿军.JMeter测试应用研究[J].信息技术与信息化,2021(10):61-64.
[2]张嘉杰.基于JMeter、Ant和WeTest的佣金管理系统接口自动化测试程序开发[J].电子技术与软件工程,2020(24):26-29.
[3]陈雷.JMeter原理与实践[M].北京:电子工业出版社,2021.
[4]李金萌.基于JMeter的资产管理系统应用[J].电子技术与软件工程,2023(4):53-56.
[5]冯瑶,秦洪岩,刘跃光.基于Jmeter开展接口自动化测试方法探索与实践[J].中国金融电脑,2020(2):48-50.
[6]巴约·艾林勒.JMeter性能测试实战[M].黄鹏,译.北京:人民邮电出版社,2020.
[7]王芬.接口测试中数据关联技术的运用[J].电脑知识与技术,2021,17(11):67-68.
[8]纪力炜.基于JMeter工具的性能自动化测试系统设计与实现[D].南京:南京邮电大学,2016.
[9]陈志勇,马利伟,万龙.全栈性能测试修炼宝典:JMeter实战[M].北京:人民邮电出版社,2016.
[10]周燕,肖玉,许华.基于JMeter接口关联技术研究[J].信息技术与信息化,2023(3):160-163.
【通联编辑:谢媛媛】