2012-04-20 133 views
21

我目前有一个问题,我必须在遗留代码中解决问题,才能使我们与PHP Extension的交互正常工作(Singleton Testing Question)。如何确定PHPUnit测试是否正在运行?

因此,我不想在应用程序运行正常生产代码时执行此代码。因此,如果正在执行的代码正在作为测试的一部分执行,我需要检查常规PHP代码。

有关如何确定此问题的任何建议?我想过一个与测试文件本身存在关联的已定义变量(我们不会将测试发送给客户),但我们的开发人员需要扩展才能正常工作,而CI服务器需要运行测试。

建议在PHPUnit.xml文件中设置全局吗?其他想法?

回答

23

在您的PHPUnit bootstrap.php文件中定义一个常量。这是在加载或运行任何测试之前执行的。这不应该影响正常运行应用程序的开发人员 - 仅仅是单元测试。

+0

谢谢。这就像一个魅力,我仍然可以检测到我的开发环境的其他代码进程。 – 2012-05-07 16:39:57

+0

完美,在这里工作得很好。非常感谢。 – GoinAum 2012-12-07 20:38:41

29

的另一种方法是set a constant in the PHP section of your phpunit.xml.*

<php> 
    <const name="PHPUNIT_YOURAPPLICATION_TESTSUITE" value="true"/> 
</php> 

在你的PHP应用程序,你可以再使用以下检查:

if (defined('PHPUNIT_YOURAPPLICATION_TESTSUITE') && PHPUNIT_YOURAPPLICATION_TESTSUITE) 
{ 
    echo 'TestSuite running!'; 
} 
+0

请记住,PHP奇怪地将一个未定义的常量评估为一个字符串(如果'EXAMPLE'没有被定义,它将被评估为''EXAMPLE''。意思是说,你应该用'==='正确评估它。仍然抛出一个关于一个未定义的常量的通知 – 2014-01-02 13:37:28

+2

'==='也不符合类型,因为它被定义为'true'(一个布尔值),但他正在检查它是否是'1'(一个整数) ,它会失败吗?我理解你的评论,但在这个例子中,'=='更好。 – 2014-07-24 02:17:54

+3

感谢你的回答,我发现(在'Laravel 5'中)'APP_ENV'设置为'testing'。我真的很容易实现你的答案。我真的推荐这个解决方案为Laravel。 – 2016-04-04 10:47:23

10

您可以检查不同的方式。

if(PHP_SAPI == 'cli') { 

    if(strpos($_SERVER['argv'][0], 'phpunit') !== FALSE) { ... } 
    // or 
    if($_SERVER['argv'][0] == '/usr/bin/phpunit') { ... } 

} 
+2

$ _SERVER ['argv'] [0]而不是$ argv [0] – 2014-11-10 08:29:47

1

我使用Laravel日志文件来确定PHPUnit测试是否正在运行。

+5

在Laravel中,phpunit.xml将'APP_ENV'设置为' testing'。或许这比你的日志文件更容易?(只是一个建议) – 2016-04-04 10:50:56

+0

谢谢,很高兴知道。 – 2016-04-05 00:53:59