【问题标题】:JUnit displays 0.4 sec, Infinitest a Slow Test Warning for a 4 ms testJUnit 显示 0.4 秒,无限测试 4 毫秒测试的慢速测试警告
【发布时间】:2016-12-01 22:34:49
【问题描述】:

我有这个测试:

@Test
public void findsPackageClasses() throws ClassNotFoundException, IOException {
    final long startTime = System.currentTimeMillis();
    Class<?>[] classes = finder.getPackageClasses(ClassFinderStubsPackageMarker.class.getPackage());
    Arrays.sort(classes, (c1, c2) -> c1.getName().compareTo(c2.getName()));
    assertArrayEquals(STUB_CLASSES, classes);
    System.out.println(String.format("Test duration: %d ms", System.currentTimeMillis() - startTime));
}

当我在 Eclipse 中将其作为 JUnit 测试运行时,JUnit 报告在此测试期间定期显示 0.4-0.5 秒。 Infinitest 还为其发出慢速测试警告。但是,使用currentTimeMillis() 计算的持续时间总是 4-5 毫秒,并打印到控制台。怎么回事?

我想通过消除缓慢的部分来消除警告 - 转向集成测试 - 但速度报告似乎相互矛盾。此外,唯一慢的部分可能是finder.getPackageClasses(),但它的文件系统依赖是用 Mockito 模拟出来的(设置为返回类文字)。我什至放置了临时代码以在命中实时代码时抛出异常(我还通过临时删除模拟进行了测试,这样在没有模拟的情况下有效地在实时代码中抛出了异常),确认模拟在什么时候工作它被注入了。另一个缓慢的部分可能是我尚未彻底调查的 getPackage() (使用 currentTimeMillis() 计算 delta 返回 0 ms)。无论如何,速度报告永远是矛盾的,这很奇怪。你有没有遇到过类似的现象?

【问题讨论】:

    标签: java junit infinitest


    【解决方案1】:

    我刚刚遇到了同样的问题。实际的@Test 运行时间为 40 毫秒,但 Infinitest 和 Gradle 都报告了接近 900 毫秒的运行时间。在检查了我的测试后,我意识到 @BeforeEach 的成本是巨大的 ~90%,即使只是设置了一堆 mockito 模拟。

    据我所知,除了更改 Inifitest preferences 之外,没有其他方法可以消除此警告。对我来说,将设置/拆卸成本计入测试的运行时间是没有意义的。至少有一些注释可以让您在每个测试的基础上配置它会很棒。

    【讨论】:

    • 抱歉,我 3 年前没有早点回答。
    • 感谢您的贡献。 AFAIK,基于构建测试的四阶段测试方法,并考虑内联与隐式设置模式以及进行快速测试 F.I.R.S.T. 的全部目的,设置/拆卸成本,所以@BeforeEach 也肯定要考虑在内测试的运行时间。
    • 此外,mock 本身正是加快测试速度的方法之一。
    • 在我的例子中,@BeforeEach 正在使用 mockito 实例化一个新的 mock()。当我更改代码以使实例化发生在声明时,@BeforeEach 只需 reset() 模拟,测试运行速度快了近 90%。
    猜你喜欢
    • 2010-10-20
    • 2022-09-13
    • 2012-03-14
    • 2022-01-26
    • 2018-11-13
    • 1970-01-01
    • 2011-04-17
    • 2023-01-28
    • 2010-09-05
    相关资源
    最近更新 更多