2017-07-17 104 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

相關問題