Java JUnit执行令

Java JUnit执行令,java,junit,deterministic,Java,Junit,Deterministic,因此,我找到了一种方法,用@FixMethodOrder对类中的junit测试进行排序,但在阅读文档时,我遇到了一些我不理解的东西: 类中JUnit测试的默认执行顺序是确定性的,但不是可预测的。Java 7(和以前的一些版本)不保证执行顺序,甚至可以在不同的运行中更改,因此执行顺序更改为确定性(在JUnit 4.11中) 在我的学习期间,我从未遇到过任何既确定又不可预测的算法或系统。我能想象的唯一适合这种情况的系统是复杂的系统,比如天气或自然,因为对于这些系统,我们现在没有任何具体的算法,但是J

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

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

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

谢谢,
Mark

所有的说法都是算法定义良好,但它依赖于太多复杂、不可控的因素,作为开发人员,您无法有效地预测或依赖顺序

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

类文件中方法的排列顺序在JLS中没有严格定义,因此,不同编译器编译的同一类可能最终会得到稍有不同的方法顺序,而同一JVM可能会返回不同的方法顺序,即使该类在其他方面是相同的

在JVM中,类信息的存储方式可能不保证返回一致的顺序,甚至可能取决于JVM在其生命周期中的位置。例如,假设每个方法都存储为
java.lang.method
对象,而
java.lang.Class
将它们全部存储在
集中
,其中
getMethods()
的顺序取决于
集中对象的顺序-由于散列,基本上是随机的(或伪随机的)

尽管JVM的工作方式与此不同,但它确实使用了依赖于实现的数据结构,这使得很难预测像
java.lang.Class.getMethods()
这样的方法的返回顺序,也无法保证JVM实现和/或发布之间的一致性。因此,如果您查看
java.lang.Class
的OpenJDK实现,您将看到
getMethods()
方法是根据许多本机方法实现的。一旦进入本机代码,您将依赖于非常特定于实现的因素,例如内存地址,并且,正如文档所暗示的,JVM不会确保它们的效果对您完全隐藏。

我写了这条评论:-)您可以添加,从4.11开始,默认的执行顺序基于方法名的哈希代码。此外,如果方法是在不同的类文件中定义的(例如通过继承),那么情况就更加复杂。