构建/泊坞具有数据库连接的springBoot应用程序的最佳实践是什么?

时间:2018-09-11 08:07:53

标签: hibernate docker spring-boot gradle

我有一个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 image,但在此之前我运行gradle build任务-当然失败了,因为它无法在环境变量中找到USERNAMEPASSWORD

因此,我想将问题分为两个部分:

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

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

3 个答案:

答案 0 :(得分:1)

回答您的问题:

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

答案 1 :(得分:1)

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

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

要实现这一目标,您可以将HSQLDB之类的内存数据库添加到项目中作为测试依赖项:

testCompile("org.hsqldb:hsqldb")

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

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

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

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

答案 2 :(得分:1)

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

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

  2. 同样,大多数人的构建步骤都会输出某种程序包,并将其部署到Docker容器中。因此,我将在Docker构建之前运行gradle构建-并且将包括“烟雾测试”步骤,以确保您的应用程序启动并可以连接到数据库。您可能还需要运行无法重构的单元测试,以使其此时不需要数据库。