如何确定PHPUnit测试是否正在运行?

38

我目前存在一个问题,必须在旧代码中解决,以使我们与PHP扩展的交互正常工作(单例测试问题)。

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

有关如何确定这一点的任何建议?我考虑过将定义的变量绑定到测试文件本身的存在(我们不会将测试文件提供给客户),但是我们的开发人员需要Extension正常工作,而CI服务器需要运行测试。

在PHPUnit.xml文件中设置全局变量是否可以推荐?其他想法?

7个回答

46

另一种方法是在phpunit.xml的PHP部分中设置一个常量。*

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

在您的PHP应用程序中,您可以使用以下检查:
if (defined('PHPUNIT_YOURAPPLICATION_TESTSUITE') && PHPUNIT_YOURAPPLICATION_TESTSUITE)
{ 
    echo 'TestSuite running!';
}

首先,我们检查常量是否已定义;其次,我们检查常量的值。

请注意,PHP会奇怪地将未定义的常量评估为字符串(如果EXAMPLE未定义,则会被评估为'EXAMPLE')。这意味着,您应该使用===正确地进行评估。它仍然会抛出有关未定义常量的通知。 - Martti Laine
2
=== 不也会匹配类型吗?而且由于它被定义为 true(布尔值),但他正在检查它是否为 1(整数),所以它将失败?我理解你的评论,但在这个例子中,== 更好。 - Mathias Lykkegaard Lorenzen
4
感谢您的回答,我发现(在Laravel 5中)APP_ENV被设置为testing。这使得实施您的答案变得非常容易。我强烈推荐此解决方案适用于Laravel。 - Carsten
在任何版本的PHP中,字符串"PHPUNIT_YOURAPPLICATION_TESTSUITE"都不会被认为等于1。唯一的情况是,如果一个字符串以1开头,它才会被认为等于1。否则,它会被认为等于0(或其他数字),但不是1。在这里使用===没有任何理由。使用==是完全正确的。(而且如前所述,===实际上在这里是无效的) - DimeCadmium
哼?PHPUNIT_YOURAPPLICATION_TESTSUITE不是一个字符串,而是一个常量标识符。比较的第二部分是对常量值的检查。 - Jens A. Koch

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

14

如果您正在使用Laravel,则使用App::runningUnitTests()


12

您可以以不同方式检查 $argv

if(PHP_SAPI == 'cli') {

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

}

我在phpunit的自动加载选项中使用了这个,因为在那里你还没有访问phpunit.xml或任何其他东西,所以这个方法非常好用! - Steve Moretz

8

使用PHPUnit常量

你可以自己定义常量,但这需要你的努力,不能出错且不够通用。那么如何更好地做呢?

PHPUnit本身定义了两个常量:

if (! defined('PHPUNIT_COMPOSER_INSTALL') && ! defined('__PHPUNIT_PHAR__')) {
    // is not PHPUnit run
    return;
}

// is PHPUnit

2
现在有一些PHPUnit值,这也是一个很好的解决方案。我的答案比这些完全可用之前更早。使用自己的还可以让您知道正在运行哪个测试套件(如果您有多个),这是额外的奖励。 - Steven Scott
3
在PHPUnit v3.7.28中,要检查的常量是'PHPUnit_MAIN_METHOD'。 - Tim Rogers
您不应该使用不受支持的PHPUnit或PHP版本。这是危险的 - http://php.net/supported-versions.php - Tomas Votruba

0
我通过以下代码片段来跳过全局范围内的代码:
if (defined('PHPUnit_MAIN_METHOD')) {
   // is not PHPUnit run
   return;
}

0
你可以通过使用defined('PHPUNIT_COMPOSER_INSTALL')来查找官方phpunit运行器定义的常量PHPUNIT_COMPOSER_INSTALL。 phpunit还定义了一些全局变量。
但是在使用替代运行器(如IDE)时,它们可能未定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接