Java JUnit4已经开始支持测试的排序了吗?这是故意的吗?

Java JUnit4已经开始支持测试的排序了吗?这是故意的吗?,java,junit,junit4,Java,Junit,Junit4,一个JUnit新手(事实上是JUnit4),他遇到了执行测试的套件方式 @RunWith(Suite.class) @Suite.SuiteClasses( { CreateNewProfile.class, EditProfile.class, }) public class ProfileTestSuite { } 这是我在浏览新

一个JUnit新手(事实上是JUnit4),他遇到了执行测试的套件方式

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

        })
public class ProfileTestSuite {

}
这是我在浏览新雇主的测试代码库时遇到的代码示例。 在执行期间,首先执行-CreateNewProfile测试,然后执行EditProfile, 这是有道理的,但它引入了测试之间的依赖关系

几个月以来,我一直在遵循非依赖测试机制(尽管我以前使用的是TestNG而不是JUnit),并且希望EditProfile也能够独立执行。也就是说,编辑概要文件应该注意创建概要文件,然后编辑它,然后断言操作


我这里的问题是——JUnit4是否引入了测试排序功能。这项功能是我想要的还是一个复活节彩蛋,我一直觉得JUnit=独立测试。

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

独立测试更有价值,因此JUnit by design不支持测试排序。

如果您需要此功能,可以将TestNG与它的
@Test(sequential=true)

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

然而,根据我的经验,它们的执行顺序与大多数时候定义的顺序相同


您正在询问测试类的顺序。这并不奇怪:您正在使用
@Suite.SuiteClasses
显式列出测试类,JUnit可能不需要对它们进行洗牌并以不同的顺序运行。您是否仅仅因为显式地对测试进行排序而担心在测试之间引入依赖关系?

没有JUnit不支持测试排序,除非您通过
Suite
所说的方式。 这仅定义测试类执行的顺序。这已经存在很长时间了,包括JUnit3套件类

为了得到更完整的解释,我们需要在这里讨论三件事:

  • 测试套件中测试类的排序
  • 当Eclipse或Maven通过反射找到测试类时,测试类的顺序
  • 测试类中测试方法(用@test注释)的顺序
  • 测试套件中测试类的排序 当您指定要在测试套件中执行的类列表时,您正在定义一个数组,并且这些测试类将按顺序执行,但并行执行时除外。不幸的是,这允许在测试类之间引入依赖关系

    通过反射找到测试类时测试类的顺序 在类路径中搜索类时,不能保证找到它们的顺序,因此不能依赖它们。实际上,进行搜索的不是JUnit,而是Eclipse JUnit插件,或者maven surefire或failsafe

    测试类中测试方法的排序
    JUnit不保证类内测试的执行顺序。大多数情况下,在版本7之前的大多数JVM上,使用反射找到它们的顺序是声明顺序,即它们在文件中的顺序。这是执行它们的顺序。然而,对于JVM7,这不再是保证,因此不会有一致的顺序。建议的解决方案中存在一个github问题,junit邮件列表中有一个线程:。因此,您不能依赖于使用JUnit执行测试的顺序,但这一点目前正在讨论中。

    只需在类名之前使用35;对类名进行排序即可绕过它。前任 _1测试用例登录
    _2测试用例验证

    您可以扩展套件运行程序:

    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;
        }
    }
    
    标有
    @Ignore
    的测试将由
    IgnoredClassRunner
    表示,而常规测试将由
    BlockJUnit4ClassRunner
    表示(或者您将注释它们的任何运行程序-这可能是
    BlockJUnit4ClassRunner
    的扩展)


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

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

    好的,每次执行它时,我都会看到先调用CreateNewProfile.class的方法,然后调用EditProfile.class。现在不是排序吗?@Tarun:我想这是它如何实现的结果(隐式排序)。关键是执行的顺序是不能保证的(没有明确的顺序),因此这可能会发生变化,您不能依赖于此。使用\@Suite对测试类进行排序让我担心,因为当我在\@suites之外执行它们时,我无法独立执行它们。实际上,使用TestNG时,它是@Test(dependsOnMethods=…)或推荐的@Test(dependsOnGroups=…)。可以在JUnit中通过类注释
    @FixMethodOrder(methodsorter.NAME\u升序)
    实现排序(从JUnit 4.11开始)但是由于前面提到的原因,应该避免这样做。是的,我担心\@Suite中指定的测试类在执行时引入的顺序。我觉得这是对\@Suite的滥用,我不能只执行“EditProfile.class”如果我愿意的话,可以从@Suite中删除。因此我认为测试应该能够独立执行,而不取决于它们在@Suite中的排列顺序。当我并行执行测试时,这会给我带来惊喜。对吗?测试方法(以及类)应该始终是独立可执行的,只要这样您就可以在IDE中执行单个测试。这取决于并行运行程序如何执行测试,它是并行执行类还是并行执行类中的方法,但它可能会导致问题。最好尝试并避免
    @RunWith(MySuite.class)
    @Suite.SuiteClasses({                               
            CreateNewProfile.class,
            EditProfile.class})
    public class ProfileTestSuite { }