【问题标题】:Ignoring a test class based on Spring Boot profile忽略基于 Spring Boot 配置文件的测试类
【发布时间】:2019-08-11 09:12:22
【问题描述】:

参加任何带有单元测试和集成测试的 Spring Boot 项目。我想单独运行单元测试,而不会失去一次运行所有测试的能力。这个问题的解决方案:

  1. 默认从 IntelliJ 运行单元测试和集成测试,
  2. 支持从 cli 运行单元测试和集成测试的 Gradle 命令,并且
  3. 支持仅从 cli 运行单元测试的 Gradle 命令。完全忽略集成测试类很重要,因为它们包含构建环境中不可用的外部依赖项。

我的做法是在命令行通过测试配置文件:gradlew test -PtestProfile=unit

接下来,在build.gradle 中,设置活动弹簧配置文件:

test {
    if (project.hasProperty("testProfile")) {
        systemProperty "spring.profiles.active", project.getProperties()["testProfile"]
    }
}

问题:如何注释我的集成测试类,以便每当spring.profiles.active=unit 时,集成测试都会被跳过?

我试过了:

  • @Profile,在测试范围内不起作用,
  • @IfProfile,不适用于场景 1,因为它需要传递显式属性。
  • @ActiveProfiles,它不起作用,因为它会覆盖当前活动的配置文件,而不是有条件地禁用测试。

这样做的正确方法是什么?

【问题讨论】:

  • 我会根据类的名称过滤测试,或者使用类别/标签:docs.gradle.org/current/userguide/…
  • @JBNizet 谢谢,我更愿意坚持使用在 Spring Boot (jUnit 4) 中本机工作的解决方案,所以 @Tag 不可用,但 excludeCategories 有效!
  • 这对我来说似乎是一个糟糕的解决方案:您想忽略 Spring 集成测试,但基于需要启动 Spring 上下文以评估配置文件的内容做出决定。是不是很矛盾?
  • @JBNizet 好吧,不完全是。根据应用程序环境启用/禁用某些类是典型的 Spring Boot 模式。如果 jUnit 或 Spring 处理这个而不是 Gradle,那就太好了,因为这将使测试独立于构建工具。

标签: java spring-boot testing gradle


【解决方案1】:

感谢@JBNizet,以下解决方案对我有用。

我们仍然在命令行上通过了一个测试配置文件: gradlew test -PtestProfile=unit

build.gradle 中,我们设置了一个excludeCategory

test {
    if (project.hasProperty("testProfile")) {
        if (project.getProperties()["testProfile"] == "unit") {
            useJUnit {
                excludeCategories "com.yourproject.testutils.IntegrationTestCategory"
            }
        }
    }
}

添加一个空接口com.yourproject.testutils.IntegrationTestCategory。在您希望排除的测试类上,添加注释@Category(IntegrationTestCategory.class)

您的测试现在默认启用,但可以通过 Gradle cli 选择性地忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 2016-05-15
    • 1970-01-01
    • 2014-07-20
    • 2020-02-06
    • 2017-02-03
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多