#spring #spring-boot #junit
#spring #spring-boot #junit
Вопрос:
Мое приложение Spring Boot также запускает службу gRPC вместе со своей службой REST (HTTP). Я написал специальные тесты для gRPC и REST. Однако, когда я запускаю тест gradle, эти тесты выполняются последовательно; нет причин, по которым их нельзя запускать параллельно.
То, ради чего я здесь снимаю, — это единственный экземпляр моего приложения Spring Boot, запущенный во время параллельного выполнения тестов.
Я попытался настроить раздел test в моем файле gradle так, чтобы в нем было ‘forkCount’, я также попытался настроить параметры таким образом, чтобы parallel =»классы», но это выдает ошибку о том, что ‘parallel’ является неизвестным свойством (возможно, что-то из junit 5?)
test {
options {
parallel = "classes"
// forkCount = 2
}
}
Опция forkCount — это не то, что я ищу, поскольку она запустит несколько экземпляров приложения spring.
Я также попытался удалить @RunWith из тестовых классов и создать отдельный тестовый класс (с аннотацией @RuWith), в котором есть следующий метод
@Test
void testRunner() {
JUnitCore.runClasses(ParallelComputer.classes(), {GrpcTests.class, RestTests.class});
}
Но тесты по-прежнему выполняются последовательно.
Я также пробовал несколько других вещей, извините, у меня не все из них под рукой.
Цель
В идеале я надеюсь, что один экземпляр моего приложения Spring Boot будет запущен во время параллельного выполнения тестовых классов (бонус, если я смогу заставить методы работать параллельно тоже)
- Версия Java: «1.8.0_171»
- Версия Spring Boot: 2.0.4.RELEASE
В соответствии с рекомендацией я попытался добавить
@Test
public void contextLoads() throws Exception {
}
И добавляя запись ‘maxParallelForks‘ в файл gradle, я уже использовал аннотацию @SpringBootTest, но это вело себя так же, как когда я использовал ‘forkCount`, по крайней мере, в 2 экземплярах, где запускался, как видно из журнала завершения тестирования
2019-04-25 10:24:17.245 LogLevel=INFO 53838 --- shutting down gRPC server since JVM is shutting down
...
2019-04-25 10:24:30.125 LogLevel=INFO 53839 --- shutting down gRPC server since JVM is shutting down
Вы можете видеть, что я получаю два сообщения о завершении работы, и отображаются PID (53838 и 53839).
Ответ №1:
Вам нужно объединить @SpringBootTest с maxParallelForks.
Комментируйте свои модульные тесты с помощью @SpringBootTest. @SpringBootTest загрузит контекст загрузки Spring, который будет кэшироваться во всех ваших тестах.
«Приятной особенностью поддержки тестов Spring является то, что контекст приложения кэшируется между тестами, поэтому, если у вас есть несколько методов в тестовом примере или несколько тестовых наборов с одинаковой конфигурацией, они требуют затрат на запуск приложения только один раз»
Смотрите: https://spring.io/guides/gs/testing-web /
Добавьте следующее в свой build.gradle. Для одновременного запуска нескольких тестов.
tasks.withType(Test) {
maxParallelForks = 4 //your choice here
}
Смотрите https://guides.gradle.org/performance/#parallel_test_execution
Комментарии:
1. Это не работает. Аналогично ‘forkCount’, который я пробовал, он запускает несколько экземпляров приложения. Это можно увидеть при завершении работы, когда я получаю 2 сообщения от моего серверного процесса gRPC:
2019-04-25 10:24:17.245 INFO **53838** shutting down gRPC server since JVM is shutting down 2019-04-25 10:24:30.125 INFO **53839** shutting down gRPC server since JVM is shutting down
Вы можете видеть из PID (в двойном ‘*’), что они разные.2. Эй, Джим, ты можешь опубликовать один из своих тестов, который использует gRPC и имеет @SpringBootTest?