Запускайте интеграционные тесты, только если установлен определенный профиль пружины
У нас есть несколько тестовых классов в нашем весеннем загрузочном приложении. Некоторые из классов содержат интеграционные тесты, некоторые содержат модульные тесты. Это означает, что если я (например, с maven) разрешу выполнять все тесты, он будет запускать все тесты во всех классах.
Что мне нравится делать, так это то, что интеграционные тесты выполняются только, если установлен определенный профиль пружины, например, через application.yml. Мне нравится, например, аннотировать весь тестовый класс, чтобы определить, что тесты в этом классе выполняются, только если задан указанный профиль пружины. Если он не установлен, эти тесты должны игнорироваться.
- Тема Как использовать @IfProfileValue для проверки активности профиля? идет именно в этом направлении.
@IfProfileValue
выглядит на первый взгляд именно так, как мне нужно. Но, как указано, это не так. Я мог бы использовать это, если бы я установил определенное системное свойство. Но мне нужно использовать реальный профиль пружины (а не системное свойствоspring.profiles.active
- это будет игнорировать профиль, установленный черезapplication.yml
) @Profile
Похоже, что это то, что мне нужно, но поскольку тема Использование @Profile для принятия решения о выполнении тестовых классов, мы не должны ее использовать.
Итак, что можно сделать для достижения этой цели? Обратите внимание, что есть много вопросов о тестах и профилях пружин при переполнении стека. Но большинство из них указывают, как настроить конфигурации в тестах, специфичных для профилей пружин. Это не то, что я ищу. Я хотел бы выполнить или проигнорировать тесты.
3 ответа
Используя JUnit 5, вы можете использовать @Autowired Environment, чтобы проверить, активен ли профиль. Запускается тест @BeforeEach:
Assumptions.assumeTrue(Arrays.asList(this.environment.getActiveProfiles()).contains("integration"));
Это проверяет наличие профиля с именем "интеграция" и работает независимо от того, как профиль был установлен (системное свойство, переменная среды, application.yml и т. Д.).
Если профиль неактивен, тест будет проигнорирован, что аналогично использованию аннотации @Disabled.
Я не знаю точно, как вы хотите добиться этого, но вот способ, если вы используете junit для условного игнорирования некоторых тестов во время выполнения, просто используя свойство конфигурации:
application.properties:
test.enabled=true
тогда в вашем тестовом коде вы можете использовать org.junit.Assume
и свойство, подобное следующему:
@Value("${test.enabled}")
private Boolean testEnabled;
@Test
public void test {
org.junit.Assume.assumeTrue(testEnabled);
// your test code
}
Теперь, если вы установите свойство test.enabled
в true тест будет запущен, в противном случае он будет проигнорирован.
Источник: Условно игнорируем тесты в JUnit 4
Это очень просто. Мое решение в котлине:
- Создавать
annotation
import org.springframework.test.context.junit.jupiter.EnabledIf
import kotlin.annotation.AnnotationRetention.RUNTIME
import kotlin.annotation.AnnotationTarget.CLASS
import kotlin.annotation.AnnotationTarget.FUNCTION
@Target(CLASS, FUNCTION)
@Retention(RUNTIME)
@EnabledIf(
expression = "#{environment.acceptsProfiles('integration')}",
reason = "🏋🏻 Because spring.profiles.active = integration",
loadContext = true)
annotation class Integration
- Используй это:
import by.package.Integration
@Integration
internal class IntegrationTest {
@Test
// @Integration
fun test() {
assertEquals(4, 2 + 2)
}
@DisableIf
аннотация имеет противоположную логику