【问题标题】:Spring boot tests, multiple test classes run in particular order (class order, not the method order)Spring Boot 测试,多个测试类按特定顺序运行(类顺序,而不是方法顺序)
【发布时间】:2021-09-01 14:01:52
【问题描述】:

我使用的是Spring boot 2.3,并进行了以下测试。

// imports


@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(Suite.class)
@Suite.SuiteClasses({
        AuthControllerTests.class, //test case 1
        ReferenceDataControllerTests.class,     //test case 2
        ManualUploadDataControllerTests.class       // test case 3
})
public abstract class ApplicationTests {

    private static final PostgreSQLContainer postgreSQLContainer;

    static {
        postgreSQLContainer = new PostgreSQLContainer<>("postgres:12")
                                .withDatabaseName("tescontainers")
                                .withUsername("testcontainers")
                                .withPassword("testcontainers");

        postgreSQLContainer.start();
    }

    @DynamicPropertySource
    static void postgresqlProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.datasource.url", postgreSQLContainer::getJdbcUrl);
        registry.add("spring.datasource.password", postgreSQLContainer::getPassword);
        registry.add("spring.datasource.username", postgreSQLContainer::getUsername);
    }

}

3 个测试类(AuthControllerTests、ReferenceDataControllerTests、ManualUploadDataControllerTests)如下:

@AutoConfigureMockMvc
public class AuthControllerTests extends ApplicationTests {
..
..
}

@AutoConfigureMockMvc
public class ReferenceDataControllerTests  extends ApplicationTests {
..
..
}

@AutoConfigureMockMvc
public class ManualUploadDataControllerTests extends ApplicationTests {
..
..
}

基本上,这些测试使用由 ApplicationTests 启动的相同 Postgres DB,并且它们都成功运行而没有问题。

但是,我想运行这些测试是特定的类顺序。因此我尝试使用 Suite.class,但它没有帮助。 如您所见,我提供了 AuthControllerTests、ReferenceDataControllerTests 和最后是 ManualUploadDataControllerTests 的顺序。但它首先运行的是 ManualUploadDataControllerTests,然后是 AuthControllerTests,然后是 ReferenceDataControllerTests。

我可以按需要的顺序运行这些吗?我不想将所有测试组合在一个类中,然后使用@TestMethodOrder 来定义方法的顺序。

【问题讨论】:

    标签: java spring-boot junit


    【解决方案1】:

    @米希尔 您可以管理调用测试实现的顺序。

    我总是这样来管理测试的顺序。因此,您可以将其他 bean 或业务角色和身份验证策略传递给所有方法。

    使用junit4(按方法名排序,如果可以使用junit5会更好)

    @RunWith(SpringRunner.class)
    @AutoConfigureMockMvc
    @SpringBootTest
    @TestPropertySource(locations = "classpath:application-${spring.profiles.active:local}.properties")
    @FixMethodOrder(MethodSorters.NAME_ASCENDING) //  org.junit.FixMethodOrder; 
    public class RunIntegrationTest {
    
       @Autowired
        private MockMvc mockMvc;
        
        @Test // org.junit.Test;
        public void TA_testingController1() throws Exception{
            Controller1.testSomeMethod1(mockMvc);
            Controller1.testSomeMethod2(mockMvc);
        }
       
        @Test // org.junit.Test;
        public void TB_testingController2() throws Exception{
            Controller2.testSomeMethod3(mockMvc);
            Controller2.testSomeMethod4(mockMvc);
        }
    
    }
    
    public class Controller1 {
        public static void testSomeMethod1(MockMvc mockMvc) throws Exception {
                // ...
        }
        public static void testSomeMethod2(MockMvc mockMvc) throws Exception {
                // ...
        }
    }
    
    public class Controller2 {
        public static void testSomeMethod3(MockMvc mockMvc) throws Exception {
                // ...
        }
        public static void testSomeMethod4(MockMvc mockMvc) throws Exception {
                // ...
        }
    }
    

    使用junit5

    
    @ExtendWith(SpringExtension.class)
    @AutoConfigureMockMvc
    @SpringBootTest
    @TestPropertySource(locations = "classpath:application-${spring.profiles.active:local}.properties")
    @TestMethodOrder(OrderAnnotation.class) // import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
    public class RunIntegrationTest {
    
       @Autowired
        private MockMvc mockMvc;
        
        @Test // org.junit.jupiter.api.Test
        @Order(10)
        public void testingController1() throws Exception{
            Controller1.testSomeMethod1(mockMvc);
            Controller1.testSomeMethod2(mockMvc);
        }
       
       @Order(20)
        @Test // org.junit.jupiter.api.Test
        public void testingController2() throws Exception{
            Controller2.testSomeMethod3(mockMvc);
            Controller2.testSomeMethod4(mockMvc);
        }
    
    }
    
    

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 2010-09-05
      • 2020-09-29
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多