Запускать тестовые наборы Spring одновременно не последовательно

#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?