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

时间:2011-10-21 06:51:56

标签: java junit junit4

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

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

        })
public class ProfileTestSuite {

}

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

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

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

6 个答案:

答案 0 :(得分:19)

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

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

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

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

    通过反射找到测试类的顺序

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

    测试类中测试方法的排序

    JUnit不保证在类中执行测试的顺序。大多数情况下,在版本7之前的大多数JVM上,使用反射找到它们的顺序是按声明顺序,即它们在文件中的顺序。这是它们执行的顺序。但是,使用JVM 7时,不再保证这一点,因此不会有一致的顺序。有一个github问题#293 Sort test methods for predictability打开了建议的解决方案,junit邮件列表上有一个帖子:Alphabetizing test method run order?。所以你不能依赖于使用JUnit执行测试的顺序,但目前正在讨论这个问题。

答案 1 :(得分:5)

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

  

KentBeck commented (December 30, 2010):   独立测试更有价值,因此JUnit设计不支持测试订购。

如果您需要此功能,可以将TestNG与@Test(sequential = true)一起使用。

答案 2 :(得分:3)

@jeha 答案非常好,但他谈的是测试方法(用@Test注释的那些)。这个顺序确实是未指定的,可能是因为通过反射获得的类中的方法顺序不能保证与源文件中的方法顺序一致。

但是根据我的经验,他们按照大部分时间定义的顺序执行。

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

答案 3 :(得分:1)

您可以扩展Suite跑步者:

public class MySuite extends Suite {

    public SuiteRunner(Class<?> klass, RunnerBuilder builder) throws InitializationError {
        super(klass, builder);
    }

    @Override
    protected List<Runner> getChildren() {
        List<Runner> 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表示(或者您将为其注释的任何参赛者 - 这可能会扩展为{{} 1}})。

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

答案 4 :(得分:0)

通过在类名前面使用_#来排序类的名称来绕过它。防爆 _1testcaselogin _2testcaseverify

答案 5 :(得分:0)

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