在junit中执行测试套件的订单

时间:2017-03-04 18:16:34

标签: java junit

我正在拥有一个具有以下结构的测试套件

.
├── my_project
│   ├── app
│   ├── db.sqlite3
│   ├── manage.py
│   ├── my_project
│   └── static
└── venv

在上面的结构中,我想执行testmethod4()作为最后一个。即)最后执行。 有一个注释@FixMethodOrder,它执行一个方法而不是testclass。是否有任何机制来维护测试类和testmethod中的顺序。使用@FixMethodOrder,我可以通过重命名测试方法的名称来执行该方法,但我不能指示junit执行测试类作为最后一个(最后一个)。

2 个答案:

答案 0 :(得分:7)

虽然再次引用@Andy--

  

您不应该关心测试订购。如果它很重要,你就得到了   测试之间的相互依赖性,因此您正在测试行为+   相互依赖,而不仅仅是行为。你的测试应该有效   同样以任何顺序执行。

但如果需要这样做,你可以尝试Suite

@RunWith(Suite.class)

@Suite.SuiteClasses({
        TestClass2.class,
        TestClass1.class
})
public class JunitSuiteTest {
}

您可以指定

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestClass1 {

    @AfterClass
    public void testMethod4() {

然后注意将方法testMethod4命名为最终执行,或者也可以使用@AfterClass,这很快就会被Junit5中的@AfterAll替换。

请查看Controlling the Order of the JUnit test by Alan Harder

答案 1 :(得分:0)

@shiriam正如@Andy Turner已经指出的那样,在运行测试时,测试的顺序不应该存在问题。

如果您在进行任何测试之前有一个要执行的例程,则可以在其中一个类中使用静态代码块。

想想这样的事情:

class TestBootstrap {
  // singleton instance
  private static final instance;
  private boolean initialized;

  private TestBootstrap(){
      this.initialized = false;    
  }

  public static TestBootstrap getInstance(){
       if (instance == null){
           instance = new TestBootstrap()
       }

  }
  public void init(){
      // make the method idempotent
      if (!initialzed){
         // do init stuff
         initialized = true;
      }
  }

  public boolean isInitialized(){
     return initialized;
  }

}

然后在你的测试中使用这样的东西:

class TestClass1{
    @BeforeClass
    public void setup(){
         TestBootstrap.getInstance().init();
    }


    @Test
    public void testmethod1(){
        // assertions
    }

    // ....

}

class TestClass2{
    @BeforeClass
    public void setup(){
         TestBootstrap.getInstance().init();
    }

    @Test
    public void testmethod11(){
        // assertions
    }

    // ...
}

通过使用单例实例进行测试设置,您可以确保只执行一次测试环境的初始化,而与执行测试类的顺序无关。