亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-05-23 13:28:09
字體:
來源:轉載
供稿:網友

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

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

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

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

3. 一個用例只測試一個函數

對于其中的第二點,可能是比較麻煩的,因為,如果一個函數是類型的成員函數,那么很可能會依賴很多內部的成員變量,這種情況就是mock出場的時候了,因為使用mock才能讓我們專注于自己函數一業務邏輯的測試,而將依賴隔離開。筆者使用過很多種語言的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:

c++,gmock,單元測試框架

結論一:

為什么用例會失敗呢,gmock 依賴C++多態機制進行工作,只有虛函數才能被mock, 非虛函數不能被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:

c++,gmock,單元測試框架

結論二:

將函數改為虛函數,測試用例通過

場景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:

c++,gmock,單元測試框架

結論三:

測試用例通過,派生類中的同名函數仍然是虛函數,同樣支持多態,支持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:

c++,gmock,單元測試框架

結論四:

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

結論

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
57pao成人国产永久免费| 欧美xxxx18性欧美| 欧美激情综合亚洲一二区| 91av中文字幕| 日韩中文字幕在线精品| 啊v视频在线一区二区三区| 91精品国产自产在线观看永久| 国产精品亚洲片夜色在线| 日韩成人在线观看| 亚洲iv一区二区三区| 精品国产欧美一区二区五十路| 日韩有码在线播放| 欧美日韩亚洲成人| 亚洲精品美女在线| 亚洲一区二区中文字幕| 国产精品你懂得| 国产欧美一区二区白浆黑人| 亚洲综合av影视| 欧美一区二区三区四区在线| 国产亚洲精品久久久久久| 国产精品欧美日韩| 在线亚洲国产精品网| 日韩精品视频在线观看网址| 91免费国产网站| 国产精品久久久久久久久久久不卡| 国产精品久久久久7777婷婷| 国产精品久久久久免费a∨大胸| 91黑丝在线观看| 日产精品久久久一区二区福利| 久久91亚洲精品中文字幕奶水| 亚洲精品福利免费在线观看| 国产精品久久久久久久7电影| 成人黄色av播放免费| 久久久久久国产三级电影| 亚洲区在线播放| 欧美视频中文在线看| 久久深夜福利免费观看| 精品香蕉在线观看视频一| 视频直播国产精品| 亚洲欧美在线x视频| 国产精品免费观看在线| 亚洲欧美在线免费| 精品久久久999| 青草热久免费精品视频| 亚洲精品成a人在线观看| 欧美中文字幕视频| 国产97色在线| 国产精品久久久久久久美男| 国产成人精品视频在线观看| 秋霞成人午夜鲁丝一区二区三区| 国产女人18毛片水18精品| 久久免费少妇高潮久久精品99| 欧美限制级电影在线观看| 精品亚洲一区二区三区| 亚洲图片在区色| 热99精品只有里视频精品| 欧美在线亚洲在线| 欧美在线激情网| 18久久久久久| 久久精品国产2020观看福利| 亚洲欧美日韩精品久久| 国产深夜精品福利| 在线日韩日本国产亚洲| 性亚洲最疯狂xxxx高清| 97精品久久久中文字幕免费| 8x海外华人永久免费日韩内陆视频| 欧美在线观看网站| 精品视频—区二区三区免费| 国内偷自视频区视频综合| 久久久久一本一区二区青青蜜月| 精品国产一区二区三区久久狼黑人| 欧美激情性做爰免费视频| 日韩在线观看网址| 成人国产精品一区二区| 国产精品久久久精品| 亚洲a级在线播放观看| 国产精品成人aaaaa网站| 日韩精品在线免费播放| 国产精品69av| 国产日韩欧美另类| 午夜精品久久久久久久男人的天堂| 日韩激情视频在线| 久久国产精品久久精品| 成人福利视频在线观看| 91在线视频导航| 欧美乱妇高清无乱码| 日韩av资源在线播放| 姬川优奈aav一区二区| 91亚洲国产精品| 中文字幕久久久av一区| 亚洲成色www8888| 国产成人在线亚洲欧美| 高清欧美性猛交xxxx| 97色在线观看免费视频| 日韩大片免费观看视频播放| 欧美成aaa人片在线观看蜜臀| 日韩在线中文字幕| 中文字幕成人精品久久不卡| 成人写真视频福利网| 国产成人精品免费视频| 欧美极品xxxx| 亚洲黄色av女优在线观看| 欧美国产中文字幕| 色偷偷噜噜噜亚洲男人的天堂| 亚洲福利视频网站| 国产精品入口夜色视频大尺度| 国产日韩在线视频| 92版电视剧仙鹤神针在线观看| 久久男人的天堂| 欧美视频在线观看 亚洲欧| 日韩精品极品视频免费观看| 国产成人涩涩涩视频在线观看| 国精产品一区一区三区有限在线| 欧美激情极品视频| 国产精品99久久久久久白浆小说| 国产大片精品免费永久看nba| 91在线无精精品一区二区| 丝袜亚洲欧美日韩综合| 欧美日韩激情美女| 亚洲国产欧美日韩精品| 成人久久一区二区| 日韩专区中文字幕| 最新国产精品拍自在线播放| 91精品在线国产| 亚洲成人av资源网| 国产精品视频大全| 亚洲人成免费电影| 欧美国产极速在线| 国产精品com| 国产欧美日韩精品在线观看| 亚洲xxxx视频| 亚洲精品久久久久久下一站| 在线视频免费一区二区| 欧美高清在线播放| 亚洲天堂av女优| 久久久久久久久综合| 日韩经典第一页| 国产成人综合一区二区三区| 91精品国产综合久久男男| 亚洲电影av在线| 欧美亚洲在线视频| 欧美寡妇偷汉性猛交| 亚洲国产三级网| 日韩高清电影免费观看完整| 欧美日韩在线另类| 亚洲韩国欧洲国产日产av| 日韩av一区二区在线观看| 国内精品久久久久影院优| 亚洲人成免费电影| 精品久久久久久亚洲精品| 91九色精品视频| 欧美性xxxxx极品| 日韩美女免费线视频| 美女少妇精品视频| 九九久久精品一区| 精品久久久中文| 91精品久久久久久久久久久久久| 日韩成人在线视频| 国产精品高潮呻吟久久av无限| 国产在线a不卡| 国产91网红主播在线观看| 久久国产精品久久久久久久久久| 亚洲人成电影在线观看天堂色| 一本一道久久a久久精品逆3p|