我的maven构建中有很长时间的运行测试。这些测试是使用failsafe plugin(mvn verify
)运行的集成测试。
我尝试使用JProfiler来分析这些测试。
测试运行正常,但我在JProfiler 中看不到任何有用的内容,好像JProfiler正在过滤它们一样。
我在 openSUSE 13.1 x64 , Maven 3.2.1 和 JProfiler 8.0.5
JProfiler会话设置是默认设置,有两处修改:
我使用此命令启动配置文件构建:
MAVEN_OPTS="-agentpath:/opt/jprofiler8/bin/linux-x64/libjprofilerti.so=port=8849" mvn verify
Maven和JProfiler在同一台机器上运行(本地分析)。
构建正常启动:
$ MAVEN_OPTS="-agentpath:/opt/jprofiler8/bin/linux-x64/libjprofilerti.so=port=8849" mvn verify
JProfiler> Protocol version 39
JProfiler> Using JVMTI
JProfiler> JVMTI version 1.1 detected.
JProfiler> 64-bit library
JProfiler> Listening on port: 8849.
JProfiler> Instrumenting native methods.
JProfiler> Can retransform classes.
JProfiler> Can retransform any class.
JProfiler> Native library initialized
JProfiler> VM initialized
JProfiler> Waiting for a connection from the JProfiler GUI ...
JProfiler> Using dynamic instrumentation
JProfiler> Time measurement: elapsed time
JProfiler> CPU profiling enabled
[INFO] Scanning for projects...
[INFO]
[INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building...
[...]
并且也正常结束:
[...]
Results :
Tests run: 2766, Failures: 0, Errors: 0, Skipped: 0
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19:31 min
[INFO] Finished at: 2014-06-18T11:38:49+01:00
[INFO] Final Memory: 21M/107M
[INFO] ------------------------------------------------------------------------
JProfiler> Keeping VM alive until frontend disconnects.
JProfiler Hot Spots CPU视图显示:
至于我,它是无用的东西,只有maven相关的方法(压缩,类加载)。
当我尝试通过(打开热点回溯)时,我找不到与我运行的测试相关的任何内容。
此外,与实际总时间(~10s
)相比,测量的经过时间(如果我添加前10个热点固有时间)在很大程度上是无关紧要的(~19 mins 30s
)。
修改
首先,我使用我的IDE(IntelliJ IDEA)和JProfiler插件运行测试分析,但由于一个奇怪的行为我停止了。 似乎测试在没有做任何事情的情况下永远运行。 我认为这是来自IDE(或插件),因为测试通过maven运行良好。
编辑2:
感谢@IngoKegel的建议,如果我选择“所有州”,我会有更多信息:
我看到了4个热点。但是,他们仍然没有给我可用的信息:
经过的时间好多了,但我仍然没有看到任何来自“我的”课程的内容。
为什么我的课程仍会被过滤?有没有办法看到它们?
此外,我还不完全理解为什么在选择“Runnable”状态时这些热点不显示。而且这是默认选项...
令人惊讶的是,如果我添加前4个经过的时间,它会给我~1h
但执行时间为~19min 20s
,好像某些热点重叠一样。我认为这是“所有州”选项的副作用。
答案 0 :(得分:1)
诀窍是Maven failsafe plugin在单独的JVM 中运行集成测试:
使用单元测试和集成测试的典型Maven构建可以轻松使用3种不同的JVM:
mvn
命令启动的Maven主JVM(编译,包)
对Maven主JVM进行概要分析永远不会显示有关Failsafe JVM内部工作的信息。 此外,MAVEN_OPTS中指定的选项仅传递给Maven主JVM。
要分析其他JVM之一,您必须使用pom.xml
文件中的插件配置单独配置它。
要回答这个问题,需要以下插件配置:
<plugins>
[...]
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.17</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
<!-- to exclude IT from main build, comment the 'verify' goal -->
</goals>
</execution>
</executions>
<configuration>
<argLine>${failsafeArgLine}</argLine>
</configuration>
</plugin>
[...]
</plugin>
这里重要的部分是<argLine>${failsafeArgLine}</argLine>
然后,可以通过failsafeArgLine
参数指定JProfiler代理选项:
mvn verify -DfailsafeArgLine="-agentpath:/opt/jprofiler8/bin/linux-x64/libjprofilerti.so=port=8849"
运行此命令将正常启动Maven构建(不进行分析),然后在集成测试阶段开始时,它会要求建立JProfiler连接:
[...]
[INFO]
[INFO] --- maven-failsafe-plugin:2.17:integration-test (default) @ project ---
[INFO] Failsafe report directory: /home/user/Repositories/project/target/failsafe-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
JProfiler> Protocol version 39
JProfiler> Using JVMTI
JProfiler> JVMTI version 1.1 detected.
JProfiler> 64-bit library
JProfiler> Listening on port: 8849.
JProfiler> Instrumenting native methods.
JProfiler> Can retransform classes.
JProfiler> Can retransform any class.
JProfiler> Native library initialized
JProfiler> VM initialized
JProfiler> Waiting for a connection from the JProfiler GUI ...
JProfiler> Using dynamic instrumentation
JProfiler> Time measurement: elapsed time
JProfiler> CPU profiling enabled
[...]
还可以直接在 pom.xml 文件中指定故障安全VM参数(而不是使用failsafeArgLine
属性),但我更喜欢这样使用它。