Следующие аннотации поддерживаются только при использовании в сочетании с SpringRunner, правилами для JUnit 4 в Spring или вспомогательными классами JUnit 4 в Spring:
@IfProfileValue
Аннотация @IfProfileValue
указывает, что аннотированный тест активирован для определенной тестовой среды. Если сконфигурированный ProfileValueSource
возвращает совпадающее value
для указанного name
, то тест активируется. В противном случае тест запрещен и фактически игнорируется.
Можно применять аннотацию @IfProfileValue
на уровне класса, на уровне метода или на обоих уровнях. Использование аннотации @IfProfileValue
на уровне класса имеет приоритет над использованием на уровне метода для любых методов внутри этого класса или его подклассов. В частности, тест считается активированным, если он активирован как на уровне класса, так и на уровне метода. Отсутствие аннотации @IfProfileValue
означает, что тест активирован неявно. Это соответствует семантике аннотации @Ignore
из JUnit 4, за исключением того, что наличие аннотации @Ignore
всегда дезактивирует тест.
В следующем примере показан тест с аннотацией @IfProfileValue
:
@IfProfileValue(name="java.vendor", value="Oracle Corporation")
@Test
public void testProcessWhichRunsOnlyOnOracleJvm() {
// некоторая логика, которая должна выполняться только на Java VM от Oracle Corporation
}
- Выполняем этот тест только в том случае, если поставщиком Java является "Oracle Corporation".
@IfProfileValue(name="java.vendor", value="Oracle Corporation")
@Test
fun testProcessWhichRunsOnlyOnOracleJvm() {
// некоторая логика, которая должна выполняться только на Java VM от Oracle Corporation
}
- Выполняем этот тест только в том случае, если поставщиком Java является "Oracle Corporation".
Как вариант, можно сконфигурировать аннотацию @IfProfileValue
с использованием списка values
(с семантикой OR
) для получение TestNG-подобной поддержки групп тестов в среде JUnit 4. Рассмотрим следующий пример:
@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"})
@Test
public void testProcessWhichRunsForUnitOrIntegrationTestGroups() {
// некоторая логика, которая должна выполняться только для групп модульных и интеграционных тестов
}
- Выполняем этот тест для модульных и интеграционных тестов.
@IfProfileValue(name="test-groups", values=["unit-tests", "integration-tests"])
@Test
fun testProcessWhichRunsForUnitOrIntegrationTestGroups() {
// некоторая логика, которая должна выполняться только для групп модульных и интеграционных тестов
}
- Выполняем этот тест для модульных и интеграционных тестов.
@ProfileValueSourceConfiguration
@ProfileValueSourceConfiguration
– это аннотация на уровне класса, которая определяет, какой тип ProfileValueSource
использовать при получении значений профиля, сконфигурированных с помощью аннотации @IfProfileValue
. Если аннотация @ProfileValueSourceConfiguration
не объявлена для теста, то по умолчанию используется SystemProfileValueSource
. В следующем примере показано, как использовать аннотацию @ProfileValueSourceConfiguration
:
@ProfileValueSourceConfiguration(CustomProfileValueSource.class)
public class CustomProfileValueSourceTests {
// тело класса...
}
- Используем источник значения специального профиля.
@ProfileValueSourceConfiguration(CustomProfileValueSource::class)
class CustomProfileValueSourceTests {
// тело класса...
}
- Используем источник значения специального профиля.
@Timed
Аннотация @Timed
указывает, что аннотированный метод тестирования должен завершить выполнение за указанный период времени (в миллисекундах). Если время выполнения текста превышает указанный период времени, то тест завершается неудачно.
Период времени включает в себя выполнение самого метода тестирования, любые повторения теста (см. @Repeat
), а также установку и разборку тестового стенда. В следующем примере показано, как её использовать:
@Timed(millis = 1000)
public void testProcessWithOneSecondTimeout() {
// некоторая логика, выполнение которой не должно занимать более 1 секунды
}
- Устанавливаем период времени для теста равным одной секунде.
@Timed(millis = 1000)
fun testProcessWithOneSecondTimeout() {
// некоторая логика, выполнение которой не должно занимать более 1 секунды
}
- Устанавливаем период времени для теста равным одной секунде.
Аннотация @Timed
из Spring имеет иную семантику, чем та, что представлена в средствах поддержки аннотации @Test(timeout=…)
из JUnit 4. В частности, из-за того, как JUnit 4 обрабатывает значения времени ожидания (timeouts) выполнения теста (т. е. выполняя тестовый метод в отдельном Thread
), @Test(timeout=…)
в упреждающем режиме не проходит тест, если тест занимает слишком много времени. С другой стороны аннотация @Timed
в Spring не проваливает тест упреждающе, ждет завершения теста, прежде чем он будет пройден неудачно.
@Repeat
Аннотация @Repeat
указывает, что аннотированный тестовый метод должен выполняться многократно. Количество запусков тестового метода указывается в аннотации.
Область видимости повторного выполнения включает выполнение самого тестового метода, а также установку и разбор тестового стенда. При использовании с SpringMethodRule
область видимости дополнительно включает подготовку тестового экземпляра реализацией TestExecutionListener
. В следующем примере показано, как использовать аннотацию @Repeat
:
@Repeat(10)
@Test
public void testProcessRepeatedly() {
// ...
}
- Повторяем этот тест десять раз.
@Repeat(10)
@Test
fun testProcessRepeatedly() {
// ...
}
- Повторяем этот тест десять раз.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ