自动比较单个单元测试的Java分析结果

我想运行一个单元测试并收集其“分析”信息:每个方法被调用的频率,某个类创建了多少个实例,执行特定方法/线程需要多长时间等等。然后,我想要将此信息与一些预期值进行比较。 有没有Java的Profiler比让我这样做(所有这些都应该自动完成,当然,没有任何GUI或用户交互)?

这是我希望它工作的方式:

public class MyTest {
  @Test
  public void justTwoCallsToFoo() {
    Profiler.start(Foo.class);
    Foo foo = new Foo();
    foo.someMethodToProfile(); // profiler should collect data here
    assertThat(
      Profiler.getTotalCallsMadeTo(Foo.class, "barMethod"), 
      equalTo(3)
    );
  }
}

有几个Java分析器可以自动捕获分析信息的快照,您必须将VM参数添加到Java start命令以加载分析器,并且必须告诉分析器记录数据并在退出时保存快照。

在JProfiler中,您可以使用“profile”ant任务来执行此操作。 它从JProfiler GUI中导出的配置文件获取配置文件设置。 您可以使用Controller API开始录制并保存快照。

那么你有两个选择:

  • 您可以使用jpcompare命令行实用程序或相应的“比较”ant任务将快照与已知基线进行比较。 有几个比较可用。 您可以将结果导出为HTML或机器可读的格式(CSV / XML)。

  • 您可以使用jpexport命令行实用程序或相应的“导出”ant任务从快照中提取数据。 然后,您可以编写自己的代码来分析特定运行的分析数据。

  • 对于一组有限的性能分析数据,实际上可以使用JProfiler API编写自己的分析器,它可以执行类似于Profiler.getTotalCallsMadeTo(Foo.class, "barMethod")的示例。 请参阅JPofiler安装中的api/samples/platform示例。 您将从热点数据中获取信息。

    但是,为了对是否调用某个特定方法作出断言,我建议采用基于AOP的方法。 使用基于分析器的方法适用于检测性能回归。

    免责声明:我公司开发JProfiler。


    我发现这可以通过J2SE内置的HPROF分析工具完成。

    java -agentlib:hprof=cpu=times MyTest
    

    它生成一个如下格式的文本文件:

    CPU SAMPLES BEGIN (total = 126) Fri Oct 22 12:12:14 2004
    rank   self  accum   count trace method
       1 53.17% 53.17%      67 300027 java.util.zip.ZipFile.getEntry
       2 17.46% 70.63%      22 300135 java.util.zip.ZipFile.getNextEntry
       3  5.56% 76.19%       7 300111 java.lang.ClassLoader.defineClass2
       4  3.97% 80.16%       5 300140 java.io.UnixFileSystem.list
       5  2.38% 82.54%       3 300149 java.lang.Shutdown.halt0
    ....
    

    然后,很容易解析文件并提取您感兴趣的方法。该解决方案完全免费,并且内置了JSE,与其他工具相比,这是一个很大的好处。

    链接地址: http://www.djcxy.com/p/59589.html

    上一篇: Automatically comparing Java profiling results for a single unit test

    下一篇: OAuthTwitterEngine integration?