2013-07-17 73 views
2

如何使用PHPUnit測試命令行程序?我從命令行看到使用PHPUnit的很多幫助,但是沒有一個使用PHPUnit測試命令行程序本身。如何使用PHPUnit測試命令行程序?

這來了,因爲我寫在PHP和Joomla命令行程序,但是不明白的方式來測試它們的輸出,特別是在發生錯誤時(因爲你不能使用PHPUnit的的expectOutputString測試錯誤輸出() )。

(編輯:請注意,我的代碼的大部分是已經在由PHPUnit的測試類 - 我正在尋找一種方式來測試命令行(包裝)程序的邏輯)

+0

您可以將您的命令行腳本邏輯組合到函數/類中,然後測試這些函數和類 – dm03514

回答

2

一種方法是使用反引號操作符(`)來捕獲程序的輸出,然後檢查該輸出。這適用於Unix/Linux風格的操作系統,因爲您還可以捕獲像STDERR這樣的錯誤輸出。 (這是Windows下比較痛苦,但是可以做到(特別是使用Cygwin)。)

例如:

public function testHelp() 
{ 
     $output = `./add-event --help 2>&1`; 
     $this->assertRegExp( '/^usage:/m',    $output, 'no help message?'); 
     $this->assertRegExp( '/where:/m',     $output, 'no help message?'); 
     $this->assertNotRegExp('/where event types are:/m', $output, 'no help message?'); 
} 

可以看到,標準輸出和STDERR被抓獲到$輸出,然後正則表達式斷言用於測試輸出是否類似於正確的輸出。

0

以與測試網頁相同的方式進行測試,只需編寫測試並針對您的代碼執行測試即可。這假定您正在測試程序的對象,而不是從命令行程序返回代碼。

您的代碼包含執行和操作數據的類。只是沒有生成網頁。簡單地爲類,數據操作等編寫相同的測試,因爲您正在對代碼片段運行測試,而不是完整的可執行文件。

我有一個類來解析實例的命令行選項,並允許代碼遍歷這些值。我編寫了測試以將命令行傳遞給對象(不需要讀取實際的參數,argv),然後可以測試它是否正確返回。

相關問題