APP下载

JMeter工具二次开发之自定义函数

2023-04-13周燕肖玉王智超

计算机时代 2023年4期
关键词:二次开发开源

周燕 肖玉 王智超

摘  要: 许多应用系统功能日益复杂,JMeter已有的功能组件时常无法满足测试需求。文章根据JMeter的开源特性,对其进行二次开发,通过自定义函数扩展其已有功能;详细介绍JMeter自定义函数开发的原理和流程并给出关键代码的实现过程;结合WebTours系统,将完成的自定义函数应用于具体的测试场景。帮助测试人员快速掌握自定义函数的实现与应用,实现定制化的功能,以满足个性化的测试需求。

关键词: JMeter; 开源; 自定义函数; 二次开发

中图分类号:TP31          文献标识码:A     文章编号:1006-8228(2023)02-135-04

Abstract: Many application systems have increasingly complex functions, and JMeter's existing functional components often fail to meet the test requirements. In this paper, based on the open source characteristics of JMeter, we perform secondary development and extend its existing functions through custom functions. The principle and flow of JMeter custom function development are introduced in detail, and the realization process of key code is given. Combined with the WebTours system, the completed custom functions are applied to specific test scenarios. It helps testers to quickly master the implementation and application of custom functions, realize customized functions, and meet personalized test requirements.

Key words: JMeter; open source; custom functions; secondary development

0 引言

JMeter是Apache基金會旗下一款优秀的性能测试和接口测试工具,已经被越来越多的公司所采用。与同类的性能测试工具LoadRunner、接口测试工Postman相比,其优点是100%纯Java[1]开发且开源、有较强的扩展性。它拥有丰富的插件、元件和函数等功能来满足各种测试需求。但随着应用系统业务逻辑复杂性的大幅提升,系统的功能也日益个性化,测试工作的难度陡增。JMeter已有功能更多的是针对一些通用性的功能而开发,很难满足这种个性化的需求。得益于其开源特性,JMeter拥有其他测试工具所没有的可灵活扩展性,用户可根据实际功能需求和测试场景,对JMeter做二次开发[2],实现个性化的测试需求。JMeter二次开发一般分为三类情况:自定义组件、自定义请求和自定义函数。在JMeter中通过函数可以灵活的获取动态变化的值,代替录制脚本时所设置的固定值,对脚本进行参数化,使整个测试过程更加贴近实际的应用场景。

1 JMeter函数介绍

在性能和接口测试过程中,通常需要将用户输入的数据提交给服务器进行处理,例如测试登入功能需要用户输入用户名和密码。但是每个用户登入的用户名和密码都不一样,测试时为了模拟真实的用户场景,就需要让用户输入的内容每次都发生变化,这个过程叫做参数化。

JMeter中的配置元件与前置处理器[3]都可以实现参数化,但使用起来较复杂且不够灵活,为了能够更好的帮助用户进行参数化,JMeter提供了一组库函数来帮助用户生成需要的数据。在JMeter菜单选项中的函数助手对话框中,可以看到JMeter自带了许多的库函数[4],如常用的RandomString、counter等,如图1。每个函数主要分为上下两部分,上半部分是函数参数,所有参数以表格的形式进行展示,左边为参数的描述,方便用户理解参数的含义,右边则可由用户来输入该参数相应的值;下半部分是函数的结果,当用户点击“生成”按钮后下方会展示根据用户输入的参数,该函数所返回的结果。同时JMeter会根据函数名和用户选择的参数,自动生成函数的调用字符串例如:${__RandomString(3,abc123dw,str)},并自动做了复制功能,用户可以直接拷贝到需要调用的地方。

不同接口测试、性能测试项目或场景中,有不同的特性,已有的这些函数只能满足80%的业务需要。例如函数库中RandomString函数,可以生成指定长度的随机字符串,但在实际测试业务中,需要的字符串可能还要求有固定的前缀,那么已有库函数就无法满足测试需求,而自定义函数刚好可以解决此问题。

2 开发自定义函数

JMeter不仅是一个测试工具,而且还是一个优秀的框架,其提供了丰富的jar包方便用户进行二次开发,下面将在库函数RandomString的基础上进行优化扩展,开发一个自定义函数PrefixRandomString——带前缀的随机字符串,以此为例介绍自定义函数开发的原理和整个流程。

2.1 选择开发工具

JMeter是使用Java开发的,进行二次开发时需要使用支持Java的开发工具,比如Eclipse、IntelliJ IDEA等来编写自定义函数。下文中使用开源软件Eclipse进行开发,先在eclipse中选择菜单File->New->Java Project创建一个普通的Java项目即可。

2.2 添加依赖的jar包

JMeter安装目录lib/ext中的ApacheJMeter_core.jar包,是JMeter中的核心jar包,该jar包中实现了对JMeter进行二次开发的一些基本框架和功能。在进行开发时,要依赖该jar包,需要提前导入Java项目的referenced libraries中。

2.3 类的设计与实现

自定义函数的所有功能都封装在Java类中,其代码需要符合JMeter的编码规范——扩展函数的Java类,其包名必须是.function,JMeter通过类的命名规则确保当其以非GUI模式运行时一些核心的类也能够被正常加载。自定义函数类所在的包名可以参考JMeter自带库函数类所在包的名称org.apache.jmeter.functions來进行命名;同时该类还要继承ApacheJMeter_core.jar包中的AbstractFunction 类,并重写父类中的四个方法。

⑴ getReferenceKey方法:该方法返回自定义函数的名称。每个函数都有一个独一无二的名称,所以必须重写这个方法。函数的名称反映了其功能,要做到顾名思义,方便用户使用。根据JMeter的规范,函数名称一般以双下划线开头,如__RandomString、__Time等,而且建议与类名同名。参考代码如下:

@Override

public String getReferenceKey() {

return "__PrefixRandomString";

}

⑵ getArgumentDesc方法:该方法描述了函数的参数。如果自定义函数没有参数,则可以不用重写这个方法;如果有参数,为了便于函数调用者输入参数,需要在这里返回函数参数说明。函数的参数一般情况下固定不变,常将其参数描述存放在全局静态变量list中,而在函数体中直接将这个list返回,参考代码如下:

private static final List args=new LinkedList

();

static {

args.add("指定前缀(必填)");

args.add("随机字符串的长度(必填,不包括前缀)");

args.add("组成字符串的字符(可选)");

args.add("存储结果的变量名(可选)");

}

@Override

public List getArgumentDesc() {

return args;

}

⑶ setParameters方法:该方法传递用户调用过程中传入的实际参数值。对于有参数的函数,可以在该方法中获取用户调用函数时传递过来的参数,并对参数的个数、类型等进行有效性校验,保证函数的健壮性和正确性。参考代码如下:

public void setParameters(Collection

arg0) throws InvalidVariableException {

//检查参数是否为2到4个

checkParameterCount(arg0, 2, 4);

Object data[]=arg0.toArray();

//获取前缀

prefix=((CompoundVariable) data[0]).execute();

//获取长度

length=Integer.parseInt(((CompoundVariable) data[1])

.execute());

//如果指定了组成字符串的字符,则获取使用的字符串

if (data.length>2) {

charsToUse=((CompoundVariable) data[2])

.execute().trim();

}

//如果输入了存储结果的变量名,则获取变量名

if (data.length>3) {

varName=((CompoundVariable) data[3])

.execute().trim();

}

}

⑷ Execute方法:该方法是自定义函数中最关键的部分。根据业务规则,实现自定义函数的核心逻辑,将最终生成的结果返回,参考代码如下:

@Override

public String execute(SampleResult arg0, Sampler

arg1) throws InvalidVariableException {

//最后的结果由用户输入的前缀+随机生成的字符串组成

String myValue=prefix;

if (StringUtils.isEmpty(charsToUse))

myValue+=RandomStringUtils.random(length);

else {

myValue+=RandomStringUtils.random

(length, charsToUse);

}

//如果输入了存储结果的变量名,将结果保存到变量中

if (varName.length()>0) {

JMeterVariables vars=getVariables();

if (vars!=null) {

vars.put(varName, myValue);

}

}

returnmyValue;

}

2.4 单元测试

完成自定义函数的开发后,还需要测试函数功能是否正常。一般使用了java语言自带的单元测试框架Junit[6]进行测试,开发工具Eclipse中已经集成了JUnit作为单元测试的工具。

2.5 使用自定义函数

代码调试无误后,在开发工具Eclipse中右键单击项目名称,选择菜单Export->JAR file将整个项目打包导出为jar包,拷贝至jmeter安装目录lib/ext的文件夹下。JMeter启动时会自动加载该目录下符合要求的jar包。

重启JMeter,打开函数助手对话框,在下拉列表中就能看到所开发的自定义函数,用户像使用普通的库函数一样使用它即可,如图2所示。

通过函数助手界面可以发现,getReferenceKey方法中所返回的函数名对应着界面下拉列表中的名称;getArgumentDesc方法中返回的函數参数说明对应界面中函数参数表格的部分,可以在表格中输入具体的参数值;而界面上显示的结果则是Execute方法的返回值。下面将在WebTours系统使用该函数测试系统的登入功能。

3 WebTours系统案例分析

WebTours系统是LoadRunner自带的测试系统,可以进行简单的航班查询、飞机订票、取消航班、登入、退出、注册等操作。首先安strawberry-perl-5.10.1.0, 接下来打开WebTours文件夹,双击 StartServer.bat,开启服务器,然后在浏览器中输入http://127.0.0.1:1080/WebTours/即可访问系统[5]。在进行订票操作之前,需要先在注册页面,输入用户名、密码以及确认密码完成注册。

现使用JMeter对注册功能进行并发测试,其测试场景为:批量注册100个用户,用户名的命名是以user开头且长度为6位的随机字符串组成。线程数为5,循环20次。具体实现步骤如下:

⑴ 使用JMeter录制登入脚本,通过分析post请求cgi-bin/login.pl的参数可知,username就是注册时用户输入的用户名。

⑵ 测试要求用户名以user开头,使用前面实现的自定义函数PrefixRandomString生成带前缀的随机字符串,作为参数替换录制时的用户名,如图3所示。

⑶ 修改线程组的场景,设置线程数5个,循环次数20次,自动完成100次注册操作。每次进行注册请求时JMeter都会调用函数PrefixRandomString生成随机的字符串作为用户名。

⑷ 执行JMeter的脚本后,在WebTours安装目录WebTours\cgi-bin\users中,可以看到注册成功的用户名,全部以user作为前缀,如图4所示。

4 结束语

自定义函数开发,是软件测试人员对JMeter基础操作熟悉的前提下所做的高级操作,也是测试复杂系统时所必备的技能。本文考虑实际应用场景,结合WebTours系统,详细介绍了JMeter自定义函数开发的整个流程以及实际应用。有助于软件测试人员快速的进行自定义函数的开发,完成个性化的测试任务。JMeter作为一款开源的测试工具,为用户提供了更多的灵活性,在实际应用中还可以自定义组件和自定义请求,使JMeter能更好的满足测试要求。

参考文献(References):

[1] 明日科技.Java从入门到精通(第6版)[M].北京:清华大学出版社,2021

[2] 胡通.大话性能测试JMeter实战[M].北京:人民邮电出版社,2021

[3] 陈志勇,马利伟,万龙.全栈性能测试修炼宝典JMeter实战[M].北京:人民邮电出版社,2016

[4] 巴约·艾林勒著,黄鹏译.JMeter性能测试实战(第2版)[M].北京:人民邮电出版社,2020

[5] 张亿军.JMeter测试应用研究[J].信息技术与信息化,2021(10):61-64

[6] 贾美丽,康珺.JUnit在单元测试中的应用[J].计算机与现代化,2013(8):116-118

作者简介:周燕(1985-),女,湖北荆州人,硕士,助教,主要研究方向:软件开发、软件测试。

猜你喜欢

二次开发开源
浅谈基于Revit平台的二次开发
五毛钱能买多少头牛
2019开源杰出贡献奖
西门子Operate高级编程的旋转坐标系二次开发
浅谈Mastercam后处理器的二次开发
大家说:开源、人工智能及创新
开源中国开源世界高峰论坛圆桌会议纵论开源与互联网+创新2.0
开源计算机辅助翻译工具研究
Micaps3.2 版本二次开发入门浅析
ANSYS Workbench二次开发在汽车稳定杆CAE分析中的应用