我有很多我們自己編寫並經常使用的命令行工具。目前測試它們非常麻煩,因此我們不會做太多的測試。測試命令行工具的最佳方法是什麼?
我想知道是否有人可以建議好的技術或工具來做好這類事情。
編輯:澄清這是UNIX
在此先感謝。 Tom
我有很多我們自己編寫並經常使用的命令行工具。目前測試它們非常麻煩,因此我們不會做太多的測試。測試命令行工具的最佳方法是什麼?
我想知道是否有人可以建議好的技術或工具來做好這類事情。
編輯:澄清這是UNIX
在此先感謝。 Tom
Aruba是一個Cucumber擴展名,用於測試以任何編程語言編寫的命令行應用程序。
要使用它,你需要ruby來運行測試,但是aruba的目的是提供一個預定義的步驟定義庫,這樣你就不需要編寫任何ruby代碼來做一個可行的測試套房。 (雖然在某些時候,你可能會想要寫一點紅寶石,使一些自定義步驟)
您可以看到與Aruba在這裏測試了一個命令行工具的複雜的例子:jingweno/gh
您應該可以從shell腳本(MS操作系統上的批處理文件)調用它們,將輸出重定向到文件,然後以編程方式掃描文件以確保它具有正確的輸出。我不知道有一個測試框架可以爲您自動完成此操作,但它應該是相當直接的,可以自行設置。
是的 - 我希望有人可能知道一個框架或工具。我在考慮把自己作爲你的權利,這不會太困難。 乾杯。湯姆 – 2008-12-09 16:01:14
您可以從批處理文件或Windows腳本主機執行此操作。
但我保證會使用像(http://www.splinterware.com/products/wincron.htm)或其他免費/專業軟件的任務調度程序。
在那裏你可以很容易地複製/粘貼你應該改變的命令行參數,當你想測試你的軟件約100次?!
我使用Expect檢查發生了什麼事是我,嗯,預計
我建議構建你的命令行工具的代碼做了這一點(一個過長...前段時間嘿嘿),這樣的命令行實用程序是一個函數和/或類的庫的客戶端。
而不是簡單地使用std :: cout來打印輸出,讓庫函數採用默認爲std :: cout的ostream引用。在測試時,提供一個std :: stringstream來收集輸出。
最後,使用您最喜歡的單元測試框架,簡單比較您的實用程序的輸出與預期結果。 (我對C++的具體例子表示歉意......我相信也有辦法在其他語言中做類似的事情)。
你可以使用perl和Test::more庫,這爲測試CLI提供了一個很好的框架。儘管主要爲單元測試而設計,但您可以將其擴展到測試用戶工作流程。
一些方法:
# Various ways to say "ok"
ok($got eq $expected, $test_name);
is ($got, $expected, $test_name);
isnt($got, $expected, $test_name);
# Rather than print STDERR "# here's what went wrong\n"
diag("here's what went wrong");
like ($got, qr/expected/, $test_name);
unlike($got, qr/expected/, $test_name);
cmp_ok($got, '==', $expected, $test_name);
使用Cram你可以寫類似於一個交互shell會話測試。然後,Cram將重播測試中的命令,將輸出與參考進行比較,並報告差異。測試格式非常靈活,並允許您使用Perl正則表達式或類似shell的通配符來匹配輸出。
Bats (Bash Automated Testing System) by Sam Stephenson。它很小,純粹用shell編寫,並且有很好的功能。
先前建議阿魯巴看起來很有趣,但在某些情況下,它可能是安靜
您是否使用或寫入/生產命令行實用程序中的依賴性方面矯枉過正(紅寶石,黃瓜)? – 2008-12-09 15:55:06