使用远程主机配置时,JMeter Maven插件不提供测试结果

时间:2013-09-25 15:24:31

标签: maven jmeter jmeter-maven-plugin

使用具有以下配置的jmeter-maven-plugin启动JMeter测试时...

<project>
...
    <build>
        <plugins>
            <plugin>
                <groupId>com.lazerycode.jmeter</groupId>
                <artifactId>jmeter-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>jmeter-tests</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>jmeter</goal>
                        </goals>
                    </execution>
                </executions>                       
                <configuration>
                    <customPropertiesFile>${basedir}/src/test/jmeter/jmeter.properties</customPropertiesFile>
                    <testFilesDirectory>${basedir}/src/test/jmeter</testFilesDirectory>
                    <remoteConfig>
                        <startServersBeforeTests>true</startServersBeforeTests>
                        <serverList>server01,server02</serverList>
                        <stopServersAfterTests>true</stopServersAfterTests>
                    </remoteConfig>
                    <testResultsTimestamp>false</testResultsTimestamp>
                </configuration>
            </plugin>
        </plugins>
    </build>            
...
</project>

...然后在给定的远程服务器“server01”和“server02”上正确执行测试。 Maven任务不会等待远程主机的进程,但声明一切正常:

[INFO] -------------------------------------------------------
[INFO]  P E R F O R M A N C E    T E S T S
[INFO] -------------------------------------------------------
[INFO]  
[INFO]  
[INFO] Proxy server is not being used.
[debug] JMeter is called with the following command line arguments: -n -t /home/me/demo/src/test/jmeter/test.jmx -l /home/me/demo/target/jmeter/results/20130925-test.jtl -d /home/me/demo/target/jmeter -q /home/me/demo/src/test/jmeter/jmeter.properties -r -R server01,server02 -X
[info] Executing test: test.jmx
[info] Completed Test: test.jmx
[INFO]  
[INFO] Test Results:
[INFO]  
[INFO] Tests Run: 1, Failures: 0
[INFO]  
[INFO] 
[INFO] --- maven-failsafe-plugin:2.15:verify (verify) 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.598s
[INFO] Finished at: Wed Sep 25 16:43:00 CEST 2013
[INFO] Final Memory: 21M/349M
[INFO] ------------------------------------------------------------------------

但是没有收集任何测试结果。如果您检查相应的JMeter结果文件,那么您将意识到空文件:

cat /home/me/demo/target/jmeter/results/20130925-test.jtl

#empty

因此,在远程服务器完成测试执行之前,Maven进程已完成。我错误地认为jmeter-maven-plugin应该收集远程主机的测试结果而不是写一个0字节的文件(20130925-test.jtl)?

如果我在不使用远程JMeter代理的情况下开始相同的测试,那么一切正常。 jmeter-maven-plugin执行测试并将结果写入相应的“jtl”文件中。那么关于“remoteConfig”元素的上述配置会出现什么问题?

更新1: 我使用了jmeter-maven-plugin版本1.8.1和Maven 3.0.5

更新2: 上面的例子只执行了1次JMeter测试。如果$ {basedir} / src / test / jmeter目录中有多个JMeter测试,则Maven构建失败。在这种情况下,第一个JMeter测试的日志文件没有错误,但所有其他测试日志(例如./target/jmeter/logs/test2.log)都显示以下消息:

Error in NonGUIDriver java.lang.IllegalStateException: Engine is busy - please try later

因此,第一个测试是在远程代理上执行的(也没有在客户端站点上的相应“jtl”文件中收集任何结果)但是其他测试已被远程主机拒绝。所以似乎maven-jmeter-plugin试图并行化测试的执行,但恕我直言,它们应该以序列化的方式执行。

2 个答案:

答案 0 :(得分:0)

使用插件的快照版本并指定插件仓库,为我解决了这个问题。

我知道在poms中创建快照versioin并不理想,但是如果你在测试项目中使用jmeter而不是prod代码那么它不应该太大。

我的2美分

<pluginRepositories>
    <pluginRepository>
        <id>sonatype-snapshots</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </pluginRepository>
</pluginRepositories>

<build>
         <plugins>
             <plugin>
                 <groupId>com.lazerycode.jmeter</groupId>
                 <artifactId>jmeter-maven-plugin</artifactId>
                 <version>1.8.2-SNAPSHOT</version>
                 <executions>
                     <execution>
                         <id>jmeter-tests</id>
                         <phase>verify</phase>
                         <goals>
                             <goal>jmeter</goal>
                         </goals>
                     </execution>
                 </executions>
                     <configuration>
                         <remoteConfig>
                             <startServersBeforeTests>true</startServersBeforeTests>
                             <!--<stopServersAfterTests>true</stopServersAfterTests>-->
                             <serverList>192.168.1.27</serverList>
                         </remoteConfig>
                     </configuration>
             </plugin>
         </plugins>
 </build>

答案 1 :(得分:0)

你指出输出必须去的地方,所以结果都会被删除

按照以下规定更改配置,添加&#39; java.rmi.server.hostname&#39;。

<remoteConfig>                  
    <startServersBeforeTests>true</startServersBeforeTests>                 
        <serverList>server01,server02</serverList>
    <stopServersAfterTests>false</stopServersAfterTests>                                        
</remoteConfig>
<propertiesSystem>
<java.rmi.server.hostname>**Master.invoking.machine.com**</java.rmi.server.hostname>
</propertiesSystem>

如果构建因测试plan.jmx文件中的任何错误或错误而失败,则预计您不会以JTL或任何输出格式获得任何结果。 例如:假设您有2个测试计划,首先正确执行,第二个因测试计划中的某些错误而失败[就像您的计划缺少一些依赖性jar]。如果发生这种情况,由于您对两个计划使用相同的jtl文件,因此您的jtl文件将是不平衡的,并且它将为null。

我会推荐

1.创建2个样本测试计划并将它们放在$ {basedir} / src / test / jmeter中并执行它们,检查是否仍然看到构建失败。如果成功,请检查jtl文件中的结果。

  1. 在开始测试之前,始终重启slave / remote jmeter进程。