如何确定PHPUnit测试是否正在运行?
我目前有一个问题,我必须在遗留代码中解决,以使我们与PHP扩展的交互正常工作() 因此,在使用应用程序运行正常的生产代码时,我不希望执行此代码。因此,我需要在常规PHP代码中检查正在执行的代码是否作为测试的一部分执行 关于如何确定这一点,有什么建议吗?我考虑了一个与测试文件本身相关的定义变量(我们不向客户提供测试),但是我们的开发人员需要扩展才能正常工作,而CI服务器需要运行测试如何确定PHPUnit测试是否正在运行?,phpunit,Phpunit,我目前有一个问题,我必须在遗留代码中解决,以使我们与PHP扩展的交互正常工作() 因此,在使用应用程序运行正常的生产代码时,我不希望执行此代码。因此,我需要在常规PHP代码中检查正在执行的代码是否作为测试的一部分执行 关于如何确定这一点,有什么建议吗?我考虑了一个与测试文件本身相关的定义变量(我们不向客户提供测试),但是我们的开发人员需要扩展才能正常工作,而CI服务器需要运行测试 建议在PHPUnit.xml文件中使用全局集吗?其他想法?在PHPUnitbootstrap.php文件中定义一个常
建议在PHPUnit.xml文件中使用全局集吗?其他想法?在PHPUnit
bootstrap.php
文件中定义一个常量。这是在加载或运行任何测试之前执行的。这不应该影响正常运行应用程序的开发人员——只影响单元测试。另一种方法是:
您可以通过不同的方式检查
$argv
if(PHP_SAPI == 'cli') {
if(strpos($_SERVER['argv'][0], 'phpunit') !== FALSE) { ... }
// or
if($_SERVER['argv'][0] == '/usr/bin/phpunit') { ... }
}
使用PHPUnit常量
您可以定义常量,但这需要您的工作,没有打字错误,也不是泛型。如何做得更好
PHPUnit自己定义了两个常量:
if (! defined('PHPUNIT_COMPOSER_INSTALL') && ! defined('__PHPUNIT_PHAR__')) {
// is not PHPUnit run
return;
}
// is PHPUnit
如果您使用的是Laravel,那么就不要使用
App::runningUnitTests()
请记住,PHP奇怪地将未定义的常量计算为字符串(如果未定义EXAMPLE
,它将被评估为'EXAMPLE'
。这意味着,您应该使用===
正确评估它。它仍然会抛出一个关于未定义常量的通知。==
也不会匹配类型,因为它被定义为true
(布尔值)但是他正在检查它是否是1
(一个整数),它会失败吗?我理解你的评论,但在这个例子中,==
更好。多亏了你的回答,我才发现(在Laravel 5
)APP_ENV
设置为testing
。这使得实现您的答案变得非常简单。我真的向Laravel推荐此解决方案。现在有了一些PHPUnit值,这也是一个很好的解决方案。在这些值完全可用之前,我的答案比较旧。使用您自己的答案还可以让您知道什么是测试套件(如果您有多个)作为额外奖励运行。在PHPUnit v3.7.28中,要检查的常量是“PHPUnit_MAIN_METHOD”。您不应该使用不受支持的PHPUnit或PHP版本。这很危险-
if(PHP_SAPI == 'cli') {
if(strpos($_SERVER['argv'][0], 'phpunit') !== FALSE) { ... }
// or
if($_SERVER['argv'][0] == '/usr/bin/phpunit') { ... }
}
if (! defined('PHPUNIT_COMPOSER_INSTALL') && ! defined('__PHPUNIT_PHAR__')) {
// is not PHPUnit run
return;
}
// is PHPUnit