2017-07-17 70 views
1

我有一个演示Java代码的JMeter测试的类。JMeter Java代码 - 如何将ConstantThroughputTimer添加到我的测试中

测试的对象是每秒设置N个请求。

我想添加一个ConstantThroughputTimer到我的测试中,以设置JMeter正在创建的最大RPS(请求每秒)。

在gui中创建了一个,它运行良好,但我想从java代码运行它。

现在,我有2个问题:

  1. 我不知道如何设置线程组“循环计数”永远。 (见屏幕截图)
  2. 我无法将ConstantThroughputTimer添加到我的测试计划中。

我搜索了,我找不到任何有关它的文档,也没有代码示例。

任何帮助将非常感激。

我的代码:

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

对不起。忘了提到,测试运行,但没有计时器 - 这意味着要求的提出和RPS是比什么是设置定时器 – razrog

+0

更加大,我根本不知道你打你的系统下测试的。我看到您将回路控制器添加到线程组,但我无法发现将采样器添加到回路控制器的时刻。以及将线程组添加到测试计划的那一刻。您在此显示的代码与您尝试运行的代码不同吗? –

回答

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; 
} 

}

0
  1. 配置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();  
    
  2. 配置Constant Throughput Timer

    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()); 
    
  3. 详细告知通货膨胀见:

+0

但是,您如何正确地将计时器添加到测试中? – razrog

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 - 和比较。

+0

谢谢尤里的回应。 在GUI中,我将定时器添加到我的ThreadGroup或TestPlan本身,并且工作正常。 但我今天终于完成了这件事。 完整的代码是在另一个答案。 – razrog

相关问题