在 PHP 单元测试中设置环境变量

Setting environment variables inside PHP unit tests

我正在对几年前创建的实用程序函数进行一些基本单元测试,但它涉及访问 $_SERVER 数组。

由于我的单元测试是 运行 从命令行进行的,所以我必须自己手动设置数组的值。

这在使用 GitLab Runners 时效果很好,因为在 .gitlab-ci.yml 文件上我只是做了类似的事情:

before_script:
  - export SERVER_PORT="80"
  - export SERVER_NAME="gitlab"

我的测试目前无法测试该函数的所有语句,因为它会检查 $_SERVER['SERVER_NAME'] 值。

单元测试

public function testGetEnvironment() {
    shell_exec('set SERVER_NAME="localhost"');
    $this->assertEquals("localhost", $this->util->get_environment());

    shell_exec('set SERVER_NAME="gitlab"');
    $this->assertEquals("gitlab", $this->util->get_environment());
}

注意: 我不得不使用 set,因为我在 Windows 机器上,而我们的 GitLab Runner 在 Linux 机器上所以我在 gitlab-ci.yml 文件上使用了 export

我原以为这个测试会通过,但使用 shell_exec 设置环境变量的命令似乎根本没有改变值。我仍然从 YAML 文件中定义的值中获取值。

更新

这是失败消息:

1) UtilTest::testGetEnvironment
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'localhost'
+'gitlab'

您执行的任何 shell 命令将是一个单独的进程,不会影响 运行 进程。 由于您正在对函数如何使用 $_SERVER 变量进行单元测试,因此您无需考虑如何在“真实”场景中设置它的所有麻烦 - 只需手动修改它并进行测试你的函数:

public function testGetEnvironment() {
    $_SERVER["SERVER_NAME"] = "localhost";
    $this->assertEquals("localhost", $this->util->get_environment());

    $_SERVER["SERVER_NAME"] = "gitlab";
    $this->assertEquals("gitlab", $this->util->get_environment());
}