使用__debugbreak在GoogleTest中捕获自定义断言

时间:2016-07-07 20:03:18

标签: c++ windows unit-testing googletest assertions

在Windows上,我的断言宏基本上是这样的:

#define MYASSERT(condition) (if (!(condition)) { ReportFailture( #condition, __FILE__, __LINE__, __FUNCTION__); __debugbreak(); }

在谷歌测试中,我试图检查一个不良条件的输出来测试超出限制的断言等:

ASSERT_DEATH( { MYASSERT(false); }, "");

然而,所有这一切都会报告以下消息:

Running main() from gtest_main.cc
..\Test\FormatUnitTest\Test_Format.cpp(59): error: Death test: { if (!(false)) { ReportFailture( "false", ..\\Test\\UnitTest\\Test.cpp", 59,  __FSTREXP __FUNCTION_
_   ); __debugbreak(); }; }

Result: illegal return in test statement.
Error msg:
[  DEATH   ]

似乎GoogleTest正在处理结构化异常处理程序(SEH)中的调试异常作为一种特殊情况。但是,我想抓住断言并验证它的内容。

这里的举动是什么?我是否需要为Google测试定义特殊断言宏?如果是这样,该怎么办?

我注意到用assert(false)替换我的断言(通过assert.h包含)不会调用这个问题 - 它有什么不同的做法?

1 个答案:

答案 0 :(得分:1)

问题是您正在调用__debugbreak(),这会导致代码抛出断点异常。正如您在死亡测试文档(https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#death-tests)中所看到的,如果代码抛出异常,则googletest中的死亡测试不会将其视为“死亡”。

就你的其他问题而言,来自 assert.h assert calles std::abort(导致程序终止)。根据死亡测试的定义,这是“死亡”。