gtest/gmock 簡單實例

一. gtest下載安裝

cd kln
git clone https://github.com/google/googletest.git
cd googletest
cmake
make && make install
?  googletest git:(master) ? make && make install
[ 12%] Building CXX object googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
[ 25%] Linking CXX static library ../lib/libgtest.a
[ 25%] Built target gtest
[ 37%] Building CXX object googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.o
[ 50%] Linking CXX static library ../lib/libgmock.a
[ 50%] Built target gmock
[ 62%] Building CXX object googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.o
[ 75%] Linking CXX static library ../lib/libgmock_main.a
[ 75%] Built target gmock_main
[ 87%] Building CXX object googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
[100%] Linking CXX static library ../lib/libgtest_main.a
[100%] Built target gtest_main
[ 25%] Built target gtest
[ 50%] Built target gmock
[ 75%] Built target gmock_main
[100%] Built target gtest_main
Install the project...
-- Install configuration: ""
-- Up-to-date: /usr/local/include
...

二. gtest測試示例

make example
cd example

main.cpp

#include <iostream>
#include <gtest/gtest.h>

int sum(int a, int b) {
    return a+b;
}

TEST(sum, testSum) {
    EXPECT_EQ(5, sum(2, 3));    // 求合2+3=5
    EXPECT_NE(3, sum(3, 4));    // 求合3+4 != 3
}

int main(int argc, char **argv)
{
 testing::InitGoogleTest(&argc, argv);
 return RUN_ALL_TESTS();
}

編譯運行

?  first git:(master) ? g++ -o main main.cpp -lgtest -lpthread -std=c++11
?  first git:(master) ? ./main
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from sum
[ RUN      ] sum.testSum
[       OK ] sum.testSum (0 ms)
[----------] 1 test from sum (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

三. gmock 測試示例

被測試的對象的接口

?  first git:(master) ? cat Foo.h
#ifndef _FOO_H_INCLUDED_
#define _FOO_H_INCLUDED_

class Foo {
public:
  virtual int count() = 0;
};

#endif

創(chuàng)建一個Mock文件,內(nèi)容如下

?  first git:(master) ? ../../googlemock/scripts/generator/gmock_gen.py Foo.h Foo > MockFoo.h
?  first git:(master) ? cat MockFoo.h
class MockFoo : public Foo {
 public:
  MOCK_METHOD0(count,
      int());
};

Bar.h

?  first git:(master) ? cat Bar.h
#ifndef _BAR_H_INCLUDED_
#define _BAR_H_INCLUDED_

#include "Foo.h"

class Bar {
public:
  Bar(Foo *foo) : m_foo(foo) {
  }

  int count() {
    return m_foo->count();
  }

private:
  Foo *m_foo;
};

#endif

main.cpp

?  first git:(master) ? cat main.cpp
// gtest_sum.cpp
#include <iostream>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "Bar.h"
#include "MockFoo.h"

using namespace testing;

TEST(BarTest, mock_foo_in_bar) {
  MockFoo *mockFoo = new MockFoo();
  Bar *bar = new Bar(mockFoo);

  EXPECT_CALL(*mockFoo, count())
    .Times(3)
    .WillOnce(Return(3))
    .WillOnce(Return(6))
    .WillOnce(Return(5));

  EXPECT_EQ(bar->count(), 3);
  EXPECT_EQ(bar->count(), 6);
  EXPECT_EQ(bar->count(), 5);

  delete bar;
  delete mockFoo;
}

int main(int argc, char **argv)
{
 testing::InitGoogleTest(&argc, argv);
 return RUN_ALL_TESTS();
}

編譯運行

?  first git:(master) ? g++ -o main main.cpp -lgtest -lgmock -lpthread -std=c++11
?  first git:(master) ? ./main
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from BarTest
[ RUN      ] BarTest.mock_foo_in_bar
[       OK ] BarTest.mock_foo_in_bar (0 ms)
[----------] 1 test from BarTest (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

故意出錯

?  first git:(master) ? cat main.cpp
// gtest_sum.cpp
#include <iostream>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "Bar.h"
#include "MockFoo.h"

using namespace testing;

TEST(BarTest, mock_foo_in_bar) {
  MockFoo *mockFoo = new MockFoo();
  Bar *bar = new Bar(mockFoo);

  EXPECT_CALL(*mockFoo, count())
    .Times(5)
    .WillOnce(Return(2))
    .WillOnce(Return(6))
    .WillOnce(Return(5));

  EXPECT_EQ(bar->count(), 3);
  EXPECT_EQ(bar->count(), 6);
  EXPECT_EQ(bar->count(), 5);

  delete bar;
  delete mockFoo;
}

int main(int argc, char **argv)
{
 testing::InitGoogleTest(&argc, argv);
 return RUN_ALL_TESTS();
}

編譯執(zhí)行后的報錯

?  first git:(master) ? g++ -o main main.cpp -lgtest -lgmock -lpthread -std=c++11
?  first git:(master) ? ./main
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from BarTest
[ RUN      ] BarTest.mock_foo_in_bar

GMOCK WARNING:
main.cpp:14: Too few actions specified in EXPECT_CALL(*mockFoo, count())...
Expected to be called 5 times, but has only 3 WillOnce()s.main.cpp:20: Failure
Expected equality of these values:
  bar->count()
    Which is: 2
  3
main.cpp:14: Failure
Actual function call count doesn't match EXPECT_CALL(*mockFoo, count())...
         Expected: to be called 5 times
           Actual: called 3 times - unsatisfied and active
[  FAILED  ] BarTest.mock_foo_in_bar (0 ms)
[----------] 1 test from BarTest (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (1 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] BarTest.mock_foo_in_bar

 1 FAILED TEST
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碌宴,一起剝皮案震驚了整個濱河市贷揽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赖钞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異般码,居然都是意外死亡,警方通過查閱死者的電腦和手機乱顾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門板祝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糯耍,你說我怎么就攤上這事扔字。” “怎么了温技?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵革为,是天一觀的道長。 經(jīng)常有香客問我舵鳞,道長震檩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮抛虏,結(jié)果婚禮上博其,老公的妹妹穿的比我還像新娘。我一直安慰自己迂猴,他們只是感情好慕淡,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沸毁,像睡著了一般峰髓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上息尺,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天携兵,我揣著相機與錄音,去河邊找鬼搂誉。 笑死徐紧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的炭懊。 我是一名探鬼主播并级,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侮腹!你這毒婦竟也來了死遭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凯旋,失蹤者是張志新(化名)和其女友劉穎呀潭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體至非,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡钠署,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荒椭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谐鼎。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖趣惠,靈堂內(nèi)的尸體忽然破棺而出狸棍,到底是詐尸還是另有隱情,我是刑警寧澤味悄,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布草戈,位于F島的核電站,受9級特大地震影響侍瑟,放射性物質(zhì)發(fā)生泄漏唐片。R本人自食惡果不足惜丙猬,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望费韭。 院中可真熱鬧茧球,春花似錦、人聲如沸星持。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽督暂。三九已至羹令,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間损痰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工酒来, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卢未,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓堰汉,卻偏偏與公主長得像辽社,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翘鸭,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,699評論 0 3
  • Gtest Github使用 gtest(gmock) 方便我們編寫組織 c++ 單元測試滴铅。 編譯 lib 到 g...
    orientlu閱讀 4,324評論 0 1
  • Nginx 的配置文件使用的就是一門微型的編程語言,許多真實世界里的 Nginx 配置文件其實就是一個一個的小程序...
    SkTj閱讀 4,202評論 0 7
  • 西瓜視頻玩的是心跳就乓,挑戰(zhàn)的是超強大腦汉匙!這兩天,同事們都在玩西瓜視頻的百萬英雄生蚁!我也不例外噩翠,湊個熱鬧!還能挑戰(zhàn)一下自...
    笑對人生_1977閱讀 70評論 0 0
  • 01 昨天堂哥結(jié)婚屯援,眾多親朋好友幾乎都聚在了一起,共同見證著這一對新人牽手走進幸福神圣的婚姻殿堂念脯。 當天晚上狞洋,離家...
    億葉知秋閱讀 837評論 12 21