【问题标题】:How to inject an env variable just for certain testsuite using phpunit?如何使用 phpunit 为某些测试套件注入环境变量?
【发布时间】:2016-05-23 11:43:19
【问题描述】:

phpunit.xml 中可以定义环境变量:

<php>
    <env name="ENVIRONMENT" value="test"/>
    <env name="FOO" value="BAR"/>
</php>

现在,我想拥有多个测试套件,而不仅仅是一个。我喜欢为每个 FOO 设置不同的值,所以我想我可以这样做:

<testsuites>
    <testsuite name="First">
        <directory>unit</directory>
        <directory>Functional</directory>
        <php>
            <env name="FOO" value="NARF"/>
        </php>
    </testsuite>
    <testsuite name="Second">
        <directory>unit</directory>
        <directory>Functional</directory>
        <php>
            <env name="FOO" value="NARF"/>
        </php>
    </testsuite>
</testsuites>

It doesn't seem possible to nest php inside testsuite block。所以我目前被困在为某个测试套件注入一个特定的变量。

我看到的唯一另一个明确的选项是为每个案例定义多个 phpunit.xml 文件,但这会导致我想避免大量代码重复。

是否有另一种方法可以将环境变量注入 phpunit 测试套件?

【问题讨论】:

    标签: php unit-testing phpunit environment-variables


    【解决方案1】:

    您可以使用包phpunit-globals 来修改特定测试类或方法的$_ENV(和$_SERVER)变量。

    将其安装为开发依赖项:

    composer require --dev zalas/phpunit-globals
    

    之后,您可以:

    /**
     * @env FOO=bar
     */
    class ExampleTest extends TestCase
    {
        /**
         * @env APP_ENV=foo
         */
        public function test_global_variables()
        {
            $this->assertSame('bar', $_ENV['FOO']);
            $this->assertSame('foo', $_ENV['APP_ENV']);
        }
    }
    

    【讨论】:

    • 不幸的是,这需要注释套件中的每个测试。这可以通过测试中的 beforeClass 钩子轻松完成,无需任何扩展。问题是寻找一种解决方案,每个套件只需设置一次。
    【解决方案2】:

    phpunit.xml 中定义的环境变量是默认值。您也可以从 shell 传递它们:

    FOO=bar phpunit
    

    这对您帮助不大,因为您需要单独运行测试套件,将环境变量传递给每次运行。

    我认为一个不错的选择是为每个测试套件(FOO_FIRST、FOO_SECOND 等)以不同的方式调用这些变量。

    【讨论】:

      【解决方案3】:

      这是一个老问题,但是使用当前版本的 PHPUnit(8+),您可以在测试中设置环境变量而不会出现问题。因此,您可以拥有一个具有相同测试和不同环境的数据提供者的测试套件,而不是拥有多个具有相同测试和不同环境的测试套件——例如像这样。

      class ExampleTest extends TestCase
          public function envValueProvider(): array
          {
              return [
                  [
                      'foo',
                  ],
                  [
                      'bar',
                  ],
              ];
          }
      
          /**
           * @dataProvider envValueProvider
           */
          public function testSomeCode(string $value): void
          {
              putenv('FOO=' . $value);
              somecode();
              self::assertSomething();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-19
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        相关资源
        最近更新 更多