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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:53:12