GoogleTest(Fatal assertion)-5

概念

Fatal assertion翻譯過來就是致命斷言劳跃,指的是程序崩潰。通常在測(cè)試過程中,我們需要考慮各種各樣的輸入诈茧,有的輸入可能直接導(dǎo)致程序崩潰,這時(shí)就需要檢查程序是否按照預(yù)期的方式掛掉捂掰。googletest的死亡測(cè)試能做到在一個(gè)安全的環(huán)境下執(zhí)行崩潰的測(cè)試案例敢会,同時(shí)又對(duì)崩潰結(jié)果進(jìn)行驗(yàn)證。

使用的宏

Fatal assertion Nonfatal assertion Verifies
ASSERT_DEATH(statement, regex) EXPECT_DEATH(statement, regex) 語句以給定的錯(cuò)誤崩潰
ASSERT_EXIT(statement, predicate, regex) EXPECT_EXIT(statement, predicate, regex) 語句以給定的錯(cuò)誤退出这嚣,其退出代碼與謂詞匹配

*_DEATH(statement, regex)

由于有些異常只在Debug下拋出鸥昏,因此還提供了*_DEBUG_DEATH,用來處理Debug和Realease下的不同姐帚。

  1. statement是被測(cè)試的代碼語句吏垮。
  2. regex是一個(gè)正則表達(dá)式,用來匹配異常時(shí)在stderr中輸出的內(nèi)容罐旗。
    例:
void Foo()
{
    int *pInt = 0;
    *pInt = 42 ;
}

TEST(FooDeathTest, Demo)
{
    EXPECT_DEATH(Foo(), "");
}

編寫致命斷言測(cè)試案例時(shí)膳汪,TEST的第一個(gè)參數(shù),即testcase_name九秀,請(qǐng)使用DeathTest后綴旅敷。原因是googletest會(huì)優(yōu)先運(yùn)行死亡測(cè)試案例,應(yīng)該是為線程安全考慮颤霎。

*_EXIT(statement, predicate, regex`)

  1. statement是被測(cè)試的代碼語句
  2. predicate 在這里必須是一個(gè)委托媳谁,接收int型參數(shù),并返回bool友酱。只有當(dāng)返回值為true時(shí)晴音,死亡測(cè)試案例才算通過。gtest提供了一些常用的predicate:
testing::ExitedWithCode(exit_code)    //如果程序正常退出并且退出碼與exit_code相同則返回 true
  1. regex是一個(gè)正則表達(dá)式缔杉,用來匹配異常時(shí)在stderr中輸出的內(nèi)容锤躁。
    _DEATH其實(shí)是對(duì)_EXIT進(jìn)行的一次包裝,*_DEATH的predicate判斷進(jìn)程是否以非0退出碼退出或详。
    例:
TEST(ExitDeathTest, Demo)
{
    EXPECT_EXIT(_exit(1),  testing::ExitedWithCode(1),  "");
} 

*_DEBUG_DEATH

Debug版和Release版本下系羞, *_DEBUG_DEATH的定義不一樣郭计。因?yàn)楹芏喈惓V粫?huì)在Debug版本下拋出,而在Realease版本下不會(huì)拋出椒振,所以針對(duì)Debug和Release分別做了不同的處理昭伸。
例:

int DieInDebugElse12(int* sideeffect) {
    if (sideeffect) *sideeffect = 12;
#ifndef NDEBUG
    GTEST_LOG_(FATAL, "debug death inside DieInDebugElse12()");
#endif  // NDEBUG
    return 12;
}

TEST(TestCase, TestDieOr12WorksInDgbAndOpt)
{
    int sideeffect = 0;
    // Only asserts in dbg.
    EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), "death");

    #ifdef NDEBUG
    // opt-mode has sideeffect visible.
    EXPECT_EQ(12, sideeffect);
    #else
    // dbg-mode no visible sideeffect.
    EXPECT_EQ(0, sideeffect);
    #endif
}

正則表達(dá)式

內(nèi)容

表達(dá)式 含義
匹配任何文字字符c
\d 匹配任何十進(jìn)制數(shù)字
\D 匹配任何不是十進(jìn)制數(shù)字的字符
\f 匹配 \f
\n 匹配\n
\r 匹配 \r
\s 匹配任何ASCII空白,包括\n
\S 匹配任何不是空格的字符
\t 匹配 \t
\v 匹配\v
\w 匹配任何字母澎迎、_或十進(jìn)制數(shù)字
\W 匹配\w不匹配的任何字符
\c 匹配任何文字字符c庐杨,該字符必須是標(biāo)點(diǎn)符號(hào)。
. 匹配除\n以外的任何單個(gè)字符
A? 匹配0或1次A
A* 匹配0或多次出現(xiàn)的A
A+ 匹配1次或多次發(fā)生的A
^ 匹配字符串的開頭(不是每一行的開頭)
$ 匹配字符串的末尾(不是每一行的結(jié)尾)
xy 匹配x后面跟著y

注:\f:換頁(yè)夹供。將當(dāng)前位置移到下一頁(yè)開頭灵份。
\n:回車換行。將當(dāng)前位置移到下一行開頭哮洽。
\r:回車填渠。將當(dāng)前位置移到本行開頭。
\t:水平制表符鸟辅。將當(dāng)前位置移到下一個(gè)Tab位置揭蜒。
\v:垂直制表符。直接跳到下一行的當(dāng)前位置剔桨。

風(fēng)格

googletest有兩種宏,用來表示當(dāng)前系統(tǒng)支持哪套正則表達(dá)式風(fēng)格:

  1. POSIX風(fēng)格:GTEST_USES_POSIX_RE = 1 (POSIX系統(tǒng):Linux, Cygwin, 和 Mac)
  2. Simple風(fēng)格:GTEST_USES_SIMPLE_RE=1

致命斷言的運(yùn)行方式

  1. fast方式(默認(rèn)的方式)
testing::FLAGS_gtest_death_test_style = "fast";    
  1. threadsafe方式
testing::FLAGS_gtest_death_test_style = "threadsafe";  

注意事項(xiàng)

  1. 不要在致命斷言測(cè)試?yán)镝尫艃?nèi)存徙融。

  2. 在父進(jìn)程里再次釋放內(nèi)存洒缀。

  3. 不要在程序中使用內(nèi)存堆檢查。

文章參考:https://www.cnblogs.com/coderzh/archive/2009/04/08/1432043.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欺冀,一起剝皮案震驚了整個(gè)濱河市树绩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隐轩,老刑警劉巖饺饭,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異职车,居然都是意外死亡瘫俊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門悴灵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扛芽,“玉大人,你說我怎么就攤上這事积瞒〈猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵茫孔,是天一觀的道長(zhǎng)叮喳。 經(jīng)常有香客問我被芳,道長(zhǎng),這世上最難降的妖魔是什么馍悟? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任畔濒,我火速辦了婚禮,結(jié)果婚禮上赋朦,老公的妹妹穿的比我還像新娘篓冲。我一直安慰自己,他們只是感情好宠哄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布壹将。 她就那樣靜靜地躺著,像睡著了一般毛嫉。 火紅的嫁衣襯著肌膚如雪诽俯。 梳的紋絲不亂的頭發(fā)上卸耘,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天孤钦,我揣著相機(jī)與錄音,去河邊找鬼晾虑。 笑死辛臊,一個(gè)胖子當(dāng)著我的面吹牛仙粱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彻舰,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼伐割,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了刃唤?” 一聲冷哼從身側(cè)響起隔心,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尚胞,沒想到半個(gè)月后硬霍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笼裳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年唯卖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躬柬。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耐床,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出楔脯,到底是詐尸還是另有隱情撩轰,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站堪嫂,受9級(jí)特大地震影響偎箫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜皆串,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一淹办、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恶复,春花似錦怜森、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翅萤,卻和暖如春恐疲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背套么。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工培己, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胚泌。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓省咨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親玷室。 傳聞我的和親對(duì)象是個(gè)殘疾皇子零蓉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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