轉載時請標明出處 做者聯繫方式:854290197@qq.comgit
1、什麼是單元測試?
要搞懂單元測試,首要要弄清楚什麼是單元。單元是軟件中承擔單一責任的單位,一個函數、一個文件、一個類、一個模塊均可以稱爲一個單元。單元測試即是對軟件設計的最小單位進行正確性測試,以檢驗程序單元是否知足功能、性能、接口、設計規約等要求。程序員
單元測試本質上也是代碼,與普通代碼的區別在於它是驗證代碼正確性的代碼。軟件開發天生就具備複雜性,沒人敢打包票說本身寫的代碼一點問題都沒有,或者不經測試就能保證代碼正確運行,可能你在這個執行路徑下可以執行,卻不知還有其餘路徑,有一一去驗證過嗎,所以,要保證程序的正確性就必需要對咱們代碼進行嚴格測試。github
2、單元測試帶來的好處
一般咱們在作任何工做會先考慮它的回報,編寫代碼更是如此。若是單元測試的做用不大,沒有人會願意再寫一堆無用的代碼,那麼單元測試到底可以給咱們帶來什麼優勢呢?以下:框架
- 便於後期重構。單元測試能夠爲代碼的重構提供保障,只要重構代碼以後單元測試所有運行經過,那麼在很大程度上表示此次重構沒有引入新的BUG,固然這是創建在完整、有效的單元測試覆蓋率的基礎上。
- 優化設計。編寫單元測試將使用戶從調用者的角度觀察、思考,特別是使用TDD驅動開發的開發方式,會讓使用者把程序設計成易於調用和可測試,而且解除軟件中的耦合。
- 文檔記錄。單元測試就是一種無價的文檔,它是展現函數或類如何使用的最佳文檔,這份文檔是可編譯、可運行的、而且它保持最新,永遠與代碼同步。
- 具備迴歸性。自動化的單元測試避免了代碼出現迴歸,編寫完成以後,能夠隨時隨地地快速運行測試,而不是將代碼部署到設備以後,而後再手動地覆蓋各類執行路徑,這樣的行爲效率低下,浪費時間。
3、什麼是好的單元測試
既然咱們已經知道了單元測試對一個程序員的重要性。那如何寫好單元測試也是程序員需掌握好的技巧。這裏,我想向你們介紹測試的first原則。first並非第一的意思,其每一個字母都有獨特的含義: Fless
- 快速:測試必須很是快,這樣開發人員能夠對每個小更改運行測試,而不用中斷思緒去等待測試運行。
I函數
- 隔離:不一樣的測試用例之間是隔離的。一個測試不會依賴另外一個測試。不一樣測試的故障是相互隔離的。
R性能
- REPEATABLE: - 可重演 測試程序要可在不一樣環境跑.
S單元測試
- SLEF-VALIDATING: - 自我確認 測試結果應是簡單的TRUE/FALSE, 無須人工確認.
T學習
- 及時:測試是及時的。程序員在代碼上線前,及時地編寫它們,以防止bug。
4、Gtest作單元測試
單元測試的框架有不少種,程序員需根據程序的類型選擇合適的框架。下面我向你們介紹一款google公司開發的Gtest框架。測試
1.什麼是Gtest
gtest是一個跨平臺的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++單元測試框架,由google公司發佈。gtest是爲在不一樣平臺上爲編寫C++測試而生成的。它提供了豐富的斷言、致命和非致命判斷、參數化、」死亡測試」等等。
2.Gtest的使用
①從github下載Gtest 連接: 下載地址.
②將Gtest添加進本身的工程
- 將googletest-master\googletest\include和googletest-master\googletest目錄拷貝到本身工程當中
- 添加googletest-master\googletest\src\gtest-all.cc到本身的源程序中
- 使用時需包含頭文件#include<gtest/gtest.h> ③ 編寫測試用例 有以下判斷輸入年份是否爲潤年的函數:
bool IsLeapYear(int year) { bool flag = false; if ((0 == year % 400) || (0 != year %100) && (0 == year % 4)) { flag = true; } return flag; }
設計測試數據,使得控制流中的每條路徑至少被執行一次,以下所示流程 測試路徑 | 測試數據 -------- | ----- ①->②->③->④ | 1999 ①->⑤-⑥ | 2000 ①->②->③->⑦->⑥ | 1996 ①->②->⑧ | 2100
用例可參考以下所示:
TEST(IsLeapYearTest, leapYear) { EXPECT_TRUE(IsLeapYear(2000)); EXPECT_TRUE(IsLeapYear(1996)); } TEST(IsLeapYearTest, commonYear) { EXPECT_FALSE (IsLeapYear(1999)); EXPECT_FALSE (IsLeapYear(2100)); }
④運行測試用例
int main(int argc, char** argv) { /* 選擇須要運行的用例 */ testing::FLAGS_gtest_filter = 「*」; /* 初始化測試框架 */ testing::InitGoogleMock(&argc, argv); /* 運行所選測試用例 */ return RUN_ALL_TESTS(); }
用例表示:「用例集.用例」 例如: 「IsLeapYearTest. leapYear 」
可使用通配符「」和「?」 例如:「IsLeapYearTest.」
使用「:」鏈接多個匹配條件 例如:「*. leapYear : *. commonYear」
使用「-」排除用例 例如:「-IsLeapYearTest.*
3.gtest系列之斷言
gtest中斷言的宏能夠分爲兩類:一類是ASSERT宏,另外一類就是EXPECT宏了。 一、ASSERT_系列:若是當前點檢測失敗則退出當前函數 二、EXPECT_系列:若是當前點檢測失敗則繼續往下執行 若是你對自動輸出的錯誤信息不滿意的話,也是能夠經過operator<<可以在失敗的時候打印日誌,將一些自定義的信息輸出。 ASSERT_系列:
bool值檢查 1>、 ASSERT_TRUE(參數),期待結果是true 2>、ASSERT_FALSE(參數),期待結果是false 數值型數據檢查 3>、ASSERT_EQ(參數1,參數2),傳入的是須要比較的兩個數 equal 4>、ASSERT_NE(參數1,參數2),not equal,不等於才返回true 5>、ASSERT_LT(參數1,參數2),less than,小於才返回true 6>、ASSERT_GT(參數1,參數2),greater than,大於才返回true 7>、ASSERT_LE(參數1,參數2),less equal,小於等於才返回true 8>、ASSERT_GE(參數1,參數2),greater equal,大於等於才返回true 字符串檢查 9>、ASSERT_STREQ(expected_str, actual_str),兩個C風格的字符串相等才正確返回 10>、ASSERT_STRNE(str1, str2),兩個C風格的字符串不相等時才正確返回 11>、ASSERT_STRCASEEQ(expected_str, actual_str) 12>、ASSERT_STRCASENE(str1, str2) 13>、EXPECT_系列,也是具備相似的宏結構的
好了,單元測試就向你們介紹到這裏了,以後會有更多的學習心得分享給你們,感謝!