【问题标题】:What's the best practise of building/dockerizing springBoot application which has a database connection?构建/dockerizing具有数据库连接的spring Boot应用程序的最佳实践是什么?
【发布时间】:2019-02-15 16:38:57
【问题描述】:

我有一个 Spring Boot 应用程序,它具有以下 application.properties:

spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@ldap:something
spring.datasource.username=${USERNAME}
spring.datasource.password=${PASSWORD}

如您所见,它取决于一些环境变量。我的最终目的地是 docker 映像,但在此之前我运行 gradle build 任务 - 当然它失败了,因为它在环境变量中找不到 USERNAMEPASSWORD

因此,我想将我的问题一分为二:

  1. gradle build 一起执行的gradle test 任务是否应该尝试测试数据库连接?它在尝试引导 Spring Boot 应用程序时默认执行此操作 - 这就是我的 gradle build 任务失败的原因。不知何故,我认为这不是最佳选择 - 因为在我看来,单元测试不应依赖于任何外部因素,例如数据库连接。

  2. 先运行gradle build 然后运行docker build 是不是一个好主意?还是应该一口气完成所有事情?然后我至少可以在docker run 上定义环境变量。但是话又说回来,我不想在不知道构建正常并且所有测试都已通过的情况下构建 docker 映像。

【问题讨论】:

    标签: hibernate docker spring-boot gradle


    【解决方案1】:

    “这是个好主意”的问题很难回答,但我会尝试...

    1. 大多数人将单元测试视为测试代码的一种方式,而不是代码运行的环境。这就是模拟等如此受欢迎的原因之一。所以我会确保你的 gradle 测试任务只测试“代码”。 当然,您可能想要测试您的数据库连接代码(而不是环境),这很奇怪,如果不连接到数据库就很难做到。

    2. 同样,大多数人都会在构建步骤中输出某种包,然后将其部署到 Docker 容器中。所以我会在 Docker 构建之前运行你的 gradle 构建——我会包括一个“冒烟测试”步骤来确保你的应用程序启动,并且可以连接到数据库。您可能还想运行目前无法重构为不需要数据库的单元测试。

    【讨论】:

      【解决方案2】:

      回答您的问题:

      1. 以我的拙见,一般来说gradle test应该在gradle build之后执行。除非您的数据库测试是其中一项测试,如果您只使用它来收集测试信息,我会在数据库检查后执行gradle test
      2. 是的,这样做是个好主意:
        • 首先,docker build
        • 第二,docker run -e USERNAME=XXXX -e PASSWORD=XXXX...
        • 第三,gradle build 在 docker 内。

      【讨论】:

      • 1.所以你建议先通过排除测试任务来构建它,比如gradle build -x test?然后,当我在一个可以访问数据库并且所有环境变量(凭据)都到位的环境中时,执行测试部分?
      • 2.但是如果我想建立一个合适的 CI/CD 管道呢?不是应该假设已经构建的 docker 镜像是正确的吗?因为如果我先构建它,然后在其中进行测试,结果证明测试失败,我必须将其删除。或者它完全没问题,如果出现问题,我只是用更新的代码构建另一个图像?
      • 1.是的,我会试试的
      【解决方案3】:

      首先,您应该问自己是否真的需要引导整个应用程序进行测试。如果您有一个测试来检查某些方法是否为不需要数据库调用的给定输入生成正确的输出,那么您可能不需要它。

      即使测试需要数据库连接,您也应该问自己它是否应该是实际的数据库。如果您依赖单独的数据库进行测试,这也意味着如果对数据库进行任何维护,您的整个构建过程都会失败。出于测试目的使用单独的内存数据库可能是一个更好的主意。

      为此,您可以将 HSQLDB 等内存数据库作为测试依赖项添加到您的项目中:

      testCompile("org.hsqldb:hsqldb")
      

      之后,您可以提供一个单独的application-test.properties 文件:

      spring.datasource.url=jdbc:hsqldb:mem
      spring.datasource.username=user
      spring.datasource.password=pass
      

      现在您可以使用 @ActiveProfiles("test") 注释任何需要数据库连接的测试。

      即使您不喜欢将内存数据库用于测试目的,您仍然可以使用使用多个配置文件的方法来使用不同的数据库配置进行测试(例如,硬编码连接 + 用户名/密码)数据库)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 2016-04-06
        • 2022-01-07
        • 1970-01-01
        • 2021-03-03
        • 2010-10-12
        • 2011-03-16
        相关资源
        最近更新 更多