概念
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下的不同姐帚。
- statement是被測(cè)試的代碼語句吏垮。
- 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`)
- statement是被測(cè)試的代碼語句
- predicate 在這里必須是一個(gè)委托媳谁,接收int型參數(shù),并返回bool友酱。只有當(dāng)返回值為true時(shí)晴音,死亡測(cè)試案例才算通過。gtest提供了一些常用的predicate:
testing::ExitedWithCode(exit_code) //如果程序正常退出并且退出碼與exit_code相同則返回 true
- 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)格:
- POSIX風(fēng)格:GTEST_USES_POSIX_RE = 1 (POSIX系統(tǒng):Linux, Cygwin, 和 Mac)
- Simple風(fēng)格:GTEST_USES_SIMPLE_RE=1
致命斷言的運(yùn)行方式
- fast方式(默認(rèn)的方式)
testing::FLAGS_gtest_death_test_style = "fast";
- threadsafe方式
testing::FLAGS_gtest_death_test_style = "threadsafe";
注意事項(xiàng)
不要在致命斷言測(cè)試?yán)镝尫艃?nèi)存徙融。
在父進(jìn)程里再次釋放內(nèi)存洒缀。
不要在程序中使用內(nèi)存堆檢查。
文章參考:https://www.cnblogs.com/coderzh/archive/2009/04/08/1432043.html