2017-07-17 2 views
1

私はJavaコードからJMeterテストを示すクラスを持っています。JavaコードからJMeter - 私のテストにConstantThroughputTimerを追加するには

テストの目的は、毎秒N要求を設定することです。

JMeterが作成している最大RPS(要求数/秒)を設定するために、ConstantThroughputTimerをテストに追加します。

guiとそのうまくいく作業の中で作成されましたが、私はJavaコードから実行したいと思います。私は永遠にスレッドグループ「ループ回数」を設定する方法がわからない

  1. は、今私は2つの問題を持っています。 (スクリーンショットを参照)

  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

関連する問題