在 Windows 上,我的断言宏基本上如下所示:
#define MYASSERT(condition) (if (!(condition)) { ReportFailture( #condition, __FILE__, __LINE__, __FUNCTION__); __debugbreak(); }
在 Google Test 中,我试图检查不良条件的输出以测试越界断言等:
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) 中的调试异常作为一种特殊情况进行处理。但是,我想捕获断言并验证其内容。
正确的做法是什么?我是否需要为谷歌测试定义一个特殊断言宏?如果是,它应该做什么?
我注意到用 assert(false) 替换我的 assert(通过 assert.h 包含)并没有出现这个问题 - 它有什么不同之处?
最佳答案
问题是您正在调用 __debugbreak()
,这会导致您的代码抛出断点异常。正如您在死亡测试文档 ( https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#death-tests ) 中看到的那样,如果代码抛出异常,则它不会被 googletest 中的死亡测试视为“死亡”。
就您的其他问题而言,assert.h 中的assert
调用std::abort
(这会导致程序终止)。根据死亡测试的定义,这就是“死亡”。
关于c++ - 使用 __debugbreak 在 GoogleTest 中捕获自定义断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38254327/