34

我目前有一个问题,我必须在遗留代码中解决才能让我们与 PHP 扩展的交互正常工作(单例测试问题)。

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

关于如何确定这一点的任何建议?我考虑了一个与测试文件本身的存在相关的定义变量(我们不会将测试发送给客户),但我们的开发人员需要扩展才能正常工作,而 CI 服务器需要运行测试。

是否会推荐 PHPUnit.xml 文件中的全局集?其他想法?

4

5 回答 5

42

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

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

在您的 PHP 应用程序中,您可以使用以下检查:

if (defined('PHPUNIT_YOURAPPLICATION_TESTSUITE') && PHPUNIT_YOURAPPLICATION_TESTSUITE)
{ 
    echo 'TestSuite running!';
}
于 2013-08-01T11:03:55.673 回答
28

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

于 2012-04-20T21:27:09.657 回答
15

如果你使用 Laravel 比使用App::runningUnitTests()

于 2018-09-29T02:49:38.710 回答
10

你可以检查$argv不同的方法。

if(PHP_SAPI == 'cli') {

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

}
于 2013-12-20T22:48:46.960 回答
8

使用 PHPUnit 常量

您可以定义常量,但这需要您的工作,没有拼写错误并且它不是通用的。如何做得更好?

PHPUnit 自己定义了 2 个常量:

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

// is PHPUnit
于 2018-03-15T12:03:33.973 回答