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

MRa*_*ser 20 java ant junit continuous-integration unit-testing

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

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

问题:

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

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

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


UPDATE

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

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

Dun*_*gor 11

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

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


Ben*_*Ben 5

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