我不知道有任何单独的工具来处理这个问题,但是 JUnit在@Test -annotation中有一个名为timeout的可选参数:
第二个可选参数 timeout 如果测试花费的时间超过指定的时钟时间(以毫秒为单位),则会导致测试失败。以下测试失败:
@Test(timeout=100) public void infinity() {
while(true);
}
因此,您可以编写额外的单元测试来检查某些部分是否“足够快”地工作。当然,您首先需要以某种方式确定特定任务运行所需的最长时间。
-
如果第二个问题是相关的,那么这是我看到的问题:
- 可变性取决于它运行的环境。
总会有一些变化,但为了尽量减少它,我会使用 Hudson 或类似的自动化构建和测试服务器来运行测试,所以每次的环境都是一样的(当然,如果运行 Hudson 的服务器也可以其他类型的任务,这些其他任务仍然会影响结果)。在决定测试的最大运行时间时,您需要考虑到这一点(留一些“头部空间”,所以如果测试需要比平时多运行 5%,它仍然不会立即失败) .
- 由于 Java 中的微基准测试有很大的差异,如何检测变化。
Java 中的微基准测试很少可靠,我会说使用集成测试(例如处理单个 http 请求或您拥有的任何东西)测试更大的块并测量总时间。如果测试因耗时过多而失败,可以通过 profiling 隔离有问题的代码,或者在测试运行期间测量并注销测试各个部分的运行时间,以查看哪个部分花费的时间最多。
- 如果 Caliper 收集结果,如何将结果从 caliper 中取出,以便以自定义格式保存。缺少 Calibre 的文档。
不幸的是,我对 Caliper 一无所知。