我想运行单个单元测试并收集其"分析"信息:调用每个方法的频率,创建某个类的实例数,执行某些方法/线程需要多少时间等。然后,我想将此信息与一些预期值进行比较。有没有Java的探查器让我这样做(当然,所有这些都应该自动完成,没有任何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)
);
}
}
可以自动捕获分析信息的快照,您必须将 VM 参数添加到 Java start 命令以加载探查器,并且必须告诉探查器记录数据并在退出时保存快照。
在 JProfiler 中,您可以使用 "profile" ant 任务来执行此操作。它从从 JProfiler GUI 导出的配置文件中获取性能分析设置。您可以使用控制器 API 开始记录和保存快照。
那么你有两个选择:
可以使用 jpcompare 命令行实用程序或相应的"比较"ant 任务将快照与已知基线进行比较。有几种比较可用。您可以将结果导出为 HTML 或机器可读格式 (CSV/XML(。
您可以使用 jpexport 命令行实用程序或相应的"export"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,与其他工具相比,这是一个很大的好处。