我目前存在一个问题,必须在旧代码中解决,以使我们与PHP扩展的交互正常工作(单例测试问题)。
因此,我不想在运行应用程序的正常生产代码时执行此代码。因此,我需要在常规的PHP代码中检查正在执行的代码是否作为测试的一部分执行。
有关如何确定这一点的任何建议?我考虑过将定义的变量绑定到测试文件本身的存在(我们不会将测试文件提供给客户),但是我们的开发人员需要Extension正常工作,而CI服务器需要运行测试。
在PHPUnit.xml文件中设置全局变量是否可以推荐?其他想法?
另一种方法是在phpunit.xml的PHP部分中设置一个常量。*:
<php>
<const name="PHPUNIT_YOURAPPLICATION_TESTSUITE" value="true"/>
</php>
if (defined('PHPUNIT_YOURAPPLICATION_TESTSUITE') && PHPUNIT_YOURAPPLICATION_TESTSUITE)
{
echo 'TestSuite running!';
}
bootstrap.php
文件中定义一个常量。这会在加载或运行任何测试之前执行。这不应影响正常运行应用程序的开发人员 - 只影响单元测试。如果您正在使用Laravel,则使用App::runningUnitTests()
您可以以不同方式检查 $argv
。
if(PHP_SAPI == 'cli') {
if(strpos($_SERVER['argv'][0], 'phpunit') !== FALSE) { ... }
// or
if($_SERVER['argv'][0] == '/usr/bin/phpunit') { ... }
}
你可以自己定义常量,但这需要你的努力,不能出错且不够通用。那么如何更好地做呢?
PHPUnit本身定义了两个常量:
if (! defined('PHPUNIT_COMPOSER_INSTALL') && ! defined('__PHPUNIT_PHAR__')) {
// is not PHPUnit run
return;
}
// is PHPUnit
if (defined('PHPUnit_MAIN_METHOD')) {
// is not PHPUnit run
return;
}
EXAMPLE
未定义,则会被评估为'EXAMPLE'
)。这意味着,您应该使用===
正确地进行评估。它仍然会抛出有关未定义常量的通知。 - Martti Laine===
不也会匹配类型吗?而且由于它被定义为true
(布尔值),但他正在检查它是否为1
(整数),所以它将失败?我理解你的评论,但在这个例子中,==
更好。 - Mathias Lykkegaard LorenzenAPP_ENV
被设置为testing
。这使得实施您的答案变得非常容易。我强烈推荐此解决方案适用于Laravel。 - Carsten"PHPUNIT_YOURAPPLICATION_TESTSUITE"
都不会被认为等于1。唯一的情况是,如果一个字符串以1开头,它才会被认为等于1。否则,它会被认为等于0(或其他数字),但不是1。在这里使用===
没有任何理由。使用==
是完全正确的。(而且如前所述,===
实际上在这里是无效的) - DimeCadmium