玩转Google单元测试框架gtest系列之五:死亡测试

发表于:2010-4-06 15:19

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:CoderZh    来源:www.cnblogs.com/coderzh

  一、前言

  “死亡测试”名字比较恐怖,这里的“死亡”指的的是程序的崩溃。通常在测试过程中,我们需要考虑各种各样的输入,有的输入可能直接导致程序崩溃,这时我们就需要检查程序是否按照预期的方式挂掉,这也就是所谓的“死亡测试”。gtest的死亡测试能做到在一个安全的环境下执行崩溃的测试案例,同时又对崩溃结果进行验证。

  二、使用的宏

Fatal assertionNonfatal assertionVerifies
ASSERT_DEATH(statement, regex`);EXPECT_DEATH(statement, regex`);statementcrashes with the given error
ASSERT_EXIT(statement, predicate, regex`);EXPECT_EXIT(statement, predicate, regex`);statementexits with the given error and its exit code matchespredicate

  由于有些异常只在Debug下抛出,因此还提供了*_DEBUG_DEATH,用来处理Debug和Realease下的不同。

  三、*_DEATH(statement, regex`)

  1. statement是被测试的代码语句

  2. regex是一个正则表达式,用来匹配异常时在stderr中输出的内容

  如下面的例子:

void Foo()
{
    
int *pInt = 0;
    
*pInt = 42 ;
}

TEST(FooDeathTest, Demo)
{
    EXPECT_DEATH(Foo(), 
"");
}

  重要:编写死亡测试案例时,TEST的第一个参数,即testcase_name,请使用DeathTest后缀。原因是gtest会优先运行死亡测试案例,应该是为线程安全考虑。

  四、*_EXIT(statement, predicate, regex`)

  1. statement是被测试的代码语句

  2. predicate 在这里必须是一个委托,接收int型参数,并返回bool。只有当返回值为true时,死亡测试案例才算通过。gtest提供了一些常用的predicate:

testing::ExitedWithCode(exit_code)

  如果程序正常退出并且退出码与exit_code相同则返回 true

testing::KilledBySignal(signal_number)  // Windows下不支持

  如果程序被signal_number信号kill的话就返回true

  3. regex是一个正则表达式,用来匹配异常时在stderr中输出的内容

  这里, 要说明的是,*_DEATH其实是对*_EXIT进行的一次包装,*_DEATH的predicate判断进程是否以非0退出码退出或被一个信号杀死。

  例子:

TEST(ExitDeathTest, Demo)
{
    EXPECT_EXIT(_exit(
1),  testing::ExitedWithCode(1),  "");
}

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号