Интеграционное тестирование в Spring: TestContext Framework, параллельное выполнение тестов

Spring Framework 5.0 представил базовую поддержку для параллельного выполнения тестов в одной JVM при использовании Spring TestContext Framework. В общем, это означает, что большинство тестовых классов или тестовых методов можно запускать параллельно без каких-либо изменений в тестовом коде или конфигурации.

Имейте в виду, что введение параллелизма в ваш набор тестов может привести к неожиданным побочным эффектам, странному поведению во время выполнения и тестам, которые дают сбой периодически или на вид случайным образом. Поэтому команда Spring предоставляет следующие общие рекомендации, когда не следует запускать тесты параллельно.

Не запускайте тесты параллельно, если тесты:

  • Используют поддержку @DirtiesContext в Spring Framework.
  • Используют поддержку @MockBean или @SpyBean в Spring Boot.
  • Используют поддержку @FixMethodOrder в JUnit 4 или любую функцию инфраструктуры тестирования, которая предназначена для обеспечения того, чтобы методы тестирования выполнялись в определенном порядке. Обратите внимание, однако, что это не применяется, если целые тестовые классы выполняются параллельно.
  • Изменяют состояние общих служб или систем, таких как база данных, брокер сообщений, файловая система и другие. Это касается как встроенных, так и внешних систем.

Если выполнение параллельного теста завершается неудачно с исключением, указывающим, что ApplicationContext для текущего теста больше не активен, это обычно означает, что ApplicationContext был удален из ContextCache в другом потоке.

Это может быть связано с использованием @DirtiesContext или с автоматическим удалением из ContextCache. Если @DirtiesContext является виновником, вам нужно либо найти способ избежать использования @DirtiesContext, либо исключить такие тесты из параллельного выполнения. Если максимальный размер ContextCache был превышен, вы можете увеличить максимальный размер кеша.

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


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки