问题:在某些场景下我们会发现Jmeter里面提供的各种Sample不能满足自己的需求,应为这个世界上的压力测试的逻辑本来就是千变万化的,所以这个时候我们如果自己实现一套测试逻辑(当Jmeter的基本elements和sample无法满足我们的需求时, 例如我们要测试一个udp服务, 而协议的内容是我们自定义的),这个时候需要使用jmeter 的扩展性。下面我们通过一个简单的例子来看看如何开发这样的一个自定义Sample? 自定Sample的生命周期是怎样的?
- package com.alibaba.stress.load;
- import org.apache.jmeter.config.Arguments;
- import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
- import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
- import org.apache.jmeter.samplers.SampleResult;
- public class LifecycleJMeterSampleextends AbstractJavaSamplerClient {
- @Override
- public Arguments getDefaultParameters() {
- System.out.println("Get Parameter name! [getDefaultParameters]");
- return super.getDefaultParameters();
- }
- @Override
- public void setupTest(JavaSamplerContext context) {
- System.out.println("[setupTest]");
- super.setupTest(context);
- }
- @Override
- public void teardownTest(JavaSamplerContext context) {
- System.out.println("[teardownTest]");
- super.teardownTest(context);
- }
- @Override
- public SampleResult runTest(JavaSamplerContext ctx) {
- SampleResult result = new SampleResult();
- result.sampleStart();
- System.out.println("[runTest]");
- result.setSuccessful(true);
- result.sampleEnd();
- return result;
- }
- }
- package com.alibaba.stress.load;
- import org.apache.jmeter.config.Arguments;
- import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
- import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
- import org.apache.jmeter.samplers.SampleResult;
- public class LifecycleJMeterSample extends AbstractJavaSamplerClient {
- @Override
- public Arguments getDefaultParameters() {
- System.out.println("Get Parameter name! [getDefaultParameters]");
- return super.getDefaultParameters();
- }
- @Override
- public void setupTest(JavaSamplerContext context) {
- System.out.println("[setupTest]");
- super.setupTest(context);
- }
- @Override
- public void teardownTest(JavaSamplerContext context) {
- System.out.println("[teardownTest]");
- super.teardownTest(context);
- }
- @Override
- public SampleResult runTest(JavaSamplerContext ctx) {
- SampleResult result = new SampleResult();
- result.sampleStart();
- System.out.println("[runTest]");
- result.setSuccessful(true);
- result.sampleEnd();
- return result;
- }
- }
其中AbstractJavaSamplerClient是从ApacheJmeter_Java.jar 中获得。编写的类文件打包xxx.jar, 把这个Jar放到Jmeter
的解压目录下的lib/ext下。重新启动jmeter.
一次先加入线程组,和聚合报告两个组件,在聚合报告组件之前加入一个新的Sample(Java Sample ), 如图:
运行测试。可以看到控制台的输出。调整几次线程组的线程数目的控制,我们会发现我们的这个自定义类中的teardowntest 和 setupuptest方法都是正对线程组中的某一个线程来执行的,线程组中线程的调用数目其实就是指runtest方法的运行次数。