运行 仅当设置了特定 spring 配置文件时才进行集成测试

Run integration tests only if specific spring profile is set

我们的 spring 启动应用程序中有多个测试 classes。一些 classes 包含集成测试,一些包含单元测试。 这意味着如果我(例如使用 maven)让所有测试都被执行,它将 运行 所有 classes 中的所有测试。

我想实现的是,只有在设置了特定的 spring 配置文件时才执行集成测试,例如通过 application.yml。 我喜欢例如注释整个测试 class 以定义此 class 中的测试仅在指定的 spring 配置文件已设置时执行。 如果未设置,将忽略这些测试。

那么可以做些什么来实现这一目标呢? 请注意,关于堆栈溢出的测试和 spring 配置文件有很多问题。但是他们中的大多数指出了如何在特定于 spring 配置文件的测试中设置配置。那不是我要找的。 我想执行或忽略测试。

我不知道你想如何实现它,但如果你使用 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 设置为真,测试将 运行,否则它将被忽略。

来源:Conditionally ignoring tests in JUnit 4

使用 JUnit 5,您可以使用 @Autowired 环境来检查配置文件是否处于活动状态 @BeforeEach 测试是 运行: Assumptions.assumeTrue(Arrays.asList(this.environment.getActiveProfiles()).contains("integration"));

这会检查名为 "integration" 的配置文件,并且无论配置文件是如何设置的(系统 属性、环境变量、application.yml 等)都可以正常工作。

如果配置文件未激活,测试将被忽略,这类似于使用@Disabled 注解。

这很容易。我在科特林中的解决方案:

  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 annotation has opposite logic