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

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

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

问题:

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

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

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

UPDATE

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

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

  1. 测试运行器将有效地制作所有测试的单个套件并运行它们 – 因此只涉及一个类加载器。
  2. 是的,这意味着静态数据将在测试之间共享,这有时会很方便,但会迫使你减少子句之间的静态耦合,这是一件好事。
  3. 通常没有任何明确的GC,但您可以自己做。

通常在一个VM中运行所有测试是一件好事。 它迫使你看静态耦合并且更快。 至关重要的是,它也是IDE运行它们的方式,而这正是测试应该运行的方式 – 尽可能接近编译时。

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

看看Stefan关于此的博客文章,我冒昧地猜测:

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