测试死亡时间(Gtest:死亡测试)
Gtest:死亡测试
转贴自:使用Google的开源C ++单元测试框架Google Test系列(gtest)第五次死亡测试
一、前言
“死亡测试”这个名字令人恐惧。这里的“死亡”是指程序的崩溃。通常在测试过程中,我们需要考虑各种输入。某些输入可能直接导致程序崩溃。这时,我们需要检查程序是否以预期的方式挂起。这就是所谓的“死亡测试”。 gtest的死亡测试可以在安全的环境中执行崩溃测试用例,同时验证崩溃结果。
二、使用的宏
致命断言
非致命断言
验证
ASSERT_DEATH(声明,正则表达式);
EXPECT_DEATH(statement,regex`);
语句因给定的错误而崩溃
ASSERT_EXIT(语句,谓词,正则表达式);
EXPECT_EXIT(语句,谓词,正则表达式);
语句以给定的错误退出,并且退出代码与谓词相符
由于某些异常仅在Debug下引发测试死亡时间,因此还提供了* _DEBUG_DEATH来处理Debug和Realease之间的差异。
三、* _ DEATH(语句,正则表达式)
1.语句是要测试的代码语句
2.regex是一个正则表达式,用于在发生异常时匹配stderr中输出的内容
如以下示例:
voidFoo()
{
int * pInt = 0;
* pInt = 42;
}
TEST(FooDeathTest,Demo)
{
EXPECT_DEATH(Foo(),“”);
}
重要:在编写死亡测试用例时,请对TEST的第一个参数testcase_name使用DeathTest后缀。原因是gtest将优先考虑运行死测试用例,这应该是出于线程安全考虑。
四、* _ EXIT(语句,谓词,正则表达式)
1.语句是要测试的代码语句
2.谓词在这里必须是一个委托,接收一个int参数并返回一个布尔值。仅当返回值为true时,死亡测试用例才能通过。 gtest提供了一些常用谓词:
testing :: ExitedWithCode(exit_code)
如果程序正常退出,并且退出代码与exit_code相同,则返回true
testing :: KilledBySignal(signal_number)// Windows不支持
如果程序被signal_number信号杀死,则返回true
3.regex是一个正则表达式,用于在发生异常时匹配stderr中输出的内容
在这里,应该注意* _DEATH实际上是* _EXIT的程序包,而* _DEATH的谓词确定该进程是使用非零退出代码退出还是被信号杀死。
示例:
TEST(ExitDeathTest,Demo)
{
EXPECT_EXIT(_exit(1),testing :: ExitedWithCode(1),“”);
}
五、* _ DEBUG_DEATH
首先查看定义:
#ifdefNDEBUG
#defineEXPECT_DEBUG_DEATH(语句,正则表达式)\
do {statement;} while(false)
#defineASSERT_DEBUG_DEATH(语句,正则表达式)\
do {statement;} while(false)
#else
#defineEXPECT_DEBUG_DEATH(语句,正则表达式)\
EXPECT_DEATH(语句,正则表达式)
#defineASSERT_DEBUG_DEATH(语句,正则表达式)\
ASSERT_DEATH(语句,正则表达式)
#endif // NDEBUGforEXPECT_DEBUG_DEATH
如您所见,* _ DEBUG_DEATH的定义在Debug版本和Release版本中有所不同。由于仅在Debug版本中引发了许多异常,而在Realease版本中未引发,因此分别对Debug和Release进行了不同的处理。查看gtest随附的示例以了解:
intDieInDebugElse12(int * sideeffect){
if(sideeffect)* sideeffect = 12;
#ifndefNDEBUG
GTEST_LOG_(FATAL,“ debugdeathinsideDieInDebugElse12()”);
#endif // NDEBUG
return12;
}
TEST(TestCase,TestDieOr12WorksInDgbAndOpt)
{
intsideeffect = 0;
// Onlyassertsindbg。
EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect),“死亡”);
#ifdefNDEBUG
// opt-mode有副作用。
EXPECT_EQ(12,sideeffect);
#else
// dbg-modenovisible副作用。
EXPECT_EQ(0,sideeffect);
#endif
}
六、关于正则表达式
在POSIX系统(Linux,Cygwin和Mac)中,POSIX样式的正则表达式用于gtest的死亡测试。如果您想了解POSIX样式的表达式,请参阅:
1.
2.。
在Windows系统中,gtest的死亡测试使用由gtest本身实现的简单正则表达式语法。与POSIX样式相比,gtest的简单正则表达式的内容要少得多,例如(“ x | y”),(“(xy)”),(“ [xy]”)和(“ x {5,7}” )不受支持。
以下是一些简单正则表达式支持的内容:
与任何文字字符匹配
\\ d
匹配任何十进制数字
\\ D
匹配所有非十进制数字的字符
\\ f
匹配\ f
\\ n
匹配项\ n
\\ r
匹配项\ r
\\ s
匹配任何ASCII空格,包括\ n
\\ S
匹配所有非空格字符
\\ t
匹配\ t
\\ v
匹配\ v
\\ w
匹配任何字母,_或十进制数字
\\ W
匹配\\ w不匹配的任何字符
\\ c
匹配任何文字字符,必须为标点符号
。
匹配除\ n
以外的任何单个字符
匹配0或1次出现的A
A *
匹配0或多次出现的A
A +
匹配1个或多次出现的A
^
匹配字符串的开头(而不是每一行的开头)
$
匹配字符串的末尾(而不是每一行的末尾)
xy
matchesx跟着byy
gtest定义了两个宏,以指示当前系统支持哪些正则表达式样式集:
1. POSIX样式:GTEST_USES_POSIX_RE = 1
2.简单样式:GTEST_USES_SIMPLE_RE = 1
七、死亡测试操作模式
1.快速模式(默认模式)
testing :: FLAGS_gtest_death_test_style =“ fast”;
2.线程安全方法
testing :: FLAGS_gtest_death_test_style =“ threadsafe”;
您可以在main()中为所有死亡测试设置测试格式,也可以为特定测试单独设置测试格式。 Google测试会在每次测试之前保存该标记,并在测试完成后将其还原,因此您无需担心这部分工作。如:
TEST(MyDeathTest,TestOne){
testing :: FLAGS_gtest_death_test_style =“ threadsafe”;
//此测试以“线程安全”样式运行:
ASSERT_DEATH(ThisShouldDie(),“”);
}
TEST(MyDeathTest,TestTwo){
//此测试以“快速”样式运行:
ASSERT_DEATH(ThisShouldDie(),“”);
}
intmain(intargc,char ** argv){
testing ::: InitGoogleTest(&argc,argv);
testing :: FLAGS_gtest_death_test_style =“ fast”;
returnRUN_ALL_TESTS();
}
八、注释
1.不要在死亡测试中释放记忆。
2.在父进程中再次释放内存。
3.不要在程序中使用内存堆检查。
九、摘要
关于死亡测试,官方的gtest文档非常详细,并且在源代码中也有很多示例。如果您想了解更多信息,请参考官方文档,或直接查看gtest源代码。
简单来说,通过* _DEATH(statement,regex`)和* _EXIT(statement,predicate,regex`),我们可以轻松编写导致崩溃的测试用例测试死亡时间,而又不影响其他用例的执行。崩溃的情况。