Интеграционное тестирование в Spring: аннотации тестирования Spring JUnit 4

Следующие аннотации поддерживаются только при использовании вместе с SpringRunner, Spring JUnit 4 rules, классами поддержки Spring JUnit 4:

  • @IfProfileValue
  • @ProfileValueSourceConfiguration
  • @Timed
  • @Repeat

@IfProfileValue

@IfProfileValue указывает, что аннотированный тест включен для конкретной среды тестирования. Если настроенный ProfileValueSource возвращает соответствующее значение для предоставленного имени, тест включен. В противном случае тест отключается и фактически игнорируется.

Вы можете применить @IfProfileValue на уровне класса, на уровне метода или на обоих уровнях. Использование @IfProfileValue на уровне класса имеет приоритет над использованием на уровне метода для любых методов в этом классе или его подклассах. В частности, тест включен, если он включен как на уровне класса, так и на уровне метода. Отсутствие @IfProfileValue означает, что тест включен неявно. Это аналогично семантике аннотации @Ignore в JUnit 4, за исключением того, что наличие @Ignore всегда отключает проверку.

В следующем примере показан тест с аннотацией @IfProfileValue:

// Выполняется этот тест, 
// только если поставщиком Java является Oracle Corporation.
@IfProfileValue(name="java.vendor", value="Oracle Corporation") 
@Test
public void testProcessWhichRunsOnlyOnOracleJvm() {
    // некоторая логика, 
    // которая должна работать только 
    // на виртуальных машинах Java от Oracle 
}

В качестве альтернативы вы можете настроить @IfProfileValue со списком значений (с семантикой OR), чтобы добиться поддержки, подобной TestNG, для тестовых групп в среде JUnit 4. Рассмотрим следующий пример:

// Тест запускается для модульных тестов и интеграционных тестов.
@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"}) 
@Test
public void testProcessWhichRunsForUnitOrIntegrationTestGroups() {
    // некоторая логика, 
    // которая должна работать только для групп 
    // модульного и интеграционного тестирования
}

@ProfileValueSourceConfiguration

@ProfileValueSourceConfiguration - это аннотация уровня класса, которая указывает, какой тип ProfileValueSource использовать при извлечении значений профиля, настроенных с помощью аннотации @IfProfileValue. Если @ProfileValueSourceConfiguration не объявлен для теста, по умолчанию используется SystemProfileValueSource. В следующем примере показано, как использовать @ProfileValueSourceConfiguration:

// Использовать источник значений настраиваемого профиля.
@ProfileValueSourceConfiguration(CustomProfileValueSource.class) 
public class CustomProfileValueSourceTests {
    // тело класса...
}

@Timed

@Timed указывает, что аннотированный тестовый метод должен завершить выполнение в указанный период времени (в миллисекундах). Если время выполнения текста превышает указанный период времени, тест не проходит.

Период времени включает запуск самого метода тестирования, любые повторения теста (@Repeat), а также любую настройку или отключение тестового устройства. В следующем примере показано, как его использовать:

@Timed(millis = 1000) 
public void testProcessWithOneSecondTimeout() {
    // некоторая логика, 
    // выполнение которой не должно занимать больше 1 секунды
}

Аннотации Spring @Timed имеют другую семантику, чем поддержка @Test(timeout=…) в JUnit 4. В частности, из-за того, как JUnit 4 обрабатывает тайм-ауты выполнения теста (то есть, выполняя тестовый метод в отдельном потоке), @Test(timeout=…) заранее не проходит тест, если тест занимает слишком много времени. С другой стороны, Spring @Timed не завершает тест заранее, а скорее ожидает завершения теста, прежде чем потерпеть неудачу.

@Repeat

@Repeat указывает, что аннотированный тестовый метод необходимо запускать повторно. Количество запусков метода тестирования указано в аннотации.

Объем повторяемого выполнения включает выполнение самого метода тестирования, а также любую настройку или отключение тестового устройства. В следующем примере показано, как использовать аннотацию @Repeat:

// Повторить этот тест десять раз
@Repeat(10) 
@Test
public void testProcessRepeatedly() {
    // ...
}


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


Комментарии

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

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

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

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