2017-09-26 85 views
1

我試圖使用從Java功能和性能運行JMeter的腳本不工作

String jmeterHome = "D:/tmp/apache-jmeter-3.3"; 
StandardJMeterEngine jmeter = new StandardJMeterEngine(); 
JMeterUtils.loadJMeterProperties(jmeterHome + "/jmeter.properties"); 
JMeterUtils.setJMeterHome(jmeterHome); 
JMeterUtils.initLocale(); 

SaveService.loadProperties(); 

File script = new File(jmeterHome + "/http_localhost.jmx"); 
HashTree testPlanTree = SaveService.loadTree(script); 

Summariser summer = null; 
String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary"); 
if (summariserName.length() > 0) { 
    summer = new Summariser(summariserName); 
}  

String logFile = jmeterHome + "/file.jtl"; 
ResultCollector logger = new ResultCollector(summer); 
logger.setFilename(logFile); 
testPlanTree.add(testPlanTree.getArray()[0], logger); 

jmeter.configure(testPlanTree); 
jmeter.run(); 

在JMeter的GUI中的「線程組」配置我的設置「線程數」從Java代碼執行的JMeter腳本成爲「$ {__ P(xxx,20)}」。它在GUI中工作正常 - 我可以執行默認值爲「20」的腳本。但上面的代碼不會啓動任何線程。 Java代碼打印它試圖啓動零線程。

我看到Jmeter functions don't executing when calling from java code和我有以下依賴性在我的項目

 <dependency> 
      <groupId>org.apache.jmeter</groupId> 
      <artifactId>ApacheJMeter_java</artifactId> 
      <version>3.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.jmeter</groupId> 
      <artifactId>ApacheJMeter_http</artifactId> 
      <version>3.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.jmeter</groupId> 
      <artifactId>ApacheJMeter_functions</artifactId> 
      <version>3.3</version> 
     </dependency> 
+0

是你的應用程序jar包含的依賴關係嗎?或者你如何運行它? –

+0

我正在使用maven運行它,我發現JMeter想要在類路徑中有一個名爲「ApacheJMeter_functions.jar」的庫,它不能是「ApacheJMeter_functions-3.3.jar」,即使這些文件是二進制文件也是如此 – user1657972

回答

-1

用JMeter的問題是,它要在classpath中庫的「ApacheJMeter_functions.jar」它可以」確切名稱t是「ApacheJMeter_functions-3.3.jar」,即使這些文件是二進制相同的也是如此

+0

這是錯誤的。 JMeter並不要求這樣做。 –

0

您的代碼錯誤,您沒有引用正確的jmeter.properties路徑。

工作例如:

String jmeterHome = "/data/jmeter/jmeters/apache-jmeter-3.3/"; 
    StandardJMeterEngine jmeter = new StandardJMeterEngine(); 
    JMeterUtils.setJMeterHome(jmeterHome); 
    JMeterUtils.loadJMeterProperties(jmeterHome + "bin/jmeter.properties"); 
    JMeterUtils.initLocale(); 

    SaveService.loadProperties(); 

    File script = new File("/data/jmeter/workspace/JMeterFromJava/scenario/localhost.jmx"); 
    HashTree testPlanTree = SaveService.loadTree(script); 

    Summariser summer = null; 
    String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary"); 
    if (summariserName.length() > 0) { 
     summer = new Summariser(summariserName); 
    }  

    String logFile = "/data/jmeter/workspace/JMeterFromJava/results/file.jtl"; 
    ResultCollector logger = new ResultCollector(summer); 
    logger.setFilename(logFile); 
    testPlanTree.add(testPlanTree.getArray()[0], logger); 

    jmeter.configure(testPlanTree); 
    jmeter.run(); 

編輯2017年9月29日:

您提交的Bugzilla顯示該問題的示範項目。它有助於理解你的問題。

狀態: - 代碼工作,如果應用程序被運行的主要應用 - 代碼工作,如果AppTest從Eclipse的 跑了 - 但是,當通過MVN清潔跑出安裝

的失敗代碼失敗,正是由於這個代碼:

0

小解決方法:

final List<String> classPathUrls = new ArrayList<>(); 
for (final URL url : URLClassLoader.class.cast(this.getClass().getClassLoader()).getURLs()) { 
    classPathUrls.add(url.getPath()); 
} 
final String classPath = StringUtils.join(classPathUrls, ";"); 
JMeterUtils.setProperty("search_paths", classPath); 
+0

謝謝你。沒有解決我的問題,而是把我推向了正確的方向。因爲我在windows上,所以getPath返回一個奇怪的格式(與JMeter的ClassFinder查找的格式不匹配),所以我刪除了classpath構建代碼並更改了setProperty調用,如下所示:JMeterUtils.setProperty(「search_paths」,System .getProperty( 「java.class.path」)); 它現在工作,因爲我需要它。謝謝。 –