1

使用以下配置的 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 似乎试图并行化测试的执行,但恕我直言,它们应该以序列化的方式执行。

4

2 回答 2

0

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

我知道在 poms 中使用快照版本并不理想,但是如果您在测试项目中使用 jmeter 而不是产品代码,那应该没什么大不了的。

我的 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>
于 2014-01-02T21:16:23.217 回答
0

您需要指定输出的位置,因此所有结果都将被丢弃

更改配置如下指定添加'java.rmi.server.hostname'。

<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>

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

我会推荐

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

  1. 在开始测试之前,请务必重新启动从属/远程 jmeter 进程。
于 2014-09-30T08:01:17.493 回答