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

如何解决GitHub Action中Spring Boot单元测试PostgreSQL失败问题

解决Spring Boot单元测试在GitHub Actions中PostgreSQL连接失败问题

问题根源

GitHub Actions的Ubuntu运行环境默认未启动PostgreSQL服务,而你的单元测试依赖真实PostgreSQL数据库,导致连接失败。

解决方案

1. 在CI工作流中添加PostgreSQL服务

在你的ci.yaml的default job下添加services配置,启动PostgreSQL容器并设置必要的环境变量:

jobs:
  default:
    runs-on: ubuntu-latest
    # 新增PostgreSQL服务配置
    services:
      postgres:
        image: postgres:14
        env:
          POSTGRES_USER: testuser
          POSTGRES_PASSWORD: testpass
          POSTGRES_DB: testdb
        ports:
          - 5432:5432
        # 等待数据库启动就绪
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    steps:
      # 原有步骤保持不变,新增环境变量覆盖数据库配置
      - uses: actions/checkout@v3
      - name: Set up JDK
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
      # 新增步骤:设置数据库连接环境变量,供Spring Boot测试读取
      - name: Set database environment variables
        run: |
          echo "SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/testdb" >> $GITHUB_ENV
          echo "SPRING_DATASOURCE_USERNAME=testuser" >> $GITHUB_ENV
          echo "SPRING_DATASOURCE_PASSWORD=testpass" >> $GITHUB_ENV
      - name: Build with Maven
        run: mvn -B package --file pom.xml
      # 其余步骤不变
      - name: Update dependency graph
        uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6
      - name: Build Jar file
        run: ./project-dev build-jar
      - name: Save Jar file
        uses: actions/upload-artifact@v3
        with:
          name: demo-0.0.1-SNAPSHOT
          path: target/demo-0.0.1-SNAPSHOT.jar
          retention-days: 1

2. 验证测试配置兼容性

确保你的Spring Boot测试配置(如application-test.properties)支持通过环境变量覆盖数据库连接参数,或者直接使用上述环境变量对应的配置项。如果使用了测试专用的配置文件,可将其中的数据库连接参数改为:

spring.datasource.url=${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/testdb}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME:testuser}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:testpass}

3. 可选:改用嵌入式数据库进行单元测试

如果单元测试不需要依赖真实PostgreSQL,可以改用H2嵌入式数据库,避免在CI中配置外部数据库。只需在pom.xml中添加H2依赖,并创建application-test.properties配置H2连接:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:55:42