GitLab CI Runner运行Symfony测试时意外使用DEV环境问题
Symfony 5.4 GitLab Runner中PHPUnit测试异常访问Dev环境Sessions表的问题解决
问题背景
在GitLab Runner中运行Symfony 5.4应用的PHPUnit测试时,已通过.gitlab-ci.yml设置APP_ENV=test,phpunit.xml.dist也配置了test环境,且测试环境框架配置指定session.storage.mock_file作为会话存储,但测试仍尝试访问Dev环境的sessions表(测试数据库无该表),导致测试失败,疑似Runner以Dev模式运行。
当前配置信息
.gitlab-ci.yml 配置
phpunit: stage: test image: php:8.2-alpine variables: APP_ENV: test before_script: - echo "@community http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories - apk update - apk add --no-cache git unzip icu icu-dev zlib-dev postgresql-dev - docker-php-ext-install intl pdo pdo_pgsql - cp app/config/parameters.yml.dist app/config/parameters.yml - curl -sS https://getcomposer.org/installer | php - mv composer.phar /usr/local/bin/composer - composer validate - composer check-platform-reqs - composer install - composer outdated - composer dump-autoload --optimize script: - bin/console --env=test doctrine:schema:drop --force - bin/console --env=test doctrine:schema:create - bin/console lint:container - bin/console lint:twig @AppBundle - bin/console lint:yaml @AppBundle - bin/console about - APP_ENV=test bin/console debug:config framework - APP_ENV=test bin/phpunit
phpunit.xml.dist 相关配置
<php> <env name="APP_ENV" value="test"/> <!-- the value is the FQCN of the application kernel --> <env name="KERNEL_CLASS" value="AppKernel"/> </php>
测试环境框架配置(config/packages/test/framework.yaml)
framework: test: ~ session: storage_id: session.storage.mock_file profiler: collect: false
排查与解决步骤
1. 验证PHPUnit环境变量加载情况
在测试用例中添加调试代码,输出当前环境变量,确认PHPUnit是否读取到test环境:
// 在任意测试用例的setUp方法中添加 public function setUp(): void { parent::setUp(); var_dump($_ENV['APP_ENV'], $_SERVER['APP_ENV']); die; }
或者在GitLab CI的script阶段添加命令:
APP_ENV=test bin/phpunit --version -v
观察输出是否包含test环境相关标识。
2. 检查数据库配置隔离性
- 确认
parameters.yml.dist中是否包含Dev环境的数据库连接配置,若有,需为测试环境单独配置数据库:
在config/packages/test/doctrine.yaml中添加测试环境专属数据库配置:
同时在doctrine: dbal: url: '%env(resolve:DATABASE_URL_TEST)%'.env.test文件中设置DATABASE_URL_TEST指向测试数据库,确保Runner能正确读取该变量。 - 检查
bin/console --env=test doctrine:schema:create执行后,测试数据库是否生成了正确的表结构,确认无sessions表(因为使用mock存储)。
3. 验证Session配置是否生效
在GitLab CI的script阶段执行以下命令,查看test环境的session配置:
APP_ENV=test bin/console debug:config framework session
确认输出的storage_id为session.storage.mock_file。若不是,检查是否有其他配置文件(如config/packages/framework.yaml)中的session配置未在test环境被覆盖。
4. 强制清理测试环境缓存
缓存可能导致旧配置残留,在script阶段添加缓存清理命令:
APP_ENV=test bin/console cache:clear
确保执行PHPUnit前,测试环境缓存已完全刷新。
5. 检查Kernel配置加载逻辑
确认AppKernel类的registerContainerConfiguration方法是否正确加载test环境的配置文件:
protected function registerContainerConfiguration(LoaderInterface $loader) { // 确保包含test环境配置文件的加载逻辑 $loader->load($this->getProjectDir().'/config/packages/test/**/*.yaml'); // 其他环境配置加载代码... }
若加载逻辑缺失,需补充以确保test环境配置被正确读取。
6. 强制指定环境变量执行PHPUnit
在执行PHPUnit时,同时指定APP_DEBUG=0避免调试模式干扰:
APP_ENV=test APP_DEBUG=0 bin/phpunit
内容的提问来源于stack exchange,提问作者crmpicco
相关产品推荐
相关产品推荐

