В 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, вам необходимо убедиться, что она подходит для параллельного выполнения тестов.