将参数传递给PHPUnit

时间:2010-01-19 16:19:59

标签: php phpunit

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

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

我想象的是:

  

phpunit.bat -X johns_laptop unittest.php

或在alpha服务器上:

  

phpunit -X alpha unittest.php

在测试中,我可以获得“X”(或者不管它是什么)参数的值,并且知道,例如,应用程序根目录的路径是什么。

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

10 个答案:

答案 0 :(得分:38)

你可以使用PHPUnit的--bootstrap开关。

--bootstrap <file>       A "bootstrap" PHP file that is run before the tests.

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

$port = 4445;

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

global $port;
$this->setPort($port);

然后运行:

phpunit --bootstrap boot.php MyTest.php

答案 1 :(得分:32)

一种方法是检查$ 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];
    }
}

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

phpunit EnvironmentTest.php my-computer

答案 2 :(得分:14)

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

export MY_ENV_VAR="some value"

phpunit all

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

getenv('MY_ENV_VAR')

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

答案 3 :(得分:4)

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

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

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

VAR1=aaa VAR2=bbb VAR3=ccc ./phpunit-custom-option CustomOptionTest.php

shell脚本加上setUp()解决方案与接受的弱点共享相同的弱点。也许你应该编写很多代码来解析文件并处理不可预测数量的自定义选项。

我不认为引导脚本是正确的解决方案。它可以用来自动处理脏工作,每次做同样的事情,但没有好处理变更部件。

我不喜欢上述所有答案。

我也不知道自己。但也许我所做的可以给你灵感。我已经在GitHub上分配了phpunit项目,并修改了一些代码,并使其支持自定义选项功能。

enter image description here

phpunit的修改版本可以接受这样的自定义选项:

./phpuint-custom-option --custom var1=value1 --custom var2=value2 CustomOptionTest.php

在测试中,您可以通过访问超级全局变量$ _SERVER

来访问自定义选项
<?php

class CustomOptionTest extends PHPUnit_Framework_TestCase {

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

您可以找到我的代码here,并下载修改后的版本here(点击&#34;查看完整文件&#34;页面上的链接)。

FYI。 this article是类似的解决方案。

答案 4 :(得分:3)

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

在Linux上:

X=alpha phpunit unittest.php

在Windows上可能:

set X=johns_laptop && phpunit.bat unittest.php

在你的脚本中使用

getenv('X')

读取值

答案 5 :(得分:2)

此处的所有解决方案都适用于该问题,但对于某些情况,还有另一种方法可能更简单。 Phing将采用-Dargument=value

形式传递的参数

所以使用 phing -Dtest=MyTest.class.php

然后您可以使用phing条件来处理这些参数:

<if>
    <isset property="test" />
    <then>
        <property name="testFile" value="${test}" />
    </then>
    <else>
        <property name="testFile" value="AllTests.php" />
    </else>
</if>
<exec command="phpunit --bootstrap myTestFile/bootstrap.php- myTestFolder/${testFile}"
      passthru="true" returnproperty="phpunitreturn" />

答案 6 :(得分:1)

我在解决这个问题时遇到了困难,并提出了一种非常方便的解决方案:我将参数写入磁盘上的文件并使用setUp()方法检索它们:

public function setUp() {
    $this->setBrowser('firefox');
    $this->base_url = file_get_contents("selenium_host");
    $this->setBrowserUrl($this->base_url);
}

我没有直接调用phpunitparatest,而是使用shell脚本来启动测试。这个调用paratest,让我指定进程的数量以及我想要运行的测试的主机。

<强> run_all_tests.sh

if [ $1 ] 
then
    threads=$1
else
    threads=5
fi
if [ $2 ]
then
    echo $2 > selenium_host
else
    echo 'http://defaulthost.com' > selenium_host
fi

vendor/bin/paratest -p$threads -f --colors TestSuite.php

然后,针对http://adifferenthost.com运行7个主题:

./run_all_tests.sh 7 'http://adifferenthost.com'

答案 7 :(得分:1)

如果要改变每次测试运行的测试参数,在命令行上传递参数是有意义的。在不同的计算机上运行特定于主机的测试不是此解决方案的最佳理由。

为此,PHPUnit configuration file可能更合适。它使您可以控制主机甚至特定于请求的变量,包括操作php.ini设置以及定义常量,全局变量,$_ENV$_SERVER,甚至$_GET$_POST等等。这都是在配置文件的<php>节点下完成的,请参阅Setting PHP INI settings, Constants and Global Variables

Symfony2使用此方法,并为您的单元测试提供phpunit.xml.dist(默认配置)和phpunit.xml。后者被gitignored允许您为每台机器自定义它而不影响回购。然后,您将使用以下命令运行测试:

phpunit -c /path/to/phpunit.xml

答案 8 :(得分:0)

如果您想在远程计算机上运行测试,请使用ssh然后运行它。在语言环境机器上你只需要cd到root目录,然后运行phpunit。

user@local:/path/to/your/project$ phpunit
user@remote:/var/www/project$ phpunit

编辑:您正在谈论与机器相关的配置。 (什么样的conf btw?)我的解决方案是将这些配置放在相同的,而不是版本控制的地方,然后在所需的设置方法中读取/解析它的运行时间。

答案 9 :(得分:0)

不需要环境变量或特殊脚本。您可以使用 -d 选项设置 php.ini 值。

<?php // tests/IniTest.php
use PHPUnit\Framework\TestCase;

class IniTest extends TestCase
{
  public $server;

  public function setUp(): void
  {
    $this->server = ini_get('my.custom.server') ?: '127.0.0.1'; // fallback
  }

  public function testDummy()
  {
    $this->assertIsString($this->server);
  }
}

像这样执行代码:

vendor/bin/phpunit -d my.custom.server=192.168.1.15 tests/IniTest.php

设置自定义 php.ini 值有效。例如,您可以使用 pdo.dsn.* 配置 PDO 连接别名https://www.php.net/manual/en/pdo.construct.php