如何使用PHPUnit測試命令行程序?我從命令行看到使用PHPUnit的很多幫助,但是沒有一個使用PHPUnit測試命令行程序本身。如何使用PHPUnit測試命令行程序?
這來了,因爲我寫在PHP和Joomla命令行程序,但是不明白的方式來測試它們的輸出,特別是在發生錯誤時(因爲你不能使用PHPUnit的的expectOutputString測試錯誤輸出() )。
(編輯:請注意,我的代碼的大部分是已經在由PHPUnit的測試類 - 我正在尋找一種方式來測試命令行(包裝)程序的邏輯)
如何使用PHPUnit測試命令行程序?我從命令行看到使用PHPUnit的很多幫助,但是沒有一個使用PHPUnit測試命令行程序本身。如何使用PHPUnit測試命令行程序?
這來了,因爲我寫在PHP和Joomla命令行程序,但是不明白的方式來測試它們的輸出,特別是在發生錯誤時(因爲你不能使用PHPUnit的的expectOutputString測試錯誤輸出() )。
(編輯:請注意,我的代碼的大部分是已經在由PHPUnit的測試類 - 我正在尋找一種方式來測試命令行(包裝)程序的邏輯)
一種方法是使用反引號操作符(`)來捕獲程序的輸出,然後檢查該輸出。這適用於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被抓獲到$輸出,然後正則表達式斷言用於測試輸出是否類似於正確的輸出。
以與測試網頁相同的方式進行測試,只需編寫測試並針對您的代碼執行測試即可。這假定您正在測試程序的對象,而不是從命令行程序返回代碼。
您的代碼包含執行和操作數據的類。只是沒有生成網頁。簡單地爲類,數據操作等編寫相同的測試,因爲您正在對代碼片段運行測試,而不是完整的可執行文件。
我有一個類來解析實例的命令行選項,並允許代碼遍歷這些值。我編寫了測試以將命令行傳遞給對象(不需要讀取實際的參數,argv),然後可以測試它是否正確返回。
您可以將您的命令行腳本邏輯組合到函數/類中,然後測試這些函數和類 – dm03514