關於GTest的學習心得

轉載時請標明出處 做者聯繫方式: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_系列,也是具備相似的宏結構的

好了,單元測試就向你們介紹到這裏了,以後會有更多的學習心得分享給你們,感謝!

相關文章
相關標籤/搜索