为什么phpunit没有得到phpunit.xml中指定的正确的APP_ENV?

koa*_*aok 7 xml phpunit laravel docker

我正在使用Laravel,这是我的./phpunit.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="FeatureTests">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>

        <testsuite name="UnitTests">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="DB_CONNECTION" value="sqlite_testing" />
    </php>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

我用以下命令触发了我的一个测试套件:

./vendor/phpunit/phpunit/phpunit --testsuite UnitTests
Run Code Online (Sandbox Code Playgroud)

在我的测试方法中,我有:

public function testAllMandatoryData()
{
   dump(env('APP_ENV'));
   ....
}
Run Code Online (Sandbox Code Playgroud)

它正在显示"本地",我期待phpunit.xml中指定的"测试"

         <env name="APP_ENV" value="testing"/>
Run Code Online (Sandbox Code Playgroud)

编辑:其他详细信息 我在Docker容器中运行此laravel应用程序

在docker-compose.yml上我设置了一些环境变量,如:

environment:
  - APP_ENV=local
  - DB_HOST=192.168.0.22
  - DB_PORT=33306
  - DB_DATABASE=mydatabase
  - DB_USERNAME=homestead
  - DB_PASSWORD=homestead
Run Code Online (Sandbox Code Playgroud)

我注意到的是phpunit.xml中的指令如下:

    <env name="APP_ENV" value="testing"/>
Run Code Online (Sandbox Code Playgroud)

当docker-compose中的名字已经存在时没有效果.

相反,如果我添加一些未在docker-compose.yml中定义的将在phpunit运行时正确设置,如:

    <env name="DB_CONNECTION" value="sqlite_test"/>
Run Code Online (Sandbox Code Playgroud)

结束编辑

我错过了什么?

谢谢

koa*_*aok 7

我尝试用我找到的最佳选择回答自己.

如果在docker-compose.yml文件中设置ENV变量,则无法使用phpunit.xml指令覆盖它们,例如:

  <env name="APP_ENV" value="testing"/>
Run Code Online (Sandbox Code Playgroud)

然后你应该选择从docker-compose.yml中删除(如本例所示)APP_ENV变量集

并依赖.env Laravel文件

APP_ENV=local
Run Code Online (Sandbox Code Playgroud)

通过此设置,phpunit将能够覆盖APP_ENV以"测试"

对于所有docker agent版本,我仍然不能100%确定需要这种安排.我与另一个Docker版本的另一个主机表现不同.


psc*_*eit 7

使用

<env name="APP_ENV" value="testing" force="true"/>
<env name="CACHE_DRIVER" value="array" force="true"/>
<env name="SESSION_DRIVER" value="array" force="true"/>
<env name="QUEUE_DRIVER" value="sync" force="true"/>
<env name="DB_CONNECTION" value="sqlite_testing" force="true"/>
Run Code Online (Sandbox Code Playgroud)

如果没有force参数,它将无法正常工作。看到这个问题:https : //github.com/sebastianbergmann/phpunit/issues/2353 和合并的PR:https : //github.com/sebastianbergmann/phpunit/pull/2723

  • @koalaok 这应该是选择的答案,这样您仍然可以在 docker-compose 文件中使用这些环境参数 (2认同)

Don*_*nic 5

使用config('app.env')来代替。 env()值可能会被缓存,在这种情况下php artisan config:clear可能会有所帮助,尽管我在env从命令行环境访问值时也遇到了问题。

更多信息在这里这里

  • 仅供参考:这将是 config('app.env');。config 函数使用点表示法。config('APP_ENV') 将始终为空。 (2认同)