You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI中Quarkus单元与集成测试执行失败问题排查

GitLab CI中Quarkus单元测试与集成测试数据库连接问题解决

问题核心

本地执行export QUARKUS_PROFILE=test && ./mvnw verify能正常跑单元测试(@QuarkusTest)和集成测试(@QuarkusIntegrationTest),但GitLab CI里出现:

  • 单独跑单元测试成功
  • 跑集成测试时,单元测试报数据库连接拒绝
  • 禁用单元测试后,集成测试用指定的QUARKUS_DATASOURCE_REACTIVE_URL能正常运行

本质是CI容器的网络环境和本地不同,DevServices自动管理的PostgreSQL在CI里无法被单元测试的默认URL访问,且同时运行两类测试时存在配置/资源冲突。

解决方案

1. 给CI环境单独做测试配置文件

在项目里新增src/main/resources/application-test-ci.properties,专门适配CI环境的DevServices配置:

# 强制启用DevServices
quarkus.datasource.devservices.enabled=true
# 指定PostgreSQL镜像版本,避免CI环境拉取镜像出问题
quarkus.datasource.devservices.image-name=postgres:15
# CI容器网络可能需要主机模式,确保单元测试能访问到数据库容器
quarkus.datasource.devservices.network=host
# 可选:固定端口,避免CI环境端口占用冲突
quarkus.datasource.devservices.port=5432

然后在GitLab CI的job命令里指定用这个profile:

export QUARKUS_PROFILE=test-ci && ./mvnw verify

2. 拆分单元测试和集成测试为独立CI任务

既然单独跑两类测试都能成功,直接在CI里分成两个job:

  • 单元测试job:
    ./mvnw test -Dquarkus.profile=test
    
  • 集成测试job:
    ./mvnw verify -DskipTests -Dquarkus.profile=test
    

这样两个任务各自启动DevServices或使用指定的数据库配置,不会互相干扰。

3. 强制DevServices为单元测试注入正确的连接地址

修改application-test.properties,让CI环境里的单元测试能拿到正确的数据库URL:

# 让DevServices自动生成的URL能被CI容器内部访问
quarkus.datasource.devservices.container-env=POSTGRES_HOST=0.0.0.0
# 禁用DevServices的自动端口映射限制
quarkus.datasource.devservices.random-port=false

确保单元测试使用的是DevServices自动注入的quarkus.datasource.reactive.url,而不是硬编码的localhost地址。

4. 给集成测试单独配置数据源

在application-test.properties里通过profile分段,让单元测试用DevServices,集成测试用指定的URL:

# 单元测试用DevServices
%test.quarkus.datasource.devservices.enabled=true
# 集成测试阶段覆盖数据源配置
%test.quarkus.integration-test.datasource.reactive.url=${QUARKUS_DATASOURCE_REACTIVE_URL}
%test.quarkus.integration-test.datasource.devservices.enabled=false

这样同时运行两类测试时,单元测试用DevServices的数据库,集成测试用指定的URL,不会互相覆盖配置。

内容的提问来源于stack exchange,提问作者mingan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:00:53