Bitbucket Pipeline中PHPUnit单元测试报PDO认证方法未知错误求助
解决Bitbucket Pipeline中PHPUnit测试遇到的MySQL认证错误
Hey Jacobo, I see you're hitting a MySQL authentication issue in Bitbucket Pipeline even though your local tests pass—let's figure this out step by step.
首先,定位问题根源
虽然你的测试代码看起来都是调用外部API服务,但那个PDOException说明你的Laravel测试环境在Pipeline里尝试连接MySQL数据库。新版MySQL(8.0+)默认使用caching_sha2_password认证方式,而PHP的PDO驱动(尤其是旧版本PHP对应的驱动)不支持这个认证协议,直接导致连接失败。
本地测试没问题的原因大概率是你本地的MySQL是5.x版本(默认用mysql_native_password),或者你已经手动修改过本地MySQL的认证方式,所以没有触发这个错误。
解决方案:修改Bitbucket Pipeline的MySQL服务配置
你需要在bitbucket-pipelines.yml里配置MySQL服务时,强制它使用旧的认证方式,让PHP的PDO能正常连接。
示例的bitbucket-pipelines.yml配置:
image: php:7.4-fpm # 替换成你项目实际使用的PHP版本 pipelines: default: - step: services: - mysql script: - composer install --no-dev --optimize-autoloader - cp .env.testing .env - php artisan config:clear - php artisan test # 执行PHPUnit测试 definitions: services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: your_test_db MYSQL_USER: test_user MYSQL_PASSWORD: test_password command: --default-authentication-plugin=mysql_native_password # 关键配置项
额外检查:Laravel测试环境的数据库配置
确保你的.env.testing文件(或者在Pipeline中设置的环境变量)的数据库连接信息和上面的MySQL服务配置完全匹配:
DB_CONNECTION=mysql DB_HOST=mysql # Pipeline里的服务名就是容器的主机名 DB_PORT=3306 DB_DATABASE=your_test_db DB_USERNAME=test_user DB_PASSWORD=test_password
顺便提一下测试代码里的小问题(虽然不是本次错误的原因)
我扫了一眼你的代码,发现几个变量名拼写错误,可能会导致后续测试失败:
testDumies方法里,你用$games = DummyService::getDummies();但断言用的是count($dummies),变量名不匹配DummyService::getDummies()里,你把API返回值赋值给$games,但循环的是$dummies,变量名错误getDummiesOfUserInUrl里,$dummies = $data['dummiess'];多了一个s,会触发数组索引不存在的错误
这些小问题本地可能没暴露(比如你用了Mock或者API返回结构刚好兼容),但建议修正后再测试哦。
内容的提问来源于stack exchange,提问作者Jacobo
相关产品推荐
相关产品推荐

