代码之家  ›  专栏  ›  技术社区  ›  dokgu

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

  •  3
  • dokgu  · 技术社区  · 6 年前

    我正在对我多年前做的一个实用函数做一些基本的单元测试,但是它涉及到访问 $_SERVER 数组。

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

    使用Gitlab跑步者效果很好,因为 .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运行程序在Linux机器上,所以我使用 export gitlab-ci.yml 文件。

    我本来希望通过此测试,但似乎是使用命令设置环境变量 shell_exec 根本不会改变价值。我仍然从yaml文件中定义的内容中获取值。

    更新

    以下是失败消息:

    1) UtilTest::testGetEnvironment
    Failed asserting that two strings are equal.
    --- Expected
    +++ Actual
    @@ @@
    -'localhost'
    +'gitlab'
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Mureinik    6 年前

    执行的任何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());
    }