将参数传递给PHPUnit

dl_*_*l__ 43 php phpunit

我开始编写PHPUnit测试,我希望测试从开发人员机器以及我们的服务器运行.开发人员的计算机设置与服务器不同,甚至彼此不同.

要在这些不同的地方运行,似乎运行测试的人必须指出它在哪里运行.然后,测试可以查找正在运行的机器的正确配置.

我想象的是:

phpunit.bat -X johns_laptop unittest.php

或者在alpha服务器上:

phpunit -X alpha unittest.php

在测试中,我将能够获得"X"(或它是什么)参数的值,并且知道,例如,应用程序根目录的路径是什么.

它看起来不像命令行允许的那样 - 或者我错过了什么?

Mar*_*sen 39

您可以使用PHPUnit的--bootstrap开关.

--bootstrap <file>       A "bootstrap" PHP file that is run before the tests.
Run Code Online (Sandbox Code Playgroud)

然后,创建一个包含变量的bootstrap.php文件:

$port = 4445;
Run Code Online (Sandbox Code Playgroud)

在测试中,您可以获取这些值:

global $port;
$this->setPort($port);
Run Code Online (Sandbox Code Playgroud)

然后运行:

phpunit --bootstrap boot.php MyTest.php
Run Code Online (Sandbox Code Playgroud)

  • @WallyLawless有时值不能被硬编码,需要作为CL参数动态发送 (4认同)
  • 我认为这个解决方案比保罗已经选择的答案更恰当地回答了原始问题.这是引导文件的确切目的. (3认同)
  • 这当然是有用的,但是却遗漏了最初的问题,即如何在命令行中传递参数。 (2认同)

Pao*_*olo 33

一种方法是检查$ argv和$ argc.就像是:

<?php

require_once 'PHPUnit/Framework/TestCase.php';

class EnvironmentTest extends PHPUnit_Framework_TestCase {
    public function testHasParam() {
            global $argv, $argc;
            $this->assertGreaterThan(2, $argc, 'No environment name passed');
            $environment = $argv[2];
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用你的phpunittest:

phpunit EnvironmentTest.php my-computer
Run Code Online (Sandbox Code Playgroud)

  • @Paolo ,`phpunit` 认为 `my-computer` 是一个测试文件并寻找 `my-computer.php`。 (3认同)
  • phpunit 也使用参数,这样你就不能使用它们 (2认同)

scr*_*ibu 15

将变量传递给引导程序文件以及测试文件的优雅方法是使用环境变量:

export MY_ENV_VAR="some value"

phpunit all
Run Code Online (Sandbox Code Playgroud)

然后,在PHP文件中,您可以像这样访问它:

getenv('MY_ENV_VAR')
Run Code Online (Sandbox Code Playgroud)

资料来源:http://blog.lysender.com/2010/10/phpunit-passing-environment-variable-to-your-application/


Vic*_*tor 6

正如 Jasir 已经提到的,单行解决方案是在 phpunit 调用之前设置环境变量。

在 Linux 上:

X=alpha phpunit unittest.php
Run Code Online (Sandbox Code Playgroud)

在 Windows 上可能:

set X=johns_laptop && phpunit.bat unittest.php
Run Code Online (Sandbox Code Playgroud)

在你的脚本中使用

getenv('X')
Run Code Online (Sandbox Code Playgroud)

读取值


Cha*_*les 5

我认为上面的答案不能解决我同样的问题。

接受的答案并不完美。这样,自定义选项应该始终放在参数列表的末尾,并且没有任何指示符表明它们是自定义选项。如果我需要的自定义选项的数量不固定,我应该编写大量代码来使用正则表达式或类似的东西来解析自定义选项。

环境变量解决方案很好,但不自然。看起来很奇怪。

VAR1=aaa VAR2=bbb VAR3=ccc ./phpunit-custom-option CustomOptionTest.php
Run Code Online (Sandbox Code Playgroud)

shell 脚本加上 setUp() 解决方案与公认的解决方案具有相同的弱点。也许您应该编写大量代码来解析文件并处理不可预测数量的自定义选项。

我认为引导脚本不是正确的解决方案。它可以用来自动处理肮脏的工作,每次都做同样的事情,但不能很好地处理更换零件。

我不喜欢以上所有答案。

我自己也没有什么好主意。但也许我所做的可以给你灵感。我在 GitHub 上分叉了 phpunit 项目,并稍微修改了代码,使其支持自定义选项功能。

在此输入图像描述

phpunit 的修改版本,可以接受如下自定义选项:

./phpuint-custom-option --custom var1=value1 --custom var2=value2 CustomOptionTest.php
Run Code Online (Sandbox Code Playgroud)

并且在测试中可以通过访问超级全局变量$_SERVER来访问自定义选项

<?php

class CustomOptionTest extends PHPUnit_Framework_TestCase {

    public function testCustomOption() {
        $this->assertEquals('value1', $_SERVER['var1']);
        $this->assertEquals('value2', $_SERVER['var2']);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到我的代码,并在此处下载修改后的版本(通过单击页面上的“查看完整文件”链接)。

供参考。本文是类似的解决方案。