一、实现 JavaSamplerClient 接口对 JavaMethod 进行测试
package com.lilith.sampler;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class BravoJavaMethodSampler implements JavaSamplerClient {
// JMeter GUI界面显示的变量
private static final String URLNAME = "URL";
// JMeter GUI界面变量的默认值,测试时可以根据需要自定义参数值
private static final String DEFAULTURL = "http://www.baidu.com";
/**
* 决定在JMeter中要显示的属性/变量,也就是runTest中调用的方法的参数
* 在组件加载时就会运行
* @return
*/
@Override
public Arguments getDefaultParameters() {
System.out.println("getDefaultParameters");
Arguments arguments = new Arguments();
arguments.addArgument(URLNAME,DEFAULTURL);
// 也可以直接设置参数
arguments.addArgument("username","");
arguments.addArgument("password","");
// 返回参数
return arguments;
}
/**
* 初始化方法
* @param context
*/
@Override
public void setupTest(JavaSamplerContext context) {
System.out.println("setUpTest");
// 获取GUI界面输入的Value
String username = context.getParameter("username");
System.out.println(username);
}
/**
* 这个方法就是实现具体的功能逻辑,也就是在runTest中调用被测的Java方法
* @param context
* @return
*/
@Override
public SampleResult runTest(JavaSamplerContext context) {
SampleResult sampleResult = new SampleResult();
// 1.调用被测方法
// 1.1开始调用背侧方法
sampleResult.sampleStart();
// 1.2调用被测方法
// 1.3调用结束
sampleResult.sampleEnd();
// 2.获取被测方法的返回内容
// 3.设置Java Sample的返回
// 设置响应结果,将调用方法返回的结果作为ResponseData
sampleResult.setResponseData("BravoJavaMethodSampler的响应内容","utf-8");
// 标记响应为success
sampleResult.setSuccessful(true);
// 设置sampler的名字
sampleResult.setSampleLabel("BravoSampler");
return sampleResult;
}
/**
* 最后执行,清理
* @param context
*/
@Override
public void teardownTest(JavaSamplerContext context) {
}
}
复制代码
在 JMeter GUI 界面中添加 Java Request
二、使用 JMeter API 执行本地的 JMX 文件
import org.apache.jmeter.JMeter;
import org.apache.jmeter.engine.JMeterEngineException;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.reporters.ResultCollector;
import org.apache.jmeter.reporters.Summariser;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.services.FileServer;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
public class Demo2 {
public static void main(String[] args) throws IllegalAccessException, IOException, JMeterEngineException, NoSuchFieldException {
StandardJMeterEngine standardJMeterEngine=new StandardJMeterEngine();
System.setProperty(JMeter.JMETER_NON_GUI, "true");
JMeterUtils.loadJMeterProperties("/apache-jmeter-5.1.1/bin/jmeter.properties");//本机jmeter路径
JMeterUtils.loadJMeterProperties("/apache-jmeter-5.1.1/bin/system.properties");//本机jmeter路径
JMeterUtils.loadJMeterProperties("apache-jmeter-5.1.1/bin/user.properties");//本机jmeter路径
JMeterUtils.setJMeterHome("/apache-jmeter-5.1.1");
JMeterUtils.initLocale();
JMeterUtils.initLogging();
SaveService.loadProperties();
File file=new File("/June/GitHub API.jmx");
FileServer.getFileServer().setBase(file);
FileServer.getFileServer().setScriptName(file.getName());
Field baseField = FileServer.getFileServer().getClass().getDeclaredField("base");
baseField.setAccessible(true);//设置允许访问
baseField.set(FileServer.getFileServer(), file.getAbsoluteFile().getParentFile());
HashTree scripts=SaveService.loadTree(file);
Summariser summariser = new Summariser(JMeterUtils.getPropDefault("summariser.name", "summary"));
ResultCollector logger = new ResultCollector(summariser);
logger.setFilename("/June/GitHub API.jtl");
scripts.add(scripts.getArray()[0],logger);
JMeter.convertSubTree(scripts);
standardJMeterEngine.configure(scripts);
standardJMeterEngine.runTest();
}
}
复制代码
三、使用 JMeter API 创建 HashTree 并执行
package com.lilith.sampler;
import org.apache.jmeter.assertions.ResponseAssertion;
import org.apache.jmeter.assertions.gui.AssertionGui;
import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.control.gui.TestPlanGui;
import org.apache.jmeter.engine.JMeterEngineException;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.protocol.http.control.Header;
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui;
import org.apache.jmeter.protocol.http.gui.HeaderPanel;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy;
import org.apache.jmeter.reporters.ResultCollector;
import org.apache.jmeter.reporters.Summariser;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.threads.ThreadGroup;
import org.apache.jmeter.threads.gui.ThreadGroupGui;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.visualizers.StatVisualizer;
import org.apache.jorphan.collections.HashTree;
import java.io.FileOutputStream;
import java.io.IOException;
//import java.lang.ThreadGroup;
public class JmeterTest2 {
public static void main(String args[]) throws IOException, JMeterEngineException {
StandardJMeterEngine standardJMeterEngine = new StandardJMeterEngine();
// StandardJMeterEngine standardJMeterEngine=new StandardJMeterEngine("127.0.0.1"); //使用远程的jmeter server来进行性能测试,也就是分布式方式,IP地址可以带端口或不带端口
JMeterUtils.loadJMeterProperties("/apache-jmeter-5.1.1/bin/jmeter.properties");//本机jmeter路径
JMeterUtils.loadJMeterProperties("/apache-jmeter-5.1.1/bin/system.properties");//本机jmeter路径
JMeterUtils.loadJMeterProperties("/apache-jmeter-5.1.1/bin/user.properties");//本机jmeter路径
JMeterUtils.setJMeterHome("/apache-jmeter-5.1.1");
JMeterUtils.initLocale();//时区
JMeterUtils.initLogging();//日志
SaveService.loadProperties();
// 第一步,新建一个测试计划
TestPlan testPlan = new TestPlan();
testPlan.setName("测试计划");
testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
/***********************如下几行testPlan的可以省略*************************************/
testPlan.setComment("");
testPlan.setFunctionalMode(false);
testPlan.setTearDownOnShutdown(true);
testPlan.setSerialized(false);
testPlan.setTestPlanClasspathArray(new String[]{});
testPlan.addParameter(null, null);//测试计划中的用户定义参数
// 新建一个 controller 控制器
LoopController loopController = new LoopController();
loopController.setContinueForever(true);
loopController.setLoops(-1);
loopController.initialize();
// 创建线程组
ThreadGroup threadGroup = new ThreadGroup();
threadGroup.setName("ThreadGroup");
threadGroup.setNumThreads(100);
threadGroup.setRampUp(10);
threadGroup.setScheduler(true);
threadGroup.setDuration(120);
threadGroup.setSamplerController(loopController);
threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());
HTTPSamplerProxy httpSamplerProxy = new HTTPSamplerProxy();
httpSamplerProxy.setName("baidu");
httpSamplerProxy.setDomain("www.baidu.com");
httpSamplerProxy.setPath("/");
httpSamplerProxy.setProtocol("https");
httpSamplerProxy.setMethod("GET");
httpSamplerProxy.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
httpSamplerProxy.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());
HeaderManager headerManager = new HeaderManager();
headerManager.setName("消息头管理器");
headerManager.add(new Header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36"));
headerManager.setProperty(TestElement.TEST_CLASS, HeaderManager.class.getName());
headerManager.setProperty(TestElement.GUI_CLASS, HeaderPanel.class.getName());
ResponseAssertion responseAssertion = new ResponseAssertion();
responseAssertion.setName("响应断言");
responseAssertion.addTestString("百度一下");
responseAssertion.setTestFieldResponseData();
responseAssertion.setToContainsType();
responseAssertion.setProperty(TestElement.TEST_CLASS, ResponseAssertion.class.getName());
responseAssertion.setProperty(TestElement.GUI_CLASS, AssertionGui.class.getName());
Summariser summer = new Summariser(JMeterUtils.getPropDefault("summariser.name", "summary"));
ResultCollector logger = new ResultCollector(summer);
logger.setFilename("/tools/create_by_hashtree_api.jtl");
logger.setName("聚合报告");
HashTree jmeterTest = new HashTree();
HashTree testPlanTree = jmeterTest.add(testPlan);
logger.setProperty(TestElement.TEST_CLASS, ResultCollector.class.getName());
logger.setProperty(TestElement.GUI_CLASS, StatVisualizer.class.getName());
HashTree httpSamplerTree = jmeterTest.add(threadGroup, httpSamplerProxy);
httpSamplerTree.add(responseAssertion);
httpSamplerTree.add(headerManager);
jmeterTest.add(jmeterTest.getArray()[0], logger);
SaveService.saveTree(jmeterTest, new FileOutputStream("/tools/create_by_hashtree_api.jmx"));
standardJMeterEngine.configure(jmeterTest);
standardJMeterEngine.runTest();
}
}
复制代码
执行 main 方法
四、JDBC Sampler
设置数据库连接信息
执行 SQL 语句
执行结果