将parameter passing给PHPUnit

我开始编写PHPUnittesting,我希望testing可以从开发者机器以及从我们的服务器运行。 开发人员机器的设置与服务器不同,甚至不同。

运行在这些不同的地方似乎是运行testing的人将不得不指出它在哪里运行。 testing可以查找正在运行的机器的正确configuration。

我想象的是这样的:

phpunit.bat -X johns_laptop unittest.php

或在alpha服务器上:

phpunit -X alpha unittest.php

在testing中,我将能够得到的值,如果'X'(或不pipe它是什么)参数,并知道,例如,这个机器的应用程序根的path是什么。

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

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

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

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

然后,制作一个包含variables的bootstrap.php文件:

 $port = 4445; 

在你的testing中,你可以获取这些值:

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

然后运行:

 phpunit --bootstrap boot.php MyTest.php 

将variables传递给引导文件以及testing文件的一种优雅方式是使用环境variables:

 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/

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

接受的答案并不完美。 通过这种方式,自定义选项应该始终放在参数列表的末尾,并且没有指示器表明它们是自定义选项。 如果我需要的自定义选项的数量不是固定的,我应该编写大量的parsing自定义选项与正则expression式或类似的东西。

环境variables解决scheme是好的,但不自然。 看起来很奇怪。

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

shell脚本和setUp()解决scheme与接受的方法共享同样的弱点。 也许你应该编码很多来parsing文件和处理不可预知的数量的自定义选项。

我不认为引导脚本是正确的解决scheme。 它可以用来自动处理肮脏的作品,每次做同样的事情,但不处理好零件的变化。

我不喜欢所有上述的答案。

我自己也没有好主意。 但也许我所做的可以给你灵感。 我已经分叉了GitHub的phpunit项目,并修改了一些代码,并支持自定义选项function。

在这里输入图像说明

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

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

在testing中,您可以通过访问超级全局variables$ _SERVER来访问自定义选项

 <?php class CustomOptionTest extends PHPUnit_Framework_TestCase { public function testCustomOption() { $this->assertEquals('value1', $_SERVER['var1']); $this->assertEquals('value2', $_SERVER['var2']); } } 

你可以在这里find我的代码,并在这里下载修改后的版本(点击页面上的“查看完整文件”链接)。

仅供参考。 这篇文章是类似的解决scheme。

这里所有的解决scheme对于这个问题都是有效的,但是对于某些情况还有另一种方法可能更简单。 Phing将采用以-Dargument=valueforms-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" /> 

我努力解决了这个问题,并提出了一种方便而又方便的解决scheme:我将参数写入磁盘上的文件,并在setUp()方法中检索它们:

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

而不是直接调用phpunitphpunit ,我有一个shell脚本来启动testing。 这一个调用paratest ,让我指定进程的数量,以及我想testing运行的主机。

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 

然后,运行7个线程http://adifferenthost.com

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

如果要在每次testing运行中更改testing参数,则在命令行上传递参数是有意义的。 在不同的机器上运行主机特定的testing并不是解决scheme的最佳理由。

为此, PHPUnitconfiguration文件可能被certificate是更合适的。 它可以控制主机甚至特定于请求的variables,包括操作php.ini设置以及定义常量,全局variables, $_ENV$_SERVER ,甚至$_GET$_POST等等。configuration文件的<php>节点,请参阅设置PHP INI设置,常量和全局variables

Symfony2使用这种方法,并提供一个phpunit.xml.dist (默认configuration)和一个phpunit.xml与你的unit testing。 后者是gitignored允许您为每台机器定制它,而不影响回购。 然后你将运行你的testing:

 phpunit -c /path/to/phpunit.xml 

如果您想在远程机器上运行testing,请使用ssh然后运行它。 在本地机器上,你只需要cd到你的根目录,然后运行phpunit。

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

编辑 :你正在谈论一个机器相关的configuration。 (什么样的conf btw?)我的解决scheme是把这些configuration在相同的,不受版本控制的地方,然后读取/parsing运行时,在所需的设置方法例如。

正如Jasir已经提到的,一行解决scheme是在phpunit调用之前设置环境variables。

在Linux上:

 X=alpha phpunit unittest.php 

在Windows上可能:

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

并在脚本内使用

 getenv('X') 

阅读价值