2010-01-19 204 views
37

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

要运行在这些不同的地方,它似乎是运行测试的人将不得不指示它正在运行的位置。测试可以查找正在运行的机器的正确配置。

我想象的是这样的:

phpunit.bat -X johns_laptop UnitTest.php中

或α服务器上:

PHPUnit的-X阿尔法单元测试。 php

在测试中,我将能够如果是'X'(或其它参数)参数并知道该值,例如,该机器的应用程序根目录路径是什么。

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

回答

30

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

这听起来很有希望,我会试试 – 2010-01-19 18:38:17

+0

为我工作。谢谢。 – 2010-01-19 19:28:16

+0

phpunit也使用参数,这样你根本不能使用它们 – jasir 2014-07-31 15:17:38

0

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

[email protected]:/path/to/your/project$ phpunit 
[email protected]:/var/www/project$ phpunit 

编辑:你是在谈论一个依赖于机器的配置。 (什么样的conf btw?)我的解决方案是把这些配置放在相同的,不受版本控制的地方,然后读取/解析它的运行时间,例如需要的设置方法。

+0

我知道如何运行PHPUnit的内。我的问题是如何将配置信息传递给它,以便它可以知道该机器的配置? – 2010-01-19 16:27:54

+0

@dl:看我的编辑。 – erenon 2010-01-19 16:32:02

+0

我想我明白你的建议。问题是我想配置版本控制。他们可能会随着时间而改变,我想跟踪他们。 – 2010-01-19 18:39:04

36

您可以使用PHPUnit的--bootstrap开关这一点。

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

然后,做一个引导。包含变量PHP文件:

$port = 4445; 

在你的测试,你可以抓住这些值:

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

然后运行:

phpunit --bootstrap boot.php MyTest.php 
+3

我认为这个解决方案比Paulo更好地回答了原来的问题。这是引导文件的确切目的。 – 2011-02-01 18:37:50

+3

@WallyLawless有时值不能被硬编码,需要作为CL参数动态发送 – tipu 2012-02-16 18:39:33

+0

@MarkTheunissen你先生,救了我的一天!谢谢。 – mvw 2014-07-24 09:18:15

13

一种优雅的方式来传递变量既引导文件以及测试文件是通过使用环境变量:

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/

+1

我需要使用'export MY_ENV_VAR =“some value”'来完成这项工作。 – Frug 2014-07-28 19:07:43

+0

@Frug漂亮的渔获;更新的答案。 – scribu 2014-07-29 08:23:57

+1

或者您可以使用:'VAR ='something'phpunit ...,'' – jasir 2014-07-31 15:16:18

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'

3

我不认为以上的回答解决了我同样的问题。

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

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

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(由c点击页面上的“查看完整文件”链接)。

仅供参考。 this article是类似的解决方案。

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" /> 
1

参数传递您想要改变每次测试运行的测试参数。在不同的机器上运行主机特定的测试并不是此解决方案的最佳理由。

对此,PHPUnit configuration file可能证明是更合适的。它可以控制主机甚至特定于请求的变量,包括操作设置以及定义常量,全局变量,$_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 
1

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

在Linux上:

X=alpha phpunit unittest.php 

在Windows上可能:

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

而且你的脚本中使用

getenv('X') 

读取值