В 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
, вам необходимо убедиться, что она подходит для параллельного выполнения тестов.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ