构建/对接具有数据库连接的spring Boot应用程序的最佳实践是什么?

问题描述 投票:1回答:3

我有一个春季启动应用程序,其中包含以下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}

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

因此,我想将我的问题分成两部分:

  1. gradle test一起执行的gradle build任务是否应该尝试测试数据库连接?它在默认尝试引导spring引导应用程序时会这样做 - 这就是我的gradle build任务失败的原因。不知何故,我认为这不是最佳选择 - 因为在我看来,单元测试不应该依赖于任何外部因素,例如数据库连接。
  2. 首先运行gradle build然后运行docker build是个好主意吗?或者一切都应该一气呵成?然后我至少可以在docker run上定义环境变量。但话说回来,我不想在不知道构建完好并且所有测试都已通过的情况下构建docker镜像。
hibernate docker spring-boot gradle
3个回答
1
投票

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

  1. 大多数人将单元测试视为测试代码的一种方式,而不是代码运行的环境。这是模拟等等如此受欢迎的原因之一。所以我会确保你的gradle测试任务只测试“代码”。当然,您可能想要测试数据库连接代码(而不是环境),这很奇怪,如果没有连接到数据库,这很难做到。
  2. 同样,大多数人的构建步骤输出某种包,它们部署到Docker容器中。所以我会在Docker构建之前运行你的gradle构建 - 我会包括一个“冒烟测试”步骤来确保你的应用程序启动,并且可以连接到数据库。您可能还希望运行无法重构的单元测试,此时不需要数据库。

1
投票

回答你的问题:

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

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")建立数据库连接的任何测试。

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

© www.soinside.com 2019 - 2024. All rights reserved.