2017-02-15 29 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