2012-04-20 37 views
21

我目前有一個問題,我必須在遺留代碼中解決問題,才能使我們與PHP Extension的交互正常工作(Singleton Testing Question)。如何確定PHPUnit測試是否正在運行?

因此,我不想在應用程序運行正常生產代碼時執行此代碼。因此,如果正在執行的代碼正在作爲測試的一部分執行,我需要檢查常規PHP代碼。

有關如何確定此問題的任何建議?我想過一個與測試文件本身存在關聯的已定義變量(我們不會將測試發送給客戶),但我們的開發人員需要擴展才能正常工作,而CI服務器需要運行測試。

建議在PHPUnit.xml文件中設置全局嗎?其他想法?

回答

23

在您的PHPUnit bootstrap.php文件中定義一個常量。這是在加載或運行任何測試之前執行的。這不應該影響正常運行應用程序的開發人員 - 僅僅是單元測試。

+0

謝謝。這就像一個魅力,我仍然可以檢測到我的開發環境的其他代碼進程。 – 2012-05-07 16:39:57

+0

完美,在這裏工作得很好。非常感謝。 – GoinAum 2012-12-07 20:38:41

29

的另一種方法是set a constant in the PHP section of your phpunit.xml.*

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

在你的PHP應用程序,你可以再使用以下檢查:

if (defined('PHPUNIT_YOURAPPLICATION_TESTSUITE') && PHPUNIT_YOURAPPLICATION_TESTSUITE) 
{ 
    echo 'TestSuite running!'; 
} 
+0

請記住,PHP奇怪地將一個未定義的常量評估爲一個字符串(如果'EXAMPLE'沒有被定義,它將被評估爲''EXAMPLE''。意思是說,你應該用'==='正確評估它。仍然拋出一個關於一個未定義的常量的通知 – 2014-01-02 13:37:28

+2

'==='也不符合類型,因爲它被定義爲'true'(一個布爾值),但他正在檢查它是否是'1'(一個整數) ,它會失敗嗎?我理解你的評論,但在這個例子中,'=='更好。 – 2014-07-24 02:17:54

+3

感謝你的回答,我發現(在'Laravel 5'中)'APP_ENV'設置爲'testing'。我真的很容易實現你的答案。我真的推薦這個解決方案爲Laravel。 – 2016-04-04 10:47:23

10

您可以檢查不同的方式。

if(PHP_SAPI == 'cli') { 

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

} 
+2

$ _SERVER ['argv'] [0]而不是$ argv [0] – 2014-11-10 08:29:47

1

我使用Laravel日誌文件來確定PHPUnit測試是否正在運行。

+5

在Laravel中,phpunit.xml將'APP_ENV'設置爲' testing'。或許這比你的日誌文件更容易?(只是一個建議) – 2016-04-04 10:50:56

+0

謝謝,很高興知道。 – 2016-04-05 00:53:59

相關問題