如何解决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
相关产品推荐
相关产品推荐

