“死亡测试”这个名字就相当可怕了。 这里的“死”是指程序崩溃。 通常在测试过程中,我们需要考虑各种输入。 有些输入可能会直接导致程序崩溃。 这时,我们需要检查程序是否按预期挂起。 这就是所谓的“死亡测试”。 gtest的死亡测试可以在安全的环境中执行崩溃测试用例,同时验证崩溃结果。
2. 使用的宏
致命的
(,正则表达式`);
(,正则表达式`);
与给定的错误
(,,, 正则表达式 `);
(,,, 正则表达式 `);
退出并显示给定错误及其退出代码
由于有些异常只有在Debug下才会抛出,所以还提供了*来处理Debug下和under下的区别。
3. *(, 正则表达式`)
1. 代码语句是否被测试
2、Regex是正则表达式,用于匹配异常时输出的内容。
比如下面的例子:
无效Foo()
int *pInt = 0;
* pInt = 42;
测试(,演示)
(Foo(), "" );
重要:在编写死亡测试用例时,TEST的第一个参数请使用后缀ie,原因是gtest会优先运行死亡测试用例,这应该是出于线程安全的考虑。
4. *_EXIT( , , 正则表达式 `)
1. 代码语句是否被测试
2.这里必须是委托,接收int类型参数,返回bool。 仅当返回值为 true 时,死亡测试用例才通过。 gtest提供了一些常用的:
::()
如果程序正常退出且退出代码与以下相同则返回 true
::() // 下面不支持
如果程序被信号终止则返回 true
3、Regex是正则表达式,用于匹配异常时输出的内容。
这里需要注意的是,*实际上是*_EXIT的包装,*确定进程是以非0退出码退出还是被信号杀死。
例子:
测试(,演示)
(_exit( 1 ),::( 1 ), "" );
五,*
我们先看一下定义:
#
#(,正则表达式)/
执行 {;} while ( false )
#(,正则表达式)/
执行 {;} while ( false )
#别的
#(,正则表达式)/
(,正则表达式)
#(,正则表达式)/
(,正则表达式)
#万一 //
可以看到,*的定义在Debug版本和版本下是不同的。 因为很多异常只会在 Debug 版本中抛出,而在 Debug 版本中不会抛出,所以针对 Debug 和 Debug 版本做了不同的处理。 看gtest自带的例子就可以理解:
整数(整数*){
如果 () * = 12;
#
(致命的, ” () ” );
#万一 //
12;
测试(,)
整数=0;
// .
(( & ), “ 死亡 ” );
#
// 可选。
(12,);
#别的
// dbg 等。
(0,);
#万一
6.关于正则表达式
中,gtest的死亡测试使用POSIX风格的正则表达式。 要了解POSIX风格的表达式,请参考:
1.
2..
系统中,gtest的死亡测试使用的是gtest本身实现的简单正则表达式语法。 与 POSIX 风格相比,gtest 的简单正则表达式内容少了很多,例如 ("x|y" )、("(xy)" )、("[xy]" ) 和 ("x{5,7}" )不支持。
以下是简单正则表达式支持的一些内容:
任何c
//d
任何数字
//D
任何不是数字的
//F
/F
//n
/n
//r
/r
//s
任何 ASCII,/n
//S
任何不是
//t
/吨
//v
/v
//w
任何 、 _ 或数字
//W
//w 不匹配的任何内容
//C
任何 c ,它必须是 a
任意/n
0 或 1 个 A
A*
0 个或多个 A
A+
1 个或多个 A
a 的 (不是每行的)
a 的末尾(不是每行的末尾)
XY
x x y
gtest定义了两个宏来表示当前系统支持哪些正则表达式样式:
1. POSIX风格:= 1
2.款式:=1
7. 如何运行死亡测试
1.快速模式(默认模式)
::=“快”;
2. 方法
::=“”;
您可以在 main() 中为所有死亡测试设置测试格式,也可以为某个测试单独设置。 Test会在每次测试前保存这个标记,并在测试完成后恢复它,所以你不需要担心这部分工作。 喜欢:
测试(,){
::=“”;
// ““风格:
((), "" );
测试(,){
// “快速”风格:
((), "" );
int main(int argc, char ** argv){
::( & argc,argv);
::=“快”;
();
八、注意事项
1.死亡测试时不要释放内存。
2、在父进程中再次释放内存。
3. 不要在程序中使用内存堆检查。
9. 总结
关于死亡测试,gtest官方文档非常详细,源码中也有大量的例子。 如果想了解更多请参考官方文档,或者直接看gtest源码。
简单来说,通过 *(, regex`) 和 *_EXIT(, , regex `),我们可以非常方便地编写导致崩溃的测试用例,并评估崩溃用例的结果,而不影响其他用例的执行。 检查。
系列链接: