Google C++ 自動測試框架入門
Google C++ 測試框架 可以幫助你更好地編寫C++測試。
無論你是工作在Linux、Windows、還是在Mac,只要你編寫C++代碼,Google測試框架都可以幫上忙。
那么,哪些因素才能構成一個好的測試?以及,Google C++ 測試框架怎樣滿足這些因素?我們相信:
因為Google C++ 測試框架基于著名的xUnit架構,如果你之前使用過JUnit或PyUnit的話,你將會感覺非 常熟悉。如果你沒有接觸過這些測試框架,它也只會占用你大約10分鐘的時間來學習基本概念和上手。所以,讓我們開始吧!
Note: 本文偶爾會用“Google Test”來代指“Google C++ 測試框架”。
使用Google Test時,你是從編寫斷言開始的,而斷言是一些檢查條件是否為真的語句。一個斷言的結果 可能是成功、非致命失敗,或者致命失敗。如果一個致命失敗出現,他會結束當前的函數;否則,程序繼續正常運行。
測試使用斷言來驗證被測代碼的行為。如果一個測試崩潰或是出現一個失敗的斷言,那么,該測試失??;否則該測試成功。
一個測試案例(test case)包含了一個或多個測試。你應該將自己的測試分別歸類到測試案例中,以反 映被測代碼的結構。當測試案例中的多個測試需要共享通用對象和子程序時,你可以把他們放到一個測試固件(test fixture)類中。
一個測試程序可以包含多個測試案例。
從編寫單個的斷言開始,到創建測試和測試案例,我們將會介紹怎樣編寫一個測試程序。
Google Test中的斷言是一些與函數調用相似的宏。要測試一個類或函數,我們需要對其行為做出斷言。 當一個斷言失敗時,Google Test會在屏幕上輸出該代碼所在的源文件及其所在的位置行號,以及錯誤信 息。也可以在編寫斷言時,提供一個自定義的錯誤信息,這個信息在失敗時會被附加在Google Test的錯 誤信息之后。
斷言常常成對出現,它們都測試同一個類或者函數,但對當前功能有著不同的效果。ASSERT_*版本的斷言失敗時會產生致命失敗,并結束當前函數。EXPECT_*版本的斷言產生非致命失敗,而不會中止當前函數。通常更推薦使用EXPECT_*斷言,因為它們運行一個測試中可以有不止一個的錯誤被報告出來。但如果在編寫斷言如果失敗,就沒有必要繼續往下執行的測試時,你應該使用ASSERT_*斷言。
因為失敗的ASSERT_*斷言會立刻從當前的函數返回,可能會跳過其后的一些的清潔代碼,這樣也許會導致空間泄漏。根據泄漏本身的特質,這種情況也許值得修復,也可能不值得我們關心——所以,如果你得到斷言錯誤的同時,還得到了一個堆檢查的錯誤,記住上面我們所說的這一點。
要提供一個自定義的錯誤消息,只需要使用<<操作符,或一個<<操作符的序列,將其輸入到框架定義的宏中。下面是一個例子:
ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";
for (int i = 0; i < x.size(); ++i) {
EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}
任何能夠被輸出到ostream中的信息都可以被輸出到一個斷言宏中——特別是C字符串和string對象。如果一個寬字符串(wchar_t*,windows上 UNICODE模式TCHAR*或std::wstring)被輸出到一個斷言中,在打印時它會被轉換成UTF-8編碼。
下面這些斷言實現了基本的true/false條件測試。
致命斷言 | 非致命斷言 | 驗證條件 |
ASSERT_TRUE(condition); | EXPECT_TRUE(condition); | condition為真 |
ASSERT_FALSE(condition); | EXPECT_FALSE(condition); | condition為假 |
記住,當它們失敗時,ASSERT_*產生一個致命失敗并從當前函數返回,而EXCEPT_*產生一個非致命失敗,允許函數繼續運行。在兩種情況下,一個斷言失敗都意味著它所包含的測試失敗。
有效平臺:Linux、Windows、Mac。
本節描述了比較兩個值的一些斷言。
致命斷言 | 非致命斷言 | 驗證條件 |
ASSERT_EQ(expected, actual); | EXPECT_EQ(expected, actual); | expected == actual |
ASSERT_NE(val1, val2); | EXPECT_NE(val1, val2); | val1 != val2 |
ASSERT_LT(val1, val2); | EXPECT_LT(val1, val2); | val1 < val2 |
ASSERT_LE(val1, val2); | EXPECT_LE(val1, val2); | val1 <= val2 |
ASSERT_GT(val1, val2); | EXPECT_GT(val1, val2); | val1 > val2 |
ASSERT_GE(val1, val2); | EXPECT_GE(val1, val2); | val1 >= val2 |
在出現失敗事件時,Google Test會將兩個值(Val1和Val2)都打印出來。在ASSERT_EQ*和EXCEPT_EQ*斷言(以及我們隨后介紹類似的斷言)中,你應該把你希望測試的表達式放在actual(實際值)的位置上,將其期望值放在expected(期望值)的位置上,因為Google Test的測試消息為這種慣例做了一些優化。
原文轉自:http://www.anti-gravitydesign.com