2017-02-15 95 views
2

所以我用我的Maven項目這個例子:在Java代碼運行的JMeter - JMeterThread不運行採樣

public class JMeterFromScratch { 

public static void main(String[] argv) throws Exception { 

    //JMeter Engine 
    StandardJMeterEngine jmeter = new StandardJMeterEngine(); 

    //JMeter initialization (properties, log levels, locale, etc) 
    JMeterUtils.loadJMeterProperties("C:/git/jbehave-snbtracker/src/main/resources/config/jmeter.properties"); 
    //JMeterUtils.initLogging();// you can comment this line out to see extra log messages of i.e. DEBUG level 
    JMeterUtils.initLocale(); 

    // JMeter Test Plan 
    HashTree testPlanTree = new HashTree(); 

    // HTTP Sampler 
    HTTPSampler httpSampler = new HTTPSampler(); 
    httpSampler.setDomain("example.com"); 
    httpSampler.setPort(80); 
    httpSampler.setPath("/"); 
    httpSampler.setMethod("GET"); 

    // Loop Controller 
    TestElement loopController = new LoopController(); 
    ((LoopController)loopController).setLoops(1); 
    loopController.addTestElement(httpSampler); 
    ((LoopController)loopController).setFirst(true); 
    ((LoopController)loopController).initialize(); 

    // Thread Group 

    SetupThreadGroup threadGroup = new SetupThreadGroup(); 
    threadGroup.setNumThreads(1); 
    threadGroup.setRampUp(1); 
    threadGroup.setSamplerController(((LoopController)loopController)); 

    // Test Plan 
    TestPlan testPlan = new TestPlan("Create JMeter Script From Java Code"); 

    // Construct Test Plan from previously initialized elements 
    testPlanTree.add("testPlan", testPlan); 
    testPlanTree.add("loopController", loopController); 
    testPlanTree.add("threadGroup", threadGroup); 
    testPlanTree.add("httpSampler", httpSampler); 

    // Run Test Plan 
    jmeter.configure(testPlanTree); 
    jmeter.run(); 

} 

}

在其中,我有以下依賴性:

<dependency> 
     <groupId>org.apache.jmeter</groupId> 
     <artifactId>ApacheJMeter_core</artifactId> 
     <version>3.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.jmeter</groupId> 
     <artifactId>ApacheJMeter_http</artifactId> 
     <version>2.13</version> 
    </dependency> 

奇怪的是我看到的是在ThreadGroup班,在makeThread()的方法中,有這樣一行:

JMeterThread jmeterThread = new JMeterThread(this.cloneTree(threadGroupTree), this, notifier); 

cloneTree的調用似乎確實克隆了樹,但是沒有LoopController中的採樣器。所以,當JMeterThread到達這裏:

Sampler sampler = this.threadGroupLoopController.next(); // returns null 

      while(true) { 
       while(this.running && sampler != null) { 

sampler爲null,並且因此沒有執行。

那麼我做錯了什麼?

謝謝。

回答

1
  1. 我不喜歡版本不匹配你pom.xml,我相信你應該使用<version>3.1</version>這兩個組件
  2. 我不喜歡你建立你的測試計劃的方式,它應該是是這樣的:

    testPlanTree.add(testPlan); 
    HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup); 
    threadGroupHashTree.add(httpSampler); 
    
  3. 我想你應該添加登錄.jtl文件,以便能夠看到結果

的完整代碼,以防萬一:

import org.apache.jmeter.config.Arguments; 
import org.apache.jmeter.config.gui.ArgumentsPanel; 
import org.apache.jmeter.control.LoopController; 
import org.apache.jmeter.control.gui.LoopControlPanel; 
import org.apache.jmeter.control.gui.TestPlanGui; 
import org.apache.jmeter.engine.StandardJMeterEngine; 
import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui; 
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.SetupThreadGroup; 
import org.apache.jmeter.threads.gui.SetupThreadGroupGui; 
import org.apache.jmeter.util.JMeterUtils; 
import org.apache.jorphan.collections.HashTree; 

import java.io.FileOutputStream; 

public class JMeterFromScratch { 

    public static void main(String[] args) throws Exception { 
     //JMeter Engine 
     StandardJMeterEngine jmeter = new StandardJMeterEngine(); 

     //JMeter initialization (properties, log levels, locale, etc) 
     JMeterUtils.loadJMeterProperties("/path/to/jmeter/bin/jmeter.properties"); 
     JMeterUtils.setJMeterHome("/path/to/jmeter/");    
     JMeterUtils.initLocale(); 

     // JMeter Test Plan 
     HashTree testPlanTree = new HashTree(); 

     // HTTP Sampler 
     HTTPSamplerProxy httpSampler = new HTTPSamplerProxy(); 
     httpSampler.setName("HTTP Request"); 
     httpSampler.setDomain("example.com"); 
     httpSampler.setPort(80); 
     httpSampler.setPath("/"); 
     httpSampler.setMethod("GET"); 
     httpSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName()); 
     httpSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName()); 


     // Loop Controller 
     TestElement loopController = new LoopController(); 
     ((LoopController) loopController).setLoops(1); 
     loopController.addTestElement(httpSampler); 
     ((LoopController) loopController).setFirst(true); 
     loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName()); 
     loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName()); 
     ((LoopController) loopController).initialize(); 

     // Thread Group 

     SetupThreadGroup threadGroup = new SetupThreadGroup(); 
     threadGroup.setNumThreads(1); 
     threadGroup.setRampUp(1); 
     threadGroup.setName("setUp Thread Group"); 
     threadGroup.setSamplerController(((LoopController) loopController)); 
     threadGroup.setProperty(TestElement.TEST_CLASS, SetupThreadGroup.class.getName()); 
     threadGroup.setProperty(TestElement.GUI_CLASS, SetupThreadGroupGui.class.getName()); 

     // Test Plan 
     TestPlan testPlan = new TestPlan("Create JMeter Script From Java Code"); 
     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); 
     HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup); 
     threadGroupHashTree.add(httpSampler); 


     // save generated test plan to JMeter's .jmx file format 
     SaveService.saveTree(testPlanTree, new FileOutputStream("test.jmx")); 

     //add Summarizer output to get test progress in stdout like: 
     // summary =  2 in 1.3s = 1.5/s Avg: 631 Min: 290 Max: 973 Err:  0 (0.00%) 
     Summariser summer = null; 
     String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary"); 
     if (summariserName.length() > 0) { 
      summer = new Summariser(summariserName); 
     } 


     // Store execution results into a .jtl file 
     String logFile = "test.jtl"; 
     ResultCollector logger = new ResultCollector(summer); 
     logger.setFilename(logFile); 
     testPlanTree.add(testPlanTree.getArray()[0], logger); 

     // Run Test Plan 
     jmeter.configure(testPlanTree); 
     jmeter.run(); 

     System.out.println("Test completed. See test.jtl file for results"); 
     System.out.println("Open test.jmx file in JMeter GUI to validate the code"); 
     System.exit(0); 
    } 
} 

您可以使用在Five Ways To Launch a JMeter Test without Using the JMeter GUI文章獲得參考工作代碼中提到https://bitbucket.org/blazemeter/jmeter-from-code/回購。

+0

嗨德米特里T,感謝您的回覆。我會用你的建議,並回復你的結果。順便說一句,關於您提供的鏈接,請注意第4.3部分「純粹用Java創建新的JMeter測試」。這正是我從我的回答中拿出榜樣的地方,所以他們寫下了你不喜歡的東西。 – Nom1fan

+0

謝謝!你的代碼有效。我將使用它來讓我的代碼也起作用。仍然看起來很奇怪,這個鏈接的例子不正確,但並沒有運行。 – Nom1fan