不管你在什么平臺上工作,無論是Linux,Windows還是Mac,只要你使用C++,GTest就可以幫助你。
對于什么是一個好的測試,GTest如何來幫助實現這個目標,我們的觀點如下:
測試必須是獨立并且可重復的。如果某個測試的通過還是失敗依賴于其它測試的執行結果,那么調試它將是非常困難的。GTest通過在不同的項目下分別執行測試使得它們相互隔離。當某個測試失敗后,GTest允許你單獨執行它以便快速調試。
測試的組織必須很好的反映測試代碼的結構。GTest以測試用例為單位把那些能共享相同數據和代碼的測試組織起來。這種常見的模式使得我們可以很方便的識別和維護測試。當人們切換項目在新的代碼基礎上工作時,這種一致性會顯得特別有幫助。
測試必須可移植和可重用。開源社區的很多代碼都是平臺中立的,所以它們的測試也必須平臺中立。GTest可以在不同的操作系統上工作,使用不同的編譯器,支持或不支持異常,所以GTest可以很容易的在不同配置上工作。(注意:當前的發行版只包含Linux的構建腳本,我們正努力工作以支持其它平臺。)
一個測試失敗后必須提供盡可能多的提示信息。GTest不會因為一個失敗就停止繼續工作。它僅僅停止當前測試并且繼續執行后續的測試。你還可以設置測試在遇到非致命失敗時繼續執行并打印相關信息。通過這種方法,你可以在一個“執行-編輯-編譯”周期中發現和修復多處bug。
測試框架必須把測試編寫者從繁重的家常事務中解脫出來以集中精力于測試本身。GTest自動維護和跟蹤所有定義的測試,不需要你為了運行測試而去手工枚舉所有測試。
測試必須迅速。使用GTest,你可以在不同測試之間使用共享的資源,而只需要做一次set-up/tear-down的工作,并且測試和測試之間相互獨立。
因為GTest使用流行的xUnit架構,只要你熟練使用JUnit或PyUnit就一定會感到非常親切。如果以前沒玩過的話,只要花10分鐘就可以上手了。好吧,我們繼續!
讓GTest學習打印自定義對象
當一個斷言比如EXPECT_EQ()失敗時,GTest會打印它的參數來幫你調試。它依靠用戶可擴展值打印機來實現此功能。
這個打印機了解如何打印C++的內建類型,原生數組,STL容器和任何支持"<<"操作符的類型。對于其它類型,它會打印原始的字節然后等您老自己意會。
前面提到這個打印機是可擴展的。這表明除了打印原始字節,對于你感興趣的類型顯然可以做得更好。怎么做呢?請自己實現"<<"操作符。參考以下代碼:
#include
namespace foo {
class Bar { ... }; // We want Google Test to be able to print instances of this.
// It's important that the << operator is defined in the SAME
// namespace that defines Bar. C++'s look-up rules rely on that.
::std::ostream& operator<<(::std::ostream& os, const Bar& bar) {
return os << bar.DebugString(); // whatever needed to print bar to os
}
} // namespace foo
有時候這個方案也許行不通。你的團隊認為使用"<<"操作符對于Bar類是個不好的風格,或者Bar類已經支持"<<"操作符但是實現了其它功能。在這種情況下,你可以定義一個PrintTo()函數作為替代方案:
#include
namespace foo {
class Bar { ... };
// It's important that PrintTo() is defined in the SAME
// namespace that defines Bar. C++'s look-up rules rely on that.
void PrintTo(const Bar& bar, ::std::ostream* os) {
*os << bar.DebugString(); // whatever needed to print bar to os
}
} // namespace foo
如果"<<"操作符和PrintTo()同時被定義了,GTest會優先使用后者。這使得你可以自定義GTest如何輸出你的值而不依賴于"<<"操作符的行為。
如果你想調用GTest的打印機來打印一個值x,直接調用::testing::PrintToString(x),這個函數會返回std::string。
vector > bar_ints = GetBarIntVector();
EXPECT_TRUE(IsCorrectBarIntVector(bar_ints))
<< "bar_ints = " << ::testing::PrintToString(bar_ints);
基本概念使用GTest你肯定會接觸到斷言這個概念。斷言是用來判斷某個條件是否為真。一個斷言的結果可以是通過,也可以是非致命失敗或致命失敗。如果發生了一個致命失敗,當前函數就會立刻退出,不然函數還是會繼續執行到正常結束。測試使用斷言來判斷測試代碼的行為。如果測試崩潰了或者斷言失敗,那么這個測試就失敗了,不然就是通過。一個測試用例包含一個或多個測試。你必須用測試用例把你的測試進行分組以反映測試代碼的結構。當某個測試用例中的多個測試共享一些對象或程序時,你可以把這些對象和程序放進test fixture類。一個測試程序可以包含多個測試用例。我們現在開始講解如何編寫一個測試程序,先從單個斷言開始,然后逐步到測試和測試用例。
原文轉自:http://www.cnblogs.com/panda_lin/p/gtest_primer_ch_03_basic_concepts.html