Запускайте интеграционные тесты, только если установлен определенный профиль пружины

У нас есть несколько тестовых классов в нашем весеннем загрузочном приложении. Некоторые из классов содержат интеграционные тесты, некоторые содержат модульные тесты. Это означает, что если я (например, с maven) разрешу выполнять все тесты, он будет запускать все тесты во всех классах.

Что мне нравится делать, так это то, что интеграционные тесты выполняются только, если установлен определенный профиль пружины, например, через application.yml. Мне нравится, например, аннотировать весь тестовый класс, чтобы определить, что тесты в этом классе выполняются, только если задан указанный профиль пружины. Если он не установлен, эти тесты должны игнорироваться.

Итак, что можно сделать для достижения этой цели? Обратите внимание, что есть много вопросов о тестах и ​​профилях пружин при переполнении стека. Но большинство из них указывают, как настроить конфигурации в тестах, специфичных для профилей пружин. Это не то, что я ищу. Я хотел бы выполнить или проигнорировать тесты.

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

Это очень просто. Мое решение в котлине:

  1. Создавать 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
  1. Используй это:
      import by.package.Integration


@Integration
internal class IntegrationTest {

    @Test
    // @Integration 
    fun test() {
       assertEquals(4, 2 + 2)
    }

@DisableIf аннотация имеет противоположную логику

Другие вопросы по тегам