JUnit执行订单

时间:2017-01-17 15:24:43

标签: java junit deterministic

所以我找到了一个用@FixMethodOrder对类中的junit测试进行排序的方法,但是阅读我遇到的文档时我不明白:

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

在我学习期间,我从未遇到任何确定性和不可预测的算法或系统。只有我能想象的系统才能适应这种复杂系统,比如天气或自然界,因为对于那些我们暂时没有任何具体算法的系统,但是Junit?  有人可以解释一下Junit doc所指的内容吗?

谢谢, 标记

1 个答案:

答案 0 :(得分:3)

所有的说法都是该算法定义明确,但它依赖于太多复杂的,不可控制的因素,作为开发人员,可以有效地预测或依赖订单。

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

在类文件中布局方法的顺序在JLS中没有严格定义,因此不同编译器编译的同一个类可能会以稍微不同的方法顺序结束,相同的JVM可能会返回不同的方法顺序,即使这个班是一样的。

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

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