当前位置: > 手游资讯 > 游戏攻略 

测试死亡时间(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`),我们可以轻松编写导致崩溃的测试用例测试死亡时间,而又不影响其他用例的执行。崩溃的情况。