本地正常的JUnit测试在GitHub Actions中因MySQL连接失败报错
解决GitHub Actions中Spring Boot JUnit测试MySQL连接被拒绝的问题
1. 确保GitHub Actions工作流中启动MySQL服务
在你的Workflow配置文件(如.github/workflows/ci.yml)里,必须通过services字段启动MySQL容器,示例配置如下:
jobs: build: runs-on: ubuntu-latest services: mysql: image: mysql:8.0 env: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: test_db MYSQL_USER: test_user MYSQL_PASSWORD: test_pass ports: - 3306:3306 options: >- --health-cmd="mysqladmin ping -h localhost" --health-interval=10s --health-timeout=5s --health-retries=3
注意事项:
- 镜像版本尽量和本地测试用的MySQL版本保持一致,避免兼容性问题
ports映射要保证容器内3306端口映射到GitHub Runner主机的3306端口- 配置
healthcheck是为了确保MySQL服务完全就绪后再执行测试,避免因服务未启动完成导致连接失败
2. 核对测试环境的数据库连接配置
在Spring Boot的application-test.properties或application-test.yml中,连接参数必须和Workflow里的MySQL服务配置完全匹配:
spring.datasource.url=jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC spring.datasource.username=test_user spring.datasource.password=test_pass spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
关键细节:
- 主机地址必须设为
localhost,因为GitHub Runner中的MySQL服务是本地容器 - 数据库名、用户名、密码要和Workflow的
env配置完全一致 - 添加
useSSL=false规避SSL连接问题,serverTimezone=UTC解决时区不匹配导致的异常
3. 确认测试类的配置正确性
确保你的测试类正确加载测试环境配置,比如添加@ActiveProfiles("test")注解:
@SpringBootTest @ActiveProfiles("test") public class YourServiceTest { // 测试代码逻辑 }
如果使用@DataJpaTest等切片注解,也要保证它能正确读取测试数据源配置。
4. 排查依赖兼容性问题
检查pom.xml中MySQL驱动版本与Workflow使用的MySQL镜像版本是否兼容:
- MySQL 8.0+需搭配
mysql-connector-java8.0.x版本,驱动类为com.mysql.cj.jdbc.Driver - MySQL 5.7及以下版本可使用
mysql-connector-java5.1.x版本,驱动类为com.mysql.jdbc.Driver
5. 查看GitHub Actions详细日志定位问题
若以上步骤都配置正确,查看GitHub Actions日志中MySQL服务的启动记录,确认:
- MySQL容器是否成功启动
- 是否存在数据库初始化错误
- 测试代码是否正确读取了连接参数
内容的提问来源于stack exchange,提问作者Benamor Omar
相关产品推荐
相关产品推荐

