亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解c++種gmock單元測試框架

 更新時間:2018年08月19日 14:54:19   作者:Solid  
這篇文章我們給大家分享了關于c++種gmock單元測試框架的相關知識點內容,有興趣的朋友們學習下。

隨著微服務和CI的流行,在目前的軟件工程領域中單元測試可以說是必不可少的一個環(huán)節(jié),在TDD中,單元測試更是被提高到了一個新的高度。但是很多公司由于很多不同的原因,沒有能持續(xù)維護,或者干脆就從來沒有寫過單元測試,確實,單元測試在初期和代碼維護期會需要花一些投入,但是,如果一個項目是需要長期維護和更新的,那么單元測試的作用,相對于投入來說就根本不算什么。見過很多人寫的單元測試,雖然也可以運行,也有覆蓋率,但是稍微分析一下就會看出來,那根本就不是單元測試,而已經是集成測試,比如有人竟然要在單元測試中訪問網絡,寫文件,甚至讀寫數(shù)據(jù)庫。。

那么什么樣的數(shù)據(jù)庫是好的單元測試呢,根據(jù)筆者的經驗,以下幾點可能是必須的:

1. 運行速度快,對于一個有幾百個單元測試用例的測試來說,我期待1-2分鐘內可以運行完成,應為如果我在重構代碼,這可以讓我在很快的時間內得到反饋。

2. 不要依賴外部因素,單元測試只針對單一函數(shù)功能測試

3. 一個用例只測試一個函數(shù)

對于其中的第二點,可能是比較麻煩的,因為,如果一個函數(shù)是類型的成員函數(shù),那么很可能會依賴很多內部的成員變量,這種情況就是mock出場的時候了,因為使用mock才能讓我們專注于自己函數(shù)一業(yè)務邏輯的測試,而將依賴隔離開。筆者使用過很多種語言的mock庫,用的最順手的還是Java的mokito, 當然c++ 語言也有很多類似的產品,比如gmock, fake it, 但是其局限性確實比較多,如果不在代碼開始階段了解,并且做好計劃,后期想加入單元測試,并且使用gmock的時候可能就會追悔莫及,大動干戈,下面我們來分場景分析一下這些局限性。

場景1:

class TurtleReal {

public:

 void PenUp()
 {
 }
 void PenDown() 
 {
 }
};

class MockTurtleReal : public TurtleReal {
public:

 MOCK_METHOD0(PenUp, void());
 MOCK_METHOD0(PenDown, void());

};


class PainterdReal
{
 TurtleReal* turtle;
public:
 PainterdReal(TurtleReal* turtle)
  : turtle(turtle) {}

 bool DrawCircle(int, int, int) {
  turtle->PenDown();
  return true;
 }
};


TEST(PainterTest, ChildRealCanDrawSomething) {
 MockTurtleReal turtle;
 EXPECT_CALL(turtle, PenDown())
  .Times(AtLeast(1));

 PainterdReal painter(&turtle);

 EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}

結果1:

結論一:

為什么用例會失敗呢,gmock 依賴C++多態(tài)機制進行工作,只有虛函數(shù)才能被mock, 非虛函數(shù)不能被mock, 這一點告訴我們,如果想要在代碼中使用gmock類的設計中,最好采用接口隔離,對于c++來說也就是采用純虛類型,因為c++本身沒有接口類型。

場景2:

class Turtle {

public:

 virtual ~Turtle() {}
 virtual void PenUp() = 0;
 virtual void PenDown() = 0;
};

class MockTurtle : public Turtle {
public:

 MOCK_METHOD0(PenUp, void());
 MOCK_METHOD0(PenDown, void());

};

class Painter
{
 Turtle* turtle;
public:
 Painter(Turtle* turtle)
  : turtle(turtle) {}

 bool DrawCircle(int, int, int) {
  turtle->PenDown();
  return true;
 }
};

TEST(PainterTest, CanDrawSomething) {
 MockTurtle turtle;
 EXPECT_CALL(turtle, PenDown())
  .Times(AtLeast(1));

 Painter painter(&turtle);

 EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}

結果2:

結論二:

將函數(shù)改為虛函數(shù),測試用例通過

場景3:

class TurtleChild: Turtle {

public:

 void PenUp()
 {
  int a = 0;
 };
 void PenDown()
 {
  int b = 0;
 };
};

class MockTurtleChild : public TurtleChild {
public:

 MOCK_METHOD0(PenUp, void());
 MOCK_METHOD0(PenDown, void());

};

class PainterChildRef
{
 TurtleChild turtle;
public:
 PainterChildRef(TurtleChild& turtle)
  : turtle(turtle) {}

 bool DrawCircle(int, int, int) {
  turtle.PenDown();
  return true;
 }
};

TEST(PainterTest, ChildCanDrawSomething) {
 MockTurtleChild turtle;
 EXPECT_CALL(turtle, PenDown())
  .Times(AtLeast(1));

 PainterChild painter(&turtle);

 EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}

結果3:

結論三:

測試用例通過,派生類中的同名函數(shù)仍然是虛函數(shù),同樣支持多態(tài),支持gomck

場景4:

class Turtle {

public:

 virtual ~Turtle() {}
 virtual void PenUp() = 0;
 virtual void PenDown() = 0;
};

class TurtleChild: Turtle {

public:

 void PenUp()
 {
  int a = 0;
 };
 void PenDown()
 {
  int b = 0;
 };
};


 class MockTurtleChild : public TurtleChild {
 public:
 MOCK_METHOD0(PenUp, void());
 MOCK_METHOD0(PenDown, void());
};
class PainterChildRef
{
 TurtleChild turtle;
public:
 PainterChildRef(TurtleChild& turtle)
  : turtle(turtle) {}

 bool DrawCircle(int, int, int) {
  turtle.PenDown();
  return true;
 }
};

TEST(PainterTest, ChildRefCanDrawSomething) {
 MockTurtleChild turtle;
 EXPECT_CALL(turtle, PenDown())
  .Times(AtLeast(1));

 PainterChildRef painter(turtle);

 EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}

結果4:

結論四:

測試用例失敗,以引用類型傳入的成員變量本身不具備多態(tài)特性,因此gmock不支持

結論

本文通過四個場景,層層遞進,深入的剖析了gmock的使用,希望大家在寫代碼之前早做打算,避免大動干戈,返工重來。但是從另一個方面來說,接口隔離, p-impl 慣用法等技術,應該是一個c++老鳥的必備法寶,可見好多東西都是有其道理的,前期不了解,后期只能花更多的精力取彌補,要么推翻重構,要么直接放棄,無知者無畏,no zuo, no die..

相關文章

  • C++數(shù)據(jù)結構之文件壓縮(哈夫曼樹)實例詳解

    C++數(shù)據(jù)結構之文件壓縮(哈夫曼樹)實例詳解

    這篇文章主要介紹了C++數(shù)據(jù)結構之文件壓縮(哈夫曼樹)實例詳解的相關資料,利用哈夫曼編碼的方式對文件進行壓縮,并且對壓縮文件可以解壓,需要的朋友可以參考下
    2017-07-07
  • C++之IO類,文件輸入輸出,string流練習題

    C++之IO類,文件輸入輸出,string流練習題

    這篇文章主要介紹了C++實現(xiàn)IO類的幾道數(shù)組練習題,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • C++?數(shù)據(jù)結構超詳細講解單鏈表

    C++?數(shù)據(jù)結構超詳細講解單鏈表

    這篇文章主要介紹了C++數(shù)據(jù)結構之單鏈表,鏈表是由一個個結點鏈結成的。結點包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來存儲數(shù)據(jù)元素的信息,指針域用來存儲下一個結點的地址,更詳細內容請需要的小伙伴參考下面文章內容
    2022-03-03
  • C++類和對象之默認成員函數(shù)的使用解讀

    C++類和對象之默認成員函數(shù)的使用解讀

    這篇文章主要介紹了C++類和對象之默認成員函數(shù)的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • OpenCV實現(xiàn)拼圖板小游戲

    OpenCV實現(xiàn)拼圖板小游戲

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)拼圖板小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C語言實現(xiàn)哈希搜索算法及原理詳解

    C語言實現(xiàn)哈希搜索算法及原理詳解

    本文主要介紹了C語言實現(xiàn)哈希搜索算法及原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • LeetCode 單調棧內容小結

    LeetCode 單調棧內容小結

    這篇文章主要介紹了LeetCode 單調棧內容小結,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C++基本用法實踐之智能指針詳解

    C++基本用法實踐之智能指針詳解

    為了減少手動管理內存帶來的困擾,c++提出了智能指針,可以幫助我們進行內存管理,下面小編就來和大家簡單聊聊C++中智能指針的基本用法吧
    2023-07-07
  • C語言的基本編寫規(guī)范你了解嗎

    C語言的基本編寫規(guī)范你了解嗎

    這篇文章主要為大家介紹了C語言的基本編寫規(guī)范,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 淺談C++11中的幾種鎖

    淺談C++11中的幾種鎖

    本文主要介紹了C++11中的幾種鎖,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論