php-将参数传递给PHPUnit
我开始编写PHPUnit测试,并且希望这些测试可以在开发人员的机器以及我们的服务器上运行。 开发人员计算机的设置与服务器不同,甚至彼此不同。
要在这些不同的地方运行,似乎必须由运行该测试的人员来指明要在哪里运行。 然后,测试可以查找正在运行的计算机的正确配置。
我在想类似的东西:
phpunit.bat -X johns_laptop unittest.php
或在Alpha服务器上:
phpunit -X alpha unittest.php
在测试中,我将能够获取'X'(或其他任何值)参数的值,并且知道例如该机器到应用程序根目录的路径。
它看起来不像命令行所允许的那样-还是我错过了什么?
dl__ asked 2020-08-06T10:29:26Z
9个解决方案
38 votes
您可以为此使用PHPUnit的--bootstrap开关。
--bootstrap 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
Mark Theunissen answered 2020-08-06T10:30:08Z
32 votes
一种方法是让您检查$ argv和$ argc。 就像是:
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
Paolo answered 2020-08-06T10:29:35Z
15 votes
将变量传递到引导文件和测试文件的一种绝佳方法是使用环境变量:
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/]
scribu answered 2020-08-06T10:30:37Z
4 votes
我认为上述答案无法解决我的同样问题。
公认的答案并不完美。 这样,应始终将自定义选项放在参数列表的末尾,并且没有指示符可以表明它们是自定义选项。 如果我需要的自定义选项的数量没有固定,我应该编写大量代码以解析带有正则表达式或类似内容的自定义选项。
环境变量解决方案是好的,但不是自然的。 看起来很奇怪。
VAR1=aaa VAR2=bbb VAR3=ccc ./phpunit-custom-option CustomOptionTest.php
Shell脚本和setUp()解决方案与公认的缺点相同。 可能是您应该编写大量代码来分析文件并处理数量无法预测的自定义选项。
我认为引导脚本不是正确的解决方案。 它可以用于自动处理肮脏的作品,每次都执行相同的操作,但不能很好地处理更改部分。
我不喜欢以上所有答案。
我自己也没有好主意。 但是也许我所做的可以给您启发。 我在GitHub上分叉了phpunit项目,并对代码进行了一些修改,使其支持自定义选项功能。
修改后的phpunit版本可以接受如下自定义选项:
./phpuint-custom-option --custom var1=value1 --custom var2=value2 CustomOptionTest.php
在测试中,您可以通过访问超级全局变量$ _SERVER访问自定义选项
class CustomOptionTest extends PHPUnit_Framework_TestCase {
public function testCustomOption() {
$this->assertEquals('value1', $_SERVER['var1']);
$this->assertEquals('value2', $_SERVER['var2']);
}
}
您可以在此处找到我的代码,然后在此处下载修改后的版本(通过单击页面上的“查看完整文件”链接)。
仅供参考。 本文是类似的解决方案。
Charles answered 2020-08-06T10:31:42Z
3 votes
正如Jasir已经提到的那样,一种解决方案是在phpunit调用之前设置环境变量。
在Linux上:
X=alpha phpunit unittest.php
在Windows上可能:
set X=johns_laptop && phpunit.bat unittest.php
在脚本中使用
getenv('X')
读取值
Victor answered 2020-08-06T10:32:20Z
2 votes
我在这个确切的问题上苦苦挣扎,并提出了一种方便又方便的解决方案:我将参数写入磁盘上的文件,并以setUp()048方法进行检索:
public function setUp() {
$this->setBrowser('firefox');
$this->base_url = file_get_contents("selenium_host");
$this->setBrowserUrl($this->base_url);
}
我没有直接调用./run_all_tests.sh 7 'http://adifferenthost.com'或paratest265,而是使用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
然后,以7个线程针对[http://adifferenthost.com:]运行
./run_all_tests.sh 7 'http://adifferenthost.com'
ehed answered 2020-08-06T10:32:53Z
2 votes
此处的所有解决方案均适用于该问题,但是对于某些情况,还有另一种方法可能更简单。Phing将接受以phing -Dtest=MyTest.class.php形式传递的参数
所以用phing -Dtest=MyTest.class.php
然后,您可以使用phing条件句来处理以下参数:
passthru="true" returnproperty="phpunitreturn" />
Frug answered 2020-08-06T10:33:22Z
1 votes
如果要在每次测试运行中更改测试参数,则在命令行上传递参数将很有意义。 在不同的计算机上运行特定于主机的测试并不是此解决方案的最佳理由。
为此,PHPUnit配置文件可能更适合。 它使您可以控制特定于主机甚至请求的变量,包括操纵phpunit.xml.dist设置以及定义常量,全局变量,phpunit.xml、$_SERVER甚至$_GET、$_POST等。这些都在配置文件的节点下完成 ,请参阅设置PHP INI设置,常量和全局变量
Symfony2使用此方法,并在单元测试中同时提供phpunit.xml.dist(默认配置)和phpunit.xml。 后者被忽略,以允许您为每台计算机自定义它而不影响存储库。 然后,您将使用以下命令运行测试:
phpunit -c /path/to/phpunit.xml
gopherIT answered 2020-08-06T10:33:52Z
0 votes
如果要在远程计算机上运行测试,请使用ssh然后运行它。 在语言环境机器上,您仅需CD到您的根目录,然后运行phpunit。
user@local:/path/to/your/project$ phpunit
user@remote:/var/www/project$ phpunit
编辑:您正在谈论机器相关的配置。 (什么样的配置?)我的解决方案是将这些配置放在相同的位置,而不是版本控制的位置,然后在所需的设置方法中读取/解析其运行时。
erenon answered 2020-08-06T10:34:16Z