У Spring Framework 5.0 з'явилася базова підтримка паралельного виконання тестів у межах однієї JVM під час використання Spring TestContext Framework. У загальному випадку це означає, що більшість тестових класів або тестових методів можна виконувати паралельно без змін у тестовому коді або конфігурації.

Докладну інформацію про те, як налаштувати паралельне виконання тестів, можна знайти в документації до твоєї системи тестування, інструментального засобу складання або IDE.

Пам'ятай, що впровадження паралелізму до тестового комплекту може призвести до несподіваних побічних ефектів, незвичної логіки роботи під час виконання програми, а також до того, що тести періодично або випадково завершуватимуться невдало. Тому команда Spring Team пропонує наступні загальні рекомендації щодо випадків, коли не слід виконувати тести паралельно.

Не виконуй тести паралельно, якщо тести:

  • Використовують підтримку анотації @DirtiesContext у Spring Framework.

  • Використовують підтримку анотацій @MockBean або @SpyBean у Spring Boot.

  • Використовують підтримку анотації @FixMethodOrder у JUnit 4 або будь-яку функцію тестового фреймворку, яка призначена для забезпечення виконання тестових методів у визначеному порядку. Зверни увагу, однак, що це не стосується випадків, коли цілі тестові класи виконуються паралельно.

  • Зміна стану загальних служб або систем, таких як база даних, брокер повідомлень, файлова система та інших. Це стосується як вбудованих, так і зовнішніх систем.

Якщо паралельне виконання тесту завершується винятком, в якому говориться, що ApplicationContext для поточного тесту більше не активний, це зазвичай означає, що ApplicationContext було видалено з ContextCache в іншому потоці.

Це може бути пов'язано з використанням анотації @DirtiesContext або автоматичним витісненням з ContextCache. Якщо винуватцем є анотація @DirtiesContext, потрібно знайти спосіб уникнути використання @DirtiesContext, або виключити такі тести з паралельного виконання. Якщо максимальний розмір ContextCache був перевищений, можна збільшити максимальний розмір кешу. Докладніше див. у розділі, присвяченому контекстному кешуванню.

Паралельне виконання тестів у Spring TestContext Framework можливе, тільки якщо базова реалізація TestContext надає конструктор копіювання, як описано в javadoc для TestContext. DefaultTestContext, що використовується у Spring, надає такий конструктор. Однак, якщо ти використовуєш сторонню бібліотеку, яка надає спеціальну реалізацію TestContext, необхідно переконатися, що вона підходить для паралельного виконання тестів.