Google C++ 自動測試框架入門

發表于:2009-05-30來源:作者:點擊數: 標簽:googleGoogle框架自動入門
Google C++ 自動測試框架 入門 Google C++ 測試框架入門 簡介: 為什么需要Google C++ 測試框架 Google C++ 測試框架 可以幫助你更好地編寫C++測試。 無論你是工作在Linux、 Windows 、還是在Mac,只要你編寫C++代碼,Google測試框架都可以幫上忙。 那么,哪

Google C++ 自動測試框架入門

Google C++ 測試框架入門

簡介: 為什么需要Google C++ 測試框架

Google C++ 測試框架 可以幫助你更好地編寫C++測試。

無論你是工作在Linux、Windows、還是在Mac,只要你編寫C++代碼,Google測試框架都可以幫上忙。

那么,哪些因素才能構成一個好的測試?以及,Google C++ 測試框架怎樣滿足這些因素?我們相信:

  1. 測試應該是 獨立、可重復 的。因為其他測試成功或失敗而導致我們要對自己的測試進行debug是非常痛苦的。Google C++ 測試框架通過將每個測試在不同的對象中運行,使得測試分離開來。當一個測試失敗時,Google C++ 測試框架允許你獨立運行它以進行快速除錯。
  2. 測試應該能夠被很好地組織,并反映被測代碼的結構。Google C++ 測試框架將測試組織成測試案例,案例中的測試可以共享數據和程序分支。這樣一種通用模式能夠很容易辨識,使得我們的測試容易維護。當開發人員在項目之間轉換,開始在一個新的代碼基上開始工作時,這種一致性格外有用。
  3. 測試應該是 可移植、可重用的。開源社區有很多平臺獨立的代碼,它們的測試也應該是平臺獨立的。除開一些特殊情況,Google C++ 測試框架運行在不同的操作系統上、與不同的編譯器(gclearcase/" target="_blank" >cc、icc、MSVC)搭配,Google C++ 測試框架的測試很容易與不同的配置一起工作。
  4. 當測試失敗時,應該提供盡可能多的、關于問題的信息。Google C++ 測試框架在第一個測試失敗時不會停下來。相反,它只是將當前測試停止,然后繼續接下來的測試。你也可以設置對一些非致命的錯誤進行報告,并接著進行當前的測試。這樣,你就可以在一次“運行-編輯-編譯”循環中檢查到并修復多個bug。
  5. 測試框架應該能將測試編寫人員從一些環境維護的工作中解放出來,使他們能夠集中精力于測試的內容。Google C++ 測試框架自動記錄下所有定義好的測試,不需要用戶通過列舉來指明哪些測試需要運行。
  6. 測試應該快速。使用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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97