当前位置: 首页 > 知识库问答 >
问题:

为什么JProfiler没有在maven测试评测中显示我的类/方法?

施敏达
2023-03-14

在我的maven构建中,我有很长时间的运行测试。这些测试是使用故障保护插件运行的集成测试(mvn-verify)。

我尝试使用JProfiler分析这些测试。

测试运行正常,但我在JProfiler中没有看到任何有用的东西,就好像JProfiler正在过滤掉它们一样。

我在openSUSE 13.1 x64上,使用Maven 3.2.1和JProfiler 8.0.5

JProfiler会话设置是默认设置,有两个修改:

  • 启动时自动启动CPU评测
  • 在执行完成时保持VM活动(以启用回溯信息)

我使用以下命令启动概要构建:

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热点CPU视图向我展示了这一点:

对我来说,它是无用的东西,只有maven相关的方法(压缩、类加载)。

当我尝试通过(打开热点回溯)时,我没有找到任何与我运行的测试相关的内容。

此外,与实际总时间(19分钟30秒)相比,测量的经过时间(如果我加上前10个热点固有时间)在很大程度上是微不足道的(~10s)。

编辑:

起初,我用我的IDE(IntelliJ IDEA)和JProfiler插件运行测试评测,但由于一个奇怪的行为,我停止了测试。似乎测试一直在运行,什么都不做。我认为这是来自IDE(或插件),因为测试在maven中运行良好。

编辑2:

感谢@IngoKegel的建议,如果我选择“所有州”,我将获得更多信息:

我又看到了4个热点。然而,他们仍然没有给我可用的信息:

  1. 是对j.u.c.ThreadPoolExecutor$Worker的“过滤/直接调用”。跑步
  2. 是从Maven(plexus)到j.l.r.Method的单个调用。调用(无关紧要的调用)
  3. 和4。是对o.a.maven的“过滤/直接呼叫”。p、 当然可以。booterclient。o、 ThreadStreamConsumer$Pumper。运行

过去的时间好多了,但是我仍然没有看到任何来自“我的”班级的东西。

为什么我的类仍然被过滤?有办法看到它们吗?

此外,我不完全理解为什么在选择“可运行”状态时这些热点不显示。此外,这是默认选项。。。

令人惊讶的是,如果我加上这四个最长的运行时间,它会给我1h,但执行时间是19min-20s,就像一些热点重叠一样。我认为这是“所有州”选项的副作用。


共有1个答案

漆雕正奇
2023-03-14

诀窍在于Maven failsafe插件在单独的JVM中运行集成测试:

带有单元测试和集成测试的典型Maven构建可以轻松使用3种不同的JVM:

  • Maven主JVM(编译,打包),由mvn命令启动
    • Surefire JVM(单元测试),由Maven主JVM启动
    • 故障保护JVM(集成测试),由Maven主JVM启动

    分析Maven主JVM永远不会显示在故障保护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参数指定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
    [...]
    

    故障保护VM参数也可以直接在pom中指定。xml文件(而不是使用failsafeArgLine属性),但我更喜欢这样使用它。

 类似资料:
  • 我是JProfiler的新手。我创建了一个非常简单的测试应用程序。这是一个带有main方法的Main.java: 注意,我暂停直到按键。通过这种方式,我确信主作用域在我按下一个键之前不会结束,所以我希望e存在并且不会被垃圾收集(如果这个假设不正确,请纠正我)。示例类: 我使用JProfiler Eclipse插件启动上述应用程序。我创建了一个基于完整仪器配置文件的会话;我已经删除了Java EE和

  • 我使用surefire和failsafe分别执行单元测试和集成测试。所有测试都位于文件夹中。到目前为止,我有一个集成测试类,其测试方法(用@test注释)在所有单元测试运行时从不执行。这是我的pom的摘录。xml: 我使用maven目标来运行测试。

  • 我正在尝试将一个梅文Spring靴(2.3.12)应用程序从JUnit4转换为JUnit5。我已经阅读了很多关于如何做到这一点的不同帖子。 我能够在Eclipse中执行我的JUnit5测试。 我的问题是我无法让Maven Surefire执行我的JUnit5测试。我尝试了各种配置变体。当它到达Surefire步骤时,它只执行我以前的JUnit4测试,并且简单地忽略任何JUnit5测试。我已经验证了

  • 这应该是一个相对简单的问题,但它让我发疯。我正在尝试在JavaFX中创建扫雷器(主要用于练习),但我甚至无法显示一个简单的矩形。我以前运行过一次游戏,但我试图使游戏更加抽象,因此更容易编码,但我遇到了不显示任何问题。 我消除了所有无关的代码,使其尽可能简单。我基本上是在尝试创建一个名为Box的具有特定颜色和大小的矩形,将框添加到窗格中,并显示窗格。为了使Box成为可以在窗格上显示的节点,我使Box

  • 我正在尝试使用CSS边框在GUI(fxml)上显示墙。getStyleClass()。add()但它们没有出现。 我正在使用一个开关,将相应的样式类添加到单元格中。 Java代码: CSS代码: GUI事后图片:结果

  • 问题内容: 场景:我刚刚连接到流,并创建了一个新的存储库 工作区。我加载了它的2个组件,并修改了一些代码。如果打开 “待更改”视图,则在那里看不到任何待更改(并且我的“显示 完整视图”已选中,因此我应该同时看到传入,传出和 挂起的更改集)。 我的文件已保存,显然可以看到文件中的更改,但是 在“未决更改”视图中没有未决更改。 问题答案: 为了使更改显示在“挂起的更改视图”中,您需要: 刷新您的软件包