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

yeg*_*256 7 java profiling

我想运行单个单元测试并收集其"分析"信息:每个方法调用的频率,创建了多少个特定类的实例,执行某个方法/线程需要多长时间等等.然后,我想要将此信息与某些预期值进行比较.是否有任何适用于Java的Profilers而不是让我这样做(所有这些都应该自动完成,当然没有任何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)
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

yeg*_*256 2

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

java -agentlib:hprof=cpu=times MyTest
Run Code Online (Sandbox Code Playgroud)

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

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
....
Run Code Online (Sandbox Code Playgroud)

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