【问题标题】:Best practice for application.properties for tests in spring-boot在 spring-boot 中进行测试的 application.properties 的最佳实践
【发布时间】:2021-12-28 16:41:28
【问题描述】:

我见过一些项目,其中在 src/test/resources 下定义了一个独立的 application.properties,其中包含在 src/main/resources 下定义的默认 application.properties 中的所有属性,同时为了测试目的而覆盖属性。这种方法的缺点是每次更改(添加/删除/更新属性)都必须在两个 application.properties 中完成,否则测试可能失败。

另一方面,我看到在src/test/resources 下只定义了一个基于上下文的属性文件的项目,比如application-test.properties 只包含用于测试目的的覆盖属性。这种方法将src/main/resources 下的默认application.propertiessrc/test/resources 下的application-test.properties 合并。必须通过@ActiveProfiles 在测试类中激活相应的上下文,例如@ActiveProfiles("test")

您采用的方法是什么,为什么?对此是否有任何最佳做法或建议?

感谢您提前回复。

【问题讨论】:

    标签: spring-boot junit5


    【解决方案1】:

    配置文件通常用于相应地“映射”不同的 Spring bean。我发现人们通常在大多数工作流程中坚持使用其中的三个:developmenttestproduction — 主要是在教程和博客中。

    我使用与将要部署应用程序的实际环境一致的配置文件,因为它更真实。所以我总是使用local 配置文件运行测试。如果我需要任何特定设置来运行测试,我只需在 src/test/resources 下重新定义一个 application.properties 文件并覆盖所需的内容。

    通过这种方式,您将始终有效地拥有将用于在src/main/resources 内的每个环境中运行应用程序的内容,如果需要覆盖任何内容仅用于测试,@987654328 @ 可以解决这个问题。

    例如,假设您的 src/main/resources/application.yaml 文件如下所示:

    application:
      key: value-common
      another-key: value-common-another
    spring:
      profiles:
        active: default
    ---
    spring:
      config:
        activate:
          on-profile: local
      main:
        banner-mode: console
    ---
    spring:
      config:
        activate:
          on-profile: test
    

    有效地定义了两个配置文件:localtest — 因为 default 将具有两者的共同点。现在,如果您在src/test/resources 中放置一个具有以下内容的application.properties 文件:

    application.key: value-common-test
    

    ...一切都将保持不变,但是当您运行测试(对于任何配置文件)时,application.key 将绑定到 value-common-test。如果您碰巧只是运行该应用程序,它将被绑定到 value-common

    【讨论】:

    • 如果你在 src/test/resources 下重新定义了一个 application.yml,那么你必须从 src/main/resources/application.yml 复制文件的全部内容,然后覆盖测试的属性。如果有任何新属性出现,那么您必须在(主和测试)应用程序、yml 文件中定义它。这是正确的方法吗?
    • 您不需要重新定义所有内容,只需要重新定义您想要覆盖的那些(加上配置文件定义,这应该是相同的,以防您想利用它)。我用一个例子更新了答案。
    • 谢谢!但我想我没有明确我的观点。假设我在主 application.yml 中有一个类似“hystrix.enabled=true”的配置属性。当我进行一些集成测试并且如果在测试/资源中创建了我自己的 application.yml 时,我必须在我的测试 application.yml 中重新定义相同的属性“hystrix.enabled=true”以使我的测试正常工作。如果你有一些 bean 的创建依赖于主 application.yml (@Value(${aProperty}) 中定义的一些自定义属性的评估,那么你必须在测试 application.yml 中复制所有这些属性以使测试工作.
    • 在我的设置中,我不需要做任何这些。我只有主要的application.yaml 以及运行应用程序所需的一切——如果需要,可以通过配置文件隔离。然后,如果我需要为给定的一组属性设置不同的值来运行测试,我只需在 src/test/resources 下放置一个带有我想要覆盖的一个(或多个)值的 application.properties 文件,保留其余的(继承自application.yaml)完好无损。
    • 据我所知,如果您在src/test/resources 下有一个application.yml,那么src/main/resources 下的application.yml 根本不会被读取。我刚刚在我的项目中进行了测试。因此,我认为您不能从 src/main/resources 下的主 application.yml 继承。
    猜你喜欢
    • 2020-03-08
    • 2019-08-23
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2023-02-01
    • 2016-09-13
    • 2010-11-16
    相关资源
    最近更新 更多