(Android下使用)Google Test C++單元測(cè)試框架(一)

什么是gtest

gtest是一個(gè)跨平臺(tái)的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++單元測(cè)試框架,由google公司發(fā)布。gtest是為在不同平臺(tái)上為編寫(xiě)C++測(cè)試而生成的。它提供了豐富的斷言、致命和非致命判斷、參數(shù)化、”死亡測(cè)試”等等。

官網(wǎng):GoogleTest

它分為好幾種測(cè)試工具。依次介紹:

GTest Runner

GTest Runner is a Qt5 based automated test-runner and Graphical User Interface with powerful features for Windows and Linux platforms.

GTest Runner是基于qt5的自動(dòng)測(cè)試運(yùn)行程序和圖形用戶界面,具有Windows和Linux平臺(tái)的強(qiáng)大功能。

Google Test UI

Google Test UI is test runner that runs your test binary, allows you to track its progress via a progress bar, and displays a list of test failures. Clicking on one shows failure text. Google Test UI is written in C#.

Google Test UI是運(yùn)行測(cè)試程序的測(cè)試運(yùn)行程序,允許您通過(guò)進(jìn)度條跟蹤其進(jìn)度,并顯示測(cè)試失敗的列表。單擊其中一個(gè)顯示故障文本。谷歌測(cè)試用戶界面是用C#語(yǔ)言編寫(xiě)的。

GTest TAP Listener

GTest TAP Listener is an event listener for Google Test that implements the TAP protocol for test result output. If your test runner understands TAP, you may find it useful.

gtest-tap-listener是Google測(cè)試的事件偵聽(tīng)器,它實(shí)現(xiàn)了測(cè)試結(jié)果輸出的tap協(xié)議。如果您的測(cè)試人員理解TAP協(xié)議,您可能會(huì)發(fā)現(xiàn)它很有用。

gtest-parallel

gtest-parallel is a test runner that runs tests from your binary in parallel to provide significant speed-up.

gtest-parallel是一個(gè)測(cè)試運(yùn)行程序,它并行運(yùn)行可執(zhí)行程序中的測(cè)試,以提供顯著的加速。

oogleTest Adapter

GoogleTest Adapter is a VS Code extension allowing to view Google Tests in a tree view, and run/debug your tests.

GoogleTest Adapter是一個(gè)允許在樹(shù)視圖中查看Google測(cè)試并運(yùn)行/調(diào)試測(cè)試的vs代碼擴(kuò)展。

如何使用

Exercise a particular program path with specific input values and verify the results。

使用特定的輸入值運(yùn)行特定的程序路徑并驗(yàn)證結(jié)果。

聽(tīng)起來(lái)比較繞口,其實(shí)就是一個(gè)叫做測(cè)試單元的概念。

先來(lái)解釋下test case:
A set of preconditions, inputs, actions (where applicable), expected results and postconditions, developed based on test conditions.

基于測(cè)試條件開(kāi)發(fā)的一組先決條件、輸入、動(dòng)作(如適用)、預(yù)期結(jié)果和后置條件。

在gtest中的使用就是一個(gè)函數(shù):

TEST()

Simple Tests

To create a test:

  1. Use the TEST() macro to define and name a test function, These are ordinary C++ functions that don't return a value.

使用TEST()宏定義和命名測(cè)試函數(shù),這些是不返回值的普通C++函數(shù)。

  1. In this function, along with any valid C++ statements you want to include, use the various googletest assertions to check values.

在這個(gè)函數(shù)中,連同任何要包含的有效C++語(yǔ)句,使用各種googletest assertions 來(lái)檢查值。

  1. The test's result is determined by the assertions; if any assertion in the test fails (either fatally or non-fatally), or if the test crashes, the entire test fails. Otherwise, it succeeds.

測(cè)試結(jié)果由斷言確定;如果測(cè)試中的任何斷言失敗(致命或非致命),或者如果測(cè)試崩潰,則整個(gè)測(cè)試都失敗。否則,它會(huì)成功。

斷言(assertions)

gtest的使用離不開(kāi)斷言。什么是斷言?

Google Test斷言是類似于函數(shù)調(diào)用的宏。您可以通過(guò)對(duì)其行為進(jìn)行斷言來(lái)測(cè)試類或函數(shù)。當(dāng)斷言失敗時(shí),Google Test會(huì)打印斷言的源文件和行號(hào)位置以及失敗消息。

gtest中斷言的宏可以分為兩類:一類是ASSERT宏,另一類就是EXPECT宏了。
1 ASSERT_系列:如果當(dāng)前點(diǎn)檢測(cè)失敗則退出當(dāng)前函數(shù)
2 EXPECT_系列:如果當(dāng)前點(diǎn)檢測(cè)失敗則繼續(xù)往下執(zhí)行

bool值檢查

ASSERT_ EXPECT_ Verifies
ASSERT_TRUE(condition); EXPECT_TRUE(condition); condition is true
ASSERT_FALSE(condition); EXPECT_FALSE(condition); condition is false

數(shù)值型

ASSERT_ EXPECT_ Verifies
ASSERT_EQ(expected, actual); EXPECT_EQ(expected, actual); expected == actual
ASSERT_NE(val1, val2); EXPECT_NE(val1, val2); val1 != val2
ASSERT_LT(val1, val2); EXPECT_LT(val1, val2); val1 < val2
ASSERT_LE(val1, val2); EXPECT_LE(val1, val2); val1 <= val2
ASSERT_GT(val1, val2); EXPECT_GT(val1, val2); val1 > val2
ASSERT_GE(val1, val2); EXPECT_GE(val1, val2); val1 >= val2

在發(fā)生故障時(shí),Google測(cè)試同時(shí)打印val1和val2。

而且值參數(shù)通過(guò)斷言的比較運(yùn)算符必須可以比較,否則會(huì)出現(xiàn)編譯錯(cuò)誤。

字符串

ASSERT_ Verifies
ASSERT_STREQ(expected_str,actual_str); the two C strings have the same content
ASSERT_STRNE(str1, str2); the two C strings have different content
ASSERT_STRCASEEQ(expected_str,actual_str); the two C strings have the same content, ignoring case
ASSERT_STRCASENE(str1, str2); the two C strings have different content, ignoring case
EXPECT_ Verifies
EXPECT_STREQ(expected_str,actual_str); the two C strings have the same content
EXPECT_STRNE(str1, str2); the two C strings have different content
EXPECT_STRCASEEQ(expected_str,actual_str); the two C strings have the same content, ignoring case
EXPECT_STRCASENE(str1, str2); the two C strings have different content, ignoring case

注:斷言名中的“CASE”表示忽略大小寫(xiě)。
而且,NULL指針和空字符串被認(rèn)為是不同的。

異常檢查

ASSERT_ Verifies
ASSERT_THROW(statement, exception_type); statement throws an exception of the given type
ASSERT_ANY_THROW(statement); statement throws an exception of any type
ASSERT_NO_THROW(statement); statement doesn't throw any exception
EXPECT_ Verifies
EXPECT_THROW(statement, exception_type); statement throws an exception of the given type
EXPECT_ANY_THROW(statement); statement throws an exception of any type
EXPECT_NO_THROW(statement); statement doesn't throw any exception

測(cè)試用例

偽碼:

TEST(TestSuiteName, TestName) {
  ... test body ...
}

TEST() arguments go from general to specific. The first argument is the name of the test case, and the second argument is the test's name within the test case. Both names must be valid C++ identifiers, and they should not contain underscore (_). A test's full name consists of its containing test case and its individual name. Tests from different test cases can have the same individual name.

TEST() 參數(shù)從常規(guī)變?yōu)樘囟ā5谝粋€(gè)參數(shù)是測(cè)試用例的名稱,第二個(gè)參數(shù)是測(cè)試用例中的測(cè)試名稱。

兩個(gè)名稱必須是有效的C++標(biāo)識(shí)符,并且它們不應(yīng)該包含下劃線。

測(cè)試的全名由它的包含測(cè)試用例和它的單個(gè)名稱組成。來(lái)自不同測(cè)試用例的測(cè)試可以具有相同的單個(gè)名稱。

例子:

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

TEST(addsumTest, OneAddZeroInput) {
  EXPECT_EQ(add_sum(1,0), 1); 
}

TEST(addsumTest, addSomeInput) {
  EXPECT_EQ(add_sum(1, 0), 1); 
  EXPECT_EQ(add_sum(2, 0), 2); 
  EXPECT_EQ(add_sum(3, 3), 6); 
  EXPECT_EQ(add_sum(8, 1024), 40320);
}

放張截圖:O(∩_∩)O哈哈~


image.png

GoogleTest按測(cè)試用例對(duì)測(cè)試結(jié)果進(jìn)行分組,因此邏輯上相關(guān)的測(cè)試應(yīng)該在同一個(gè)測(cè)試用例中;換句話說(shuō),它們的TEST()的第一個(gè)參數(shù)應(yīng)該相同。

在上面的例子中,我們有兩個(gè)測(cè)試,OneAddZeroInput和addSomeInput,它們屬于同一個(gè)測(cè)試用例addsumTest。

今天就描述到這里。明天繼續(xù)。O(∩_∩)O哈哈~

參考

Google C++單元測(cè)試框架---Gtest框架簡(jiǎn)介(譯文)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,688評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,654評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,456評(píng)論 6 406
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,955評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,195評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,608評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,802評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,048評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,422評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,673評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,424評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,762評(píng)論 2 372

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