junit:forkMode =“once”对测试正确性的影响

时间:2011-06-06 16:18:19

标签: java unit-testing ant junit continuous-integration

我想减少构建(使用ant)运行测试所需的时间。 目前我使用默认的forkMode,其中在每个测试类上分配一个新的vm perTest)。

我正在考虑切换到forkMode="once",但我不确定这是否会以某种方式结合测试并且可能在运行我的测试后给我假阳性和/或假阴性结果。

问题:

  1. 每个测试用例都会获得一个新的ClassLoader ,以便之前运行的所有静态引用都不再可访问/可见了吗?

  2. 是否存在其他内容导致测试依赖/耦合测试方法可能会改变行为(除了我没有使用的本机库加载)

  3. 垃圾收集/定稿怎么样,每次测试后都会运行? (我不依赖它们,但我只是想得到一个完整的图片)

  4. 更新

    根据当前的答案,当使用forkMode时,似乎junit总是在每个vm / fork的所有测试用例之间共享一个类加载器。 (所以forkMode =“once”的确意味着所有测试都有一个类加载器)

    这有许多优点(测试速度更快,并且可能导致测试因静态耦合而失败)但也存在一些缺点(静态耦合仅在使用共享类加载器时才有效 - >误报)

3 个答案:

答案 0 :(得分:11)

  1. 测试运行器将有效地制作所有测试的单个套件并运行它们 - 这样只涉及一个类加载器。
  2. 是的,这意味着静态数据将在测试之间共享,这有时会很方便,但会迫使你减少子句之间的静态耦合,这是一件好事。
  3. 通常没有任何明确的GC,但您可以自己动手。
  4. 通常在一个VM中运行所有测试是一件好事。它迫使你看静态耦合并且更快。至关重要的是,它也是IDE运行它们的方式,而这正是测试应该运行的方式 - 尽可能接近编译时的频率。

答案 1 :(得分:4)

请注意,默认模式为每个测试用例(即类)分配新VM,而不是为每个测试(即方法)。在我正在测试的应用程序中,当我将VM重用于多个测试时会出现问题:对象和状态从早期测试中遗留下来并阻止以后的测试工作。如果您的应用程序结构良好且测试严格独立,则这可能不是问题。我怀疑垃圾收集在每次测试后自动运行:在任何情况下,确保在任何给定时间调用它都是非常困难的。

答案 2 :(得分:0)

关于这一点Stefan's blog entry,我冒昧地猜测:

  1. 您只能获得forkMode =“once”
  2. 的单个类加载器
  3. 您将无法再访问Ant环境
  4. GC将在生成的GC内部执行(如果forceMode =“once”),这意味着它不会在每次测试运行后执行。