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

Ste*_*ott 28 phpunit

我目前有一个问题,我必须在遗留代码中解决,以使我们与PHP扩展的交互正常工作(Singleton测试问题).

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

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

是否建议在PHPUnit.xml文件中设置Global?其他想法?

Jen*_*och 35

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

<php>
   <const name="PHPUNIT_YOURAPPLICATION_TESTSUITE" value="true"/>
</php>
Run Code Online (Sandbox Code Playgroud)

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

if (defined('PHPUNIT_YOURAPPLICATION_TESTSUITE') && PHPUNIT_YOURAPPLICATION_TESTSUITE)
{ 
    echo 'TestSuite running!';
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,我发现(在"Laravel 5"中)`APP_ENV`设置为`testing`.这使得实现答案变得非常容易.我真的推荐Laravel的这个解决方案. (3认同)
  • 不会`===`也匹配类型,因为它被定义为`true`(布尔值),但他正在检查它是否是'1`(一个整数),它会失败吗?我理解你的评论,但在这个例子中,`==`更好. (2认同)

Dav*_*ess 26

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


Xeo*_*oss 9

你可以检查$argv不同的方式.

if(PHP_SAPI == 'cli') {

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

}
Run Code Online (Sandbox Code Playgroud)


Tom*_*uba 7

使用 PHPUnit 常量

你可以定义常量,但这需要你的工作,没有错别字,它不是通用的。如何做得更好?

PHPUnit 自己定义了 2 个常量:

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

// is PHPUnit
Run Code Online (Sandbox Code Playgroud)

  • 现在有了一些 PHPUnit 值,这也是一个很好的解决方案。在这些完全可用之前,我的答案已经很旧了。使用您自己的测试套件还可以让您知道哪个测试套件(如果您有多个)正在运行,这是一个额外的好处。 (2认同)
  • 在 PHPUnit v3.7.28 中,要检查的常量是“PHPUnit_MAIN_METHOD”。 (2认同)

pab*_*rsk 6

如果你使用Laravel而不是使用 App::runningUnitTests()