JUnit4是否开始支持测试订购? 这是有意的吗?

JUnit的新手(事实上是JUnit 4)并且遇到了执行测试的套件方式

@RunWith(Suite.class) @Suite.SuiteClasses( { CreateNewProfile.class, EditProfile.class, }) public class ProfileTestSuite { } 

这是我在浏览新雇主的测试代码库时遇到的代码示例。 在执行期间,我资助 – 首先执行CreateNewProfile测试,然后执行EditProfile,这确实有意义,但之后它会在测试中引入依赖性。

我几个月来一直在遵循非依赖性测试机制(虽然我曾经使用过TestNG而不是JUnit),并期望EditProfile也可以单独执行。 那就是编辑配置文件应该负责创建配置文件然后编辑它然后断言操作。

我的问题是 – Junit 4引入了测试订购function。 是这个function还是一个复活节彩蛋,因为我一直觉得JUnit =独立测试。

没有JUnit不支持测试订购,除非您通过Suite 。 这仅定义了测试的执行顺序。 这已经存在了很长时间,包括JUnit 3 Suite类。

有关更完整的解释,我们需要在此处讨论三件事:

  1. 测试套件中测试类的排序
  2. 通过Eclipse或Maven的reflection找到测试类的顺序
  3. 测试类中测试方法的排序(使用@Test注释)。

测试套件中测试类的排序

当您指定要在测试套件中执行的类的列表时,您将定义一个数组,并且这些测试类将按顺序执行,除非您执行并行执行。 不幸的是,这允许在测试类之间引入依赖关系。

通过reflection找到测试类的顺序

在类路径中搜索类时,不能保证找到它们的顺序,因此不能依赖它们。 实际上并不是正在进行搜索的JUnit,而是Eclipse Junit插件,或者maven surefire或者failafe。

测试类中测试方法的顺序

JUnit不保证在类中执行测试的顺序。 大多数情况下,在版本7之前的大多数JVM上,使用reflection找到它们的顺序是按声明顺序,即它们在文件中的顺序。 这是它们执行的顺序。 但是,对于JVM 7,不再保证这一点,因此不会有一致的顺序。 有一个github问题#293使用建议的解决方案打开可预测性的测试方法 ,并且junit邮件列表上有一个线程: 字母顺序测试方法运行顺序? 。 因此,您不能依赖于使用JUnit执行测试的顺序,但目前正在讨论中。

不,不支持订购。 是的,这是意图:

KentBeck发表评论(2010年12月30日): 独立测试更有价值,因此JUnit的设计不支持测试订购。

如果您需要此function,可以使用TestNG和@Test(sequential = true)

@jeha回答非常好,但他谈到了测试方法(用@Test注释的那些)命令。 这个顺序确实是未指定的,可能是因为通过reflection获得的类中的方法顺序不能保证与源文件中的方法顺序相对应。

但是根据我的经验,它们按照大多数时间定义的顺序执行。

您询问的是测试类的顺序。 这不应该是一个惊喜:您使用@Suite.SuiteClasses明确列出测试类,而JUnit可能没有业务在改组它们并以不同的顺序运行。 您是否担心仅仅因为您明确地命令它们而在测试之间引入依赖关系?

您可以扩展Suite跑步者:

 public class MySuite extends Suite { public SuiteRunner(Class klass, RunnerBuilder builder) throws InitializationError { super(klass, builder); } @Override protected List getChildren() { List children = super.getChildren(); ... here modify the children list - you can remove or reorder test... return children; } } 

然后注释你的套房:

 @RunWith(MySuite.class) @Suite.SuiteClasses({ CreateNewProfile.class, EditProfile.class}) public class ProfileTestSuite { } 

标记为@Ignore的测试将由IgnoredClassRunner表示,常规测试将由BlockJUnit4ClassRunner (或任何您将对它们进行注释的运行程序 – 这可能是BlockJUnit4ClassRunner扩展)表示。

从跑步者您可以获得测试课程。 然后你可以使用自己的注释。

只需在类名前面使用_#排序类的名称即可绕过它。 Ex _1testcaselogin _2testcaseverify

JUnit 4.11现在支持使用@FixMethodOrder annoation指定执行顺序。