#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);
}
}