阅读本文大约需要10分钟
JMeter提供了多种取样器,包括HTTP请求,Bean Shell Sampler, JDBC Request……可以支持大部分的请求。除此之外,如果公司使用了自定义的接口协议,JMeter依然可以强大地支持。JMeter提供了自定义Java请求,通过选择自定义指定类型的Java类,以及填写指定的入参,便可以调用指定协议的Java请求。
下面开始介绍如何编写自定义的Java Sampler类。
使用IDEA(或Eclipse)新建一个maven工程, pom.xml文件中引入ApacheJMeter_core和ApacheJMeter_java包,如果自己的接口协议包包含了与ApacheJMeter共用的包,需要将其排除。如:
<dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_core</artifactId> <version>${jmeter-version}</version> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_java</artifactId> <version>${jmeter-version}</version> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> </exclusions> </dependency>
新建JavaSampler类实现JavaSamplerClient类,并实现未实现的方法。
//设置默认参数 public Arguments getDefaultParameters() { Arguments args = new Arguments(); args.addArgument("name", "yoyo.zhang"); args.addArgument("nums", "1,2,3"); return args; }
此方法设置入参变量名及默认值,设置之后,会自动加载到JMeter GUI的参数列表中。
//初始化运行数据 public void setupTest(JavaSamplerContext javaSamplerContext) { name = javaSamplerContext.getParameter("name") == null ? "My Dear" : javaSamplerContext.getParameter("name"); }
相当于Junit或TestNg中的@BeforeClass,在执行方法之前,先初始化线程的公用部分,每个线程都只执行一次。
//执行测试主体 public SampleResult runTest(JavaSamplerContext javaSamplerContext) { SampleResult sampleResult = new SampleResult(); try { String nums = javaSamplerContext.getParameter("nums"); String[] numArrays = nums.split(","); Map<String, String> result = new HashedMap(); //设置开始取样 sampleResult.sampleStart(); for (String num : numArrays) { try { Long dig = Long.valueOf(num); Long res = 1L; for (Long i = 1L; i <= dig; i++) { res = res * i; } result.put(num + "!", res + ""); } catch (Exception e) { result.put(num, e.getMessage()); } } //设置结束取样 sampleResult.sampleEnd(); //设置请求内容 sampleResult.setSamplerData(name + "/n" + nums); //设置响应数据 sampleResult.setResponseData("Hi," + name + "!/nThe n! result of your input is/n" + result + "", "UTF-8"); //设置结果为成功 sampleResult.setSuccessful(true); //设置Response code为200 sampleResult.setResponseCodeOK(); } catch (Exception e) { //设置结果为失败 sampleResult.setSuccessful(false); //设置取样器结果中的Response code sampleResult.setResponseCode("999"); //设置取样器结果中的Response message sampleResult.setResponseMessage(e.getMessage()); e.printStackTrace(); } return sampleResult; }
性能测试的线程运行体,测试执行主体,从入参javaSamplerContext中获取参数值,并在
sampleResult.sampleStart();与sampleResult.sampleEnd();
之间编写调用被测方法的代码,完成与服务器的交互。该方法是java Sampler实现的重点,执行次数取决于线程数和循环次数。
//结束清理 public void teardownTest(JavaSamplerContext javaSamplerContext) { //do something like @AfterClass }
相当于Junit或TestNg中的@AfterClass,测试主体执行结束之后,运行该方法,可根据需要编写代码。
public static void main(String[] args) { JavaSampler javaSampler = new JavaSampler(); Arguments params = new Arguments(); params.addArgument("name", "Yoyo.Zhang"); params.addArgument("nums", "20,2,3,4,5;2"); //或者直接使用默认参数值 // Arguments params = javaSampler.getDefaultParameters(); JavaSamplerContext javaSamplerContext = new JavaSamplerContext(params); javaSampler.setupTest(javaSamplerContext); SampleResult sampleResult = javaSampler.runTest(javaSamplerContext); System.out.println(sampleResult.getResponseDataAsString()); javaSampler.teardownTest(javaSamplerContext); }
直接在main方法上调用自定义的JavaSampler类,省去打jar包,重启JMeter等时间。
1. File>Project Structure>Project Settings>Artifacts> + > Jar >Empty > + Module Output > OK
2. Build>Build Artifacts…>选择上一步配置的jar名称>Build
3. 打包结束后,在out/artifacts目录下可以找到jar包,
如%PROJECT_PATH%/out/artifacts/jmeter_plugin_jar。
1.放jar包: 将上一步打好的jar包放在%JMETER_HOME%/lib/ext路径下【不能建子目录】,如果依赖的第三方jar包,且%JMETER_HOME%/lib下未找到的,需要将其放在%JMETER_HOME%/lib目录下,若已存在相同的包但版本号不同,保留高版本的jar包,因为优秀的jar包都是向下兼容的。若觉得都统一放在已有的两个文件夹根目录下,有点杂乱,可以参考 JMeter扩展jar包与依赖jar包 一文,配置自定义的路径。
2.重启JMeter: 切记,新增加或修改jar包,需要重启JMeter才能生效。
3.新建Java请求: 参数列表填写参数,点击运行,查看结果
确保main函数能够调试通过,检查jar包地址配置是否正确,是否已经重启JMeter。
SampleResult需要设置SamplerData信息,代码如“sampleResult.setSamplerData(“请求信息”); ” 。