*以下內容為本人的學習筆記,如需要轉載,請宣告原文連結 微信公眾號「ENG八戒」https://mp.weixin.qq.com/s/BS_u9A4EY50y4vDDuxkCAQ
開發者雖然主要負責工程裡的開發任務,但是每個開發完畢的功能都是需要開發者自測透過的,所以經常會聽到開發者提起單元測試的話題。那麼今天我就帶大夥一起來看看大名鼎鼎的谷歌 C++ 測試框架 GoogleTest.
簡單介紹
來看看谷歌官方是怎麼介紹這個框架的:
Googletest 是由測試技術團隊根據 Google 的特定要求和約束開發的測試框架。無論您是在 Linux,Windows 還是 Mac 上工作,如果您編寫 C++ 程式碼,googletest 都可以為您提供幫助。它支援任何型別的測試,而不僅僅是單元測試。
雖然谷歌是根據特定的需求和限制條件來開發這個框架的,但是它自己也指明瞭這個框架還可以用於其它用途,比如作為模擬器使用,當然這就扯遠了,暫且不提。
谷歌在開發這套框架的時候,是有一套基本的設計思路的。
他們認為測試應該是相互獨立而且是可重複的。如果正在做的測試由於其他測試的成功或失敗而受到影響,這無疑會令人感到痛苦。GoogleTest 透過在不同的物件上執行不同的測試來實現測試的相互隔離。當其中一個或多個測試失敗時,測試框架還允許測試者繼續單獨執行測試用例以達到快速除錯。測試應該組織良好,並反映測試程式碼的結構。有很多測試其實可以共享資料和子例程的,那麼 Googletest 提供了測試套件的概念將相關測試分組,測試套件中的所有測試就可以共享資料和子例程了。這種模式其實很常見,並且使得測試易於維護,特別是當你需要切換到新的程式碼工程時,測試流程將極大簡化。
像谷歌這種規模的科技企業,內部的 C++ 專案非常之多,還是跨平臺的,那麼就對測試框架有平臺無關的要求了。GoogleTest 正是如此,無論你是用的是那款編譯器,哪個平臺,通吃。
當然,測試的過程中理應提供儘可能全面的資訊幫助開發者理解執行軟體過程,GoogleTest 也不例外。就算測試過程中,某個測試執行失敗被停止了,測試框架也會繼續其它測試。如果你不希望某個測試由於失敗而停止,可以設定該測試為非致命報錯(non-fatal)。像這樣的測試過程,可以幫助開發者在單個執行-編輯-編譯週期中找到儘可能多的問題 bug。這樣的測試框架是不是很高效?
雖說問題 bug 出現就夠令開發者討厭的了,但是自測過程的繁瑣事那就更糟心了(頭髮怎麼掉得那麼快),比如,開發者除了需要測試具體內容還得自己跟蹤測試清單。Googletest 就可以幫助你從這裡邊脫身出來,做一枚瀟灑的碼農。
這裡問一句,你用過 JUnit 或 PyUnit 嗎?如果有的話,那麼 Googletest 對你來說真的是易如反掌了。據說 Googletest 是基於 xUnit 架構開發而來。至於什麼是 xUnit 架構,有機會我再聊聊吧。
測試框架在測試過程中,基本的測試操作就是使用斷言(assert)來驗證測試程式碼的行為,崩潰或者斷言失敗都表示被測試程式碼的行為不正確,否則正確。
初體驗
來看一下簡單的測試樣例(環境配置安裝會在後面有詳細介紹)
#include <math.h>
#include <gtest/gtest.h>
int square(const int a)
{
int b = a * a;
if (b != b) {
return -1;
} else {
return a * a;
}
}
TEST(SquareTest, PositiveNos) {
ASSERT_EQ(0, square(0));
ASSERT_EQ(36, square(6));
ASSERT_EQ(324, square(18));
}
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
這個測試樣例是為了測試函式 int square(const int a) 的行為是否正確。
編譯生成可執行檔案之後,執行起來
可以看到,上面總共有一個測試套件和一個測試。首先啟動一次全域性測試環境,使用框架提供的宏 TEST() 建立了一個測試套件,命名為 SquareTest,和一個測試,命名為 PositiveNos。然後,執行測試套件內包含的所有測試,測試透過 OK。全部測試結束後,解除安裝全域性測試環境。彙總全部測試結果 PASSED。測試流程結束。
由於篇幅受限,本系列教程還未完結,下一篇《C++ 測試框架 GoogleTest 初學者入門篇 乙》將在本公眾號稍後推送,如果你想看了解更多精彩內容,歡迎關注我的微信公眾號 ENG八戒
學習可以等,時間不等人!
關注我,帶你學習程式設計領域更多核心技能!