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
相关产品推荐
相关产品推荐

