我有一个用Java代码演示JMeter测试的类。
测试的对象是每秒设置N个请求。
我想在我的测试中添加一个ConstantThroughputTimer,以便设置JMeter正在进行的最大RPS(每秒请求数)。
在gui中创建了一个并且运行良好,但是我想从java代码中运行它。
现在我有两个问题:
我已经搜索过,但我找不到任何关于它的文档,也没有代码示例。
非常感谢任何帮助。
我的代码:
public static void main(String[] args) {
StandardJMeterEngine jMeterEngine = new StandardJMeterEngine();
//Setting JMeter Properties
File properties = JmeterUtils.getPropertiesFile();
File home = JmeterUtils.getHomePath();
JMeterUtils.setJMeterHome(home.getPath());
JMeterUtils.loadJMeterProperties(properties.getPath());
JMeterUtils.initLocale();
//Creating HashTreeTestPlan
HashTree testPlanTree = new HashTree();
//Creating HttpSampler
HTTPSamplerProxy sampler = new HTTPSamplerProxy();
sampler.setMethod("GET");
sampler.setDomain("example.com");
sampler.setUseKeepAlive(true);
sampler.setFollowRedirects(true);
sampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
sampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());
sampler.setEnabled(true);
//Creating LoopController
LoopController loopController = new LoopController();
loopController.setContinueForever(true);
loopController.setLoops(10000);
loopController.setFirst(true);
loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());
loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());
loopController.initialize();
loopController.setEnabled(true);
//Creating the number of Threads (clients)
ThreadGroup threadGroup = new ThreadGroup();
threadGroup.setName("threadGroup");
threadGroup.setNumThreads(10);
threadGroup.setScheduler(true);
threadGroup.setRampUp(0);
threadGroup.setDuration(60);
threadGroup.setSamplerController(loopController);
threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());
threadGroup.setEnabled(true);
//Adding Constant Throughput Timer - This is what i want to add
ConstantThroughputTimer timer = new ConstantThroughputTimer();
timer.setProperty(TestElement.TEST_CLASS, ConstantThroughputTimer.class.getName());
timer.setName("constantTimer");
double rpsCalc = 10 * 60;
timer.setThroughput(rpsCalc);
timer.setEnabled(true);
timer.setCalcMode(2);
//NOT WORKING//
//NOT WORKING//
threadGroup.addTestElement(timer);
//Test Plan
TestPlan testPlan = new TestPlan("Test Plan");
testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement());
// Construct Test Plan from previously initialized elements
testPlanTree.add(testPlan);
jMeterEngine.configure(testPlanTree);
try {
jMeterEngine.runTest();
} catch (JMeterEngineException e) {
e.printStackTrace();
}
}
答案 0 :(得分:0)
要将Thread Group配置为永久运行:
LoopController loopController = new LoopController();
loopController.setLoops(-1);
loopController.setFirst(true);
loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());
loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());
loopController.initialize();
ConstantThroughputTimer ctt = new ConstantThroughputTimer();
ctt.setName("Constant Throughput Timer");
ctt.setProperty("throughput", 60 * 10);
ctt.setProperty("calcMode", 2);
ctt.setCalcMode(2);
ctt.setProperty(TestElement.TEST_CLASS, ConstantThroughputTimer.class.getName());
ctt.setProperty(TestElement.GUI_CLASS, TestBeanGUI.class.getName());
有关详细信息,请参阅:
答案 1 :(得分:0)
嗯,根据文件:
Timers are only processed in conjunction with a sampler. A timer which is not in the same scope as a sampler will not be processed at all.
由于您只有一个采样器,并且您实际上需要在其上应用此计时器,所以
To apply a timer to a single sampler, add the timer as a child element of the sampler. The timer will be applied before the sampler is executed. To apply a timer after a sampler, either add it to the next sampler, or add it as the child of a Test Action Sampler.
也许吧?我的意思是,将计时器直接添加到采样器。
PS虽然看起来已经对我合法,至少在通常的JMeter GUI视角中。不确定是什么问题。
PPS我想,在这里可以做些什么,如果你真的专注于它 - 你可以将你的计划保存为.jmx,然后在JMeter GUI中做同样的事情 - 并进行比较。
答案 2 :(得分:0)
完整的解决方案
我的运行方法
public void run(String domain, int rps, int durationInSeconds, String host){
StandardJMeterEngine jMeterEngine = new StandardJMeterEngine();
//Setting JMeter Properties
File properties = JmeterUtils.getPropertiesFile();
File home = JmeterUtils.getHomePath();
JMeterUtils.setJMeterHome(home.getPath());
JMeterUtils.loadJMeterProperties(properties.getPath());
JMeterUtils.initLocale();
//Creating HashTreeTestPlan
HashTree testPlanTree = new HashTree();
//Creating HttpSampler
HTTPSamplerProxy httpSamplerProxy = JmeterUtils.createHttpSamplerGet(domain);
//Creating Header Manager
HeaderManager headerManager = JmeterUtils.createHeaderManager(host);
//Creating LoopController
LoopController loopController = JmeterUtils.createLoopController(-1, true);
//Creating the number of Threads (clients)
ThreadGroup threadGroup = JmeterUtils.createThreadGroup(domain, rps, durationInSeconds, loopController);
//Adding Request Manager To requests HashTree
HashTree requestHashTree = new HashTree();
requestHashTree.add(httpSamplerProxy, headerManager);
//Creating Throughput Timer - Controls the RPS
ConstantThroughputTimer timer = JmeterUtils.createTimer(rps);
//Creating Test Plan
TestPlan testPlan = JmeterUtils.createTestPlan(domain);
// Construct Test Plan from previously initialized elements
testPlanTree.add(testPlan);
HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup);
threadGroupHashTree.add(requestHashTree);
threadGroupHashTree.add(timer);
//Configuring the Engine & Running the Test
jMeterEngine.configure(testPlanTree);
jMeterEngine.runTest();
}
我的JmeterUtils
public class JmeterUtils {
private static final File PROPERTIES_FILE = new File(System.getProperty("user.dir") + "/testdata/JMeter/bin/jmeter.properties");
private static final File HOME_PATH = new File(System.getProperty("user.dir") + "/testdata/JMeter");
static HeaderManager createHeaderManager(String host){
HeaderManager headerManager = new HeaderManager();
if(host != null){
headerManager.add(new Header("Host",host));
}
headerManager.add(new Header("Connection", "Close"));
headerManager.add(new Header("Cache-Control", "max-age=0"));
headerManager.add(new Header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5"));
headerManager.setProperty(TestElement.TEST_CLASS, HeaderManager.class.getName());
headerManager.setProperty(TestElement.GUI_CLASS, HeaderPanel.class.getName());
headerManager.setEnabled(true);
return headerManager;
}
static HTTPSamplerProxy createHttpSamplerGet(String domain){
HTTPSamplerProxy sampler = new HTTPSamplerProxy();
sampler.setMethod("GET");
sampler.setDomain(domain);
sampler.setUseKeepAlive(true);
sampler.setFollowRedirects(true);
sampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
sampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());
sampler.setEnabled(true);
return sampler;
}
static ThreadGroup createThreadGroup(String name, int numOfThreads, int durationInSeconds, LoopController loopController){
ThreadGroup threadGroup = new ThreadGroup();
threadGroup.setName(name);
threadGroup.setNumThreads(numOfThreads);
threadGroup.setScheduler(true);
threadGroup.setRampUp(0);
threadGroup.setDuration(durationInSeconds);
threadGroup.setSamplerController(loopController);
threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());
threadGroup.setEnabled(true);
return threadGroup;
}
static LoopController createLoopController(int numOfLoops,boolean continueForever){
LoopController loopController = new LoopController();
if(continueForever){
loopController.setLoops(-1);
}
else{
loopController.setLoops(numOfLoops);
}
loopController.setFirst(true);
loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());
loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());
loopController.initialize();
loopController.setEnabled(true);
return loopController;
}
static ConstantThroughputTimer createTimer(int rps){
ConstantThroughputTimer timer = new ConstantThroughputTimer();
long rpsCalc = rps * 60;
timer.setProperty("throughput", rpsCalc);
timer.setProperty("calcMode", 2);
timer.setCalcMode(2);
timer.setThroughput(rpsCalc);
timer.setEnabled(true);
timer.setProperty(TestElement.TEST_CLASS, ConstantThroughputTimer.class.getName());
timer.setProperty(TestElement.GUI_CLASS, TestBeanGUI.class.getName());
return timer;
}
static TestPlan createTestPlan(String domain){
TestPlan testPlan = new TestPlan("Traffic Generator\t[" + domain + "]");
testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement());
return testPlan;
}
static File getPropertiesFile(){
return PROPERTIES_FILE;
}
static File getHomePath(){
return HOME_PATH;
}
}