您的位置  > 互联网

基于的死亡测试案例研究(二十五)——gtest

“死亡测试”这个名字就相当可怕了。 这里的“死”是指程序崩溃。 通常在测试过程中,我们需要考虑各种输入。 有些输入可能会直接导致程序崩溃。 这时,我们需要检查程序是否按预期挂起。 这就是所谓的“死亡测试”。 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 `),我们可以非常方便地编写导致崩溃的测试用例,并评估崩溃用例的结果,而不影响其他用例的执行。 检查。

系列链接: