自动比较单个单元测试的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