使用以下配置的 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 中有超过 1 个 JMeter 测试,则 Maven 构建失败。在这种情况下,第一个 JMeter 测试的日志文件没有错误,但所有其他测试日志(例如 ./target/jmeter/logs/test2.log)都会显示以下消息:
Error in NonGUIDriver java.lang.IllegalStateException: Engine is busy - please try later
因此,第一个测试是在远程代理上执行的(也没有在客户端站点上的相应“jtl”文件中收集任何结果),但其他测试已被远程主机拒绝。因此,maven-jmeter-plugin 似乎试图并行化测试的执行,但恕我直言,它们应该以序列化的方式执行。