У Spring Framework 5.0 з'явилася базова підтримка паралельного виконання тестів у межах однієї JVM під час використання Spring TestContext Framework. У загальному випадку це означає, що більшість тестових класів або тестових методів можна виконувати паралельно без змін у тестовому коді або конфігурації.
Пам'ятай, що впровадження паралелізму до тестового комплекту може призвести до несподіваних побічних ефектів, незвичної логіки роботи під час виконання програми, а також до того, що тести періодично або випадково завершуватимуться невдало. Тому команда Spring Team пропонує наступні загальні рекомендації щодо випадків, коли не слід виконувати тести паралельно.
Не виконуй тести паралельно, якщо тести:
-
Використовують підтримку анотації
@DirtiesContext
у Spring Framework. -
Використовують підтримку анотацій
@MockBean
або@SpyBean
у Spring Boot. -
Використовують підтримку анотації
@FixMethodOrder
у JUnit 4 або будь-яку функцію тестового фреймворку, яка призначена для забезпечення виконання тестових методів у визначеному порядку. Зверни увагу, однак, що це не стосується випадків, коли цілі тестові класи виконуються паралельно. -
Зміна стану загальних служб або систем, таких як база даних, брокер повідомлень, файлова система та інших. Це стосується як вбудованих, так і зовнішніх систем.
Якщо паралельне виконання тесту завершується винятком, в якому говориться, що ApplicationContext
для
поточного тесту більше не активний, це зазвичай означає, що ApplicationContext
було видалено з
ContextCache
в іншому потоці.
Це може бути пов'язано з використанням анотації @DirtiesContext
або автоматичним витісненням з
ContextCache
. Якщо винуватцем є анотація @DirtiesContext
, потрібно знайти спосіб
уникнути використання @DirtiesContext
, або виключити такі тести з паралельного виконання. Якщо
максимальний розмір ContextCache
був перевищений, можна збільшити максимальний розмір кешу.
Докладніше див. у розділі, присвяченому контекстному
кешуванню.
TestContext
надає конструктор копіювання, як описано в javadoc для TestContext
. DefaultTestContext
, що використовується у Spring,
надає такий конструктор. Однак, якщо ти використовуєш сторонню бібліотеку, яка надає спеціальну реалізацію TestContext
,
необхідно переконатися, що вона підходить для паралельного виконання тестів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ