JUnit执行顺序

JUnit excecution order

所以我找到了一种在 class 中使用 @FixMethodOrder 对 junit 测试进行排序的方法,但是阅读文档时我遇到了一些我不理解的东西:

class 中 JUnit 测试的默认执行顺序是确定性但不可预测的。 Java 7(和一些以前的版本)的执行顺序不保证,甚至可以从 运行 运行 更改,因此执行顺序更改为确定性的(在 JUnit 中4.11)

在我的学习期间,我从未遇到过任何既确定又不可预测的算法或系统。我能想象的唯一适合这个的系统是复杂的系统,比如天气或一般的自然,因为对于那些我们现在没有任何具体的算法,但是 Junit? 有人可以解释一下 Junit 文档指的是什么吗?

谢谢, 马克

它的全部说法是该算法 well-defined 但它依赖于太多复杂的 non-controllable 因素,您作为开发人员无法有效地预测或依赖顺序。

根据 java.lang.Class 的文档,JVM 可以自由地 return 以任何顺序从 getMethods() 方法中调用方法。因此,首先要注意的是,底层算法可能会在 JVM 版本/实现之间发生变化。

方法在 class 文件中的布局顺序在 JLS 中没有严格定义,因此由不同编译器编译的相同 class 可能会以略有不同的方法顺序结束相同的 JVM 可能 return 不同的方法命令,即使 class 在其他方面是相同的。

并且在 JVM 中,class 信息的存储方式可能无法保证 return 顺序一致,甚至可能取决于 JVM 在其生命周期中所处的位置。例如,假设每个方法都存储为一个 java.lang.Method 对象,并且 java.lang.Class 将它们全部存储在一个 Set 中,getMethods() 的顺序取决于Set 中的对象 - 由于散列而基本上是随机的(或 pseudo-random)。

尽管 JVM 的工作方式与它使用的 implementation-dependent 数据结构不同,这使得很难预测 return 方法的顺序,例如 java.lang.Class.getMethods() 并且无法保证JVM 实现 and/or 版本之间的一致性。因此,如果您查看 java.lang.Class 的 OpenJDK 实现,您会发现 getMethods() 方法是根据许多本机方法实现的。一旦您使用本机代码,您将依赖于非常 implementation-specific 因素,例如内存地址,并且正如文档所暗示的那样,JVM 不会确保它们的影响对您完全隐藏。