许多应用程序在GitLab管道内的每次提交都会被自动测试。如果你的应用程序依赖于PostgreSQL这样的数据库,那么使用H2这样的内存数据库来进行测试是很有诱惑力的,因为它更容易为你的测试套件的每次执行进行设置和销毁。虽然这对简单的应用是可行的,但一旦你依赖供应商特定的SQL功能(例如,使用H2中没有的列类型),就不再可能了。
在这篇文章中,我将演示如何在GitLab管道中为Spring Boot应用程序轻松设置PostgreSQL,并提高单元和集成测试的质量。
在你的.gitlab-ci.yml中设置PostgreSQL
Gitlab允许定义(可通过网络访问的)服务,这些服务在管道执行时与你的应用程序容器相连。数据库就是这种服务的完美例子。它们被定义在.gitlab-ci.yml 文件的services: 部分。
services:
- postgres:13-alpine
postgres服务独立于各个管道作业而存在,所有的作业都可以通过网络调用来访问。
以这种方式定义的服务对你的所有作业都是自动可用的(不过你也可以在每个作业的基础上定义它们)。服务可以通过它的图像名称来访问(其中:后面的一切都被剥离)。postgres.
数据库凭证可以通过variables: 部分来定义。
variables:
POSTGRES_DB: my_database
POSTGRES_USER: bernhard
POSTGRES_PASSWORD: "somepassword"
POSTGRES_HOST_AUTH_METHOD: trust
配置你的应用程序以使用数据库
你可以像连接网络上的任何数据库一样连接到数据库。在Spring Boot中,最好的做法是通过你的application.properties 文件或直接通过环境变量来定义数据库的连接。
对于上述凭证,你的配置会是这样的。
spring.datasource.driverClassName=org.postgresql.Driver
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.url=jdbc:postgresql://postgres:5432/my_database
spring.datasource.username=bernhard
spring.datasource.password=somepassword
如上所述,你的数据库服务的主机名是postgres ,这就是为什么你的jdbc连接字符串会连接到postgres:5432 (这是PostgreSQL的默认端口)。
总结
是的,在你的单元和集成测试管道中使用真正的PostgreSQL数据库真的很容易。通过与生产中使用的数据库版本相匹配,你可以避免许多细微的错误,这些错误在依赖内存数据库时可能不明显。
