Как остановить тесты при неудачном запуске spring
Приложение на spring-boot. Запускаются тесты (junit5 jupiter), если при запуске spring произошла ошибка, то происходит переход к следующему тесту. Всё это занимает много времени, а остановить нельзя из-за возможно блокировки liquibase. Тесты запускаются автоматически на сервере и не хотелось бы вручную что-то делать при таких ошибках.
Вот пример кода теста:
@SpringBootTest
@AutoConfigureMockMvc
@ExtendWith(SpringExtension.class)
@WithMockUser(username = "user", password = "pass")
@ContextConfiguration(classes = ManufacturingApplication.class)
class OrderControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void get() throws Exception {
mockMvc
.perform(MockMvcRequestBuilders.get("/api/1.0/orders")
.header("Origin", "*"))
.andExpect(MockMvcResultMatchers.status().isOk());
}
}
Ошибка может быть связана с невозможность найти зависимость для @Autowire.
Можно ли как-то переопределить такое поведение? В идеале, если прилетело исключение во время инициализации spring, то тесты завершали бы свою работу.
Ответы (1 шт):
Сомневаюсь, что есть возможность сделать именно так, как вы хотите, т.е. остановить все тесты при возникновении одной конкретной проблемы. Есть похожая возможность - пропустить тесты после какого количества упавших тестов, но там это происходит независимо от причины, по которой тесты не прошли. Т.е. обычная проблема не связанная с инициализацией контекста тоже прекратит выполнение.
Обычно делают чуть иначе. А именно пользуются возможностью отфильтровывать тесты и запускать их выборочно.
Создайте один специальный smoke тест, задача которого будет проверять, что контекст в принципе рабочий. На CI сервере разделите запуск тестов на две команды, сначала запуск только этого специального smoke теста, а потом запуск всех остальных тестов.
Теперь немного подробностей.
Разделение тестов на группы
Воспользуйтесь аннотацией @Tag и пометьте ею тест указав имя группы:
@SpringBootTest
@AutoConfigureMockMvc
@ExtendWith(SpringExtension.class)
@WithMockUser(username = "user", password = "pass")
@ContextConfiguration(classes = ManufacturingApplication.class)
class OrderControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
@Tag("smoke")
void smoke() throws Exception {
// intentiontionally empty
}
}
Запуск только тестов из группы
Для этого передавайте параметр при запуске тестов:
mvn test -Dgroups=smoke # запустит только тесты с тегом smoke
mvn test # запустит все тесты
Так же есть возможность запустить все кроме smoke. Если не ошибаюсь, то синтаксис такой (но лучше проверить документации по junit5 и maven surefire plugin):
mvn test -Dgroups=!smoke # тут может быть нюанс с экранированием восклицательного знака
# так как в shell это спец символ. Зависит от вашей OC и shell
# поэтому не подскажу. Задавайте новый вопрос конкретно об
# этом, если будет проблема.
На CI сервере нужно сконфигурировать запуск так, чтоб сначала выполнялась команда для запуска smoke тестов и если она не проходит, то останавливать процесс. Как это сделать, зависит от того, что используете для CI.
Вполне возможно, что можно сконфигурировать мавен так, чтоб одной командой запускались тесты из разных групп по очереди чтобы было удобнее и не нужно было на CI вообще ничего делать. Могу подсказать только по gradle - там знаю так это сделать, по мавен - лучше задать отдельный конкретный вопрос.