Тесты весенней загрузки, несколько тестовых классов выполняются в определенном порядке (порядок классов, а не порядок методов)

#java #spring-boot #junit

Вопрос:

Я использую 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 {
..
..
}
 

В основном эти тесты используют одну и ту же базу данных Postgres, инициированную тестами приложений, и все они успешно выполняются без проблем.

Однако я хочу запустить эти тесты в определенном порядке классов. Поэтому я попытался использовать Suite.class, но это не помогает. Как вы можете видеть, я предоставил заказ AuthControllerTests, ReferenceDataControllerTests и, наконец, ManualUploadDataControllerTests. Но сначала он запускает тесты ManualUploadDataControllerTests, затем тесты AuthControllerTests, а затем тесты ReferenceDataControllerTests.

Как-нибудь я могу запустить их в нужном порядке? Я не хочу объединять все тесты в одном классе, а затем использовать @TestMethod для определения порядка методов.

Ответ №1:

@Mihir Вы можете управлять порядком вызова ваших тестовых реализаций.

Я всегда делаю это ниже для управления порядком тестов. Таким образом, вы можете передать другие компоненты или бизнес-роли и стратегии аутентификации во все методы.

использование 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);
    }

}