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

标签 java unit-testing ant junit continuous-integration

我想减少构建(使用 ant)运行测试所花费的时间。 目前我使用默认 forkMode , 在每个测试类上派生一个新的虚拟机 (perTest)。

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

问题:

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

  2. 是否有其他因素导致测试依赖/测试方法的耦合可能会改变行为(除了我不使用的 native 库加载)

  3. 垃圾收集/终结呢,它们是否在每次测试后运行? (我不依赖他们,但我只是想得到一个完整的画面)


更新

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

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

最佳答案

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

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

关于java - junit:forkMode ="once"对测试正确性的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6254965/

相关文章:

java - 查找 LinkedList 中数字的中位数

java - 由于方法名称,JUnit 测试失败

c# - xunit-如何在单元测试中获取HttpContext.User.Identity

ant - 如何从 Ant 构建创建的 .zip 解析 7-zip 的 'Warnings: Headers Error'?

java - 带有自定义 JAX-B 绑定(bind)的 JAX-WS MarshalException : Unable to marshal type "java.lang.String" as an element

java - "GET"方法第二个参数的用途是什么?

java - 检查跨目录的文件分布

javascript - 如何使用 BDD Javascript 测试数组元素类型?

ant - sshexec ant任务: environment variables

ant - 项目中不存在目标 "debug"