2012-01-23 56 views
3

情況

我可能沒有使用傳統意義上的PHPUnit。我在Selenium 2中使用PHPUnit。我們有這個想法來記錄Selenium在「重現步驟」中執行的操作。意思是如果我們調用Selenium來「點擊」或「鍵入」,則記錄動作。如果某個操作失敗,它也會被記錄下來。我們不調用斷言來設置類型的操作。例如,如果我們正在測試一個頁面來查看客戶信息,但在我們甚至可以訪問該頁面之前我們需要登錄,但我們並沒有聲明登錄操作,而只是在必須查看客戶信息。如果監聽器是在phpunit.xml中定義的,是否可以將PHP變量傳遞給PHPUnit的自定義監聽器?

現在,當我們終於做了斷言,我們也想記錄結果。我們創建了一個自定義偵聽器來捕獲結果。我們現在面臨的問題是如何將結果發回給我們的行動記錄器。

我本來跑了PHPUnit的測試,像這樣:

class SandboxTest extends PHPUnit_Framework_TestCase { /* tests */ } 
$stepTracker = new QA_StepTracker(); // Our custom action recorder 
$suite = new PHPUnit_Framework_TestSuite(); 
$listener = new QA_Listener(); // Our customer listener 
$listener->setStepTracker($stepTracker); // Passing the action recorder object to our customer listener 
$result = new PHPUnit_Framework_TestResult();  
$suite->addTestSuite('SandboxTest'); 
$result->addListener($listener); 
$suite->run($result); 

這個工程,我期望它,但感覺就像運行它這樣,我失去了很多的功能phpunit命令必須提供。我想回到使用phpunit命令並使用phpunit.xml配置文件來定義自定義偵聽器。

檢查PHPUnit文檔,我發現您可以在phpunit.xml中定義客戶偵聽器時傳遞參數。

<listeners> 
    <listener class="MyListener" file="/optional/path/to/MyListener.php"> 
    <arguments> 
     <array> 
     <element key="0"> 
      <string>Sebastian</string> 
     </element> 
     </array> 
     <integer>22</integer> 
     <string>April</string> 
     <double>19.78</double> 
     <null/> 
     <object class="stdClass"/> 
    </arguments> 
    </listener> 
</listeners> 

相當於

$listener = new MyListener(
    array('Sebastian'), 
    22, 
    'April', 
    19.78, 
    NULL, 
    new stdClass 
); 

根據實例,它看起來像我可以在一個對象傳遞......但是這將是一個新實例化的對象,而不是預先存在的一個。

而且,如果我們使用上面的例子中,我們將擺脫setStepTracker()在我們的客戶監聽器,並通過客戶聽者的__construct()

問題

是它在所有的活動記錄對象傳遞可能通過phpunit.xml通過自定義偵聽器傳遞變量?

我們還將定義一個引導來初始化動作記錄器。

如果不是這樣,最好的行動方案是使操作記錄器對象在引導程序中是全局的,並讓自定義的監聽器以這種方式訪問​​它?

回答

1

由於phpunit.xmlbootstrap.php之前被處理,但之後創建了偵聽器,所以可以在偵聽器的構造函數中使用全局變量。

// bootstrap.php 
$stepTracker = new QA_StepTracker(); 

// listener 
class QA_Listener implements PHPUnit_Framework_TestListener 
{ 
    public function __construct() { 
     global $stepTracker; 
     $this->stepTracker = $stepTracker; 
     ... 
    } 
} 

更新:固定爲考慮到bootstrap.php是創建監聽器之前執行。

+0

我只做OOP大約一年(主要是PHP),並且我沒有寫任何單例類型的類。如果stepStepTracker()是靜態的,它是否會像調用QA_Listener :: setStepTracker($ stepTracker)一樣直接調用並獲得相同的結果? 在'bootstrap.php'之前,'phpunit.xml'中的自定義監聽器是否真的被處理(實例化或掛鉤了,無論它需要做什麼)?我的引導程序具有'$ QA_STEP_TRACKER =新的QA_StepTracker()'和QA_Listener的結構具有'全局$ QA_STEP_TRACKER'並且能夠按預期處理它。謝謝! – NkM

+1

我只是做了一個快速測試,看起來'phpunit.xml'首先被*處理,然後*執行'bootstrap.php'後創建*監聽器。因此,監聽器的構造函數確實可以依賴'bootstrap.php'中創建的全局變量。 –

+0

我的確如此,謝謝! – NkM