使用 __debugbreak 在 GoogleTest 中捕获自定义断言
Catching custom assert in GoogleTest using __debugbreak
在 Windows 上,我的断言宏基本上如下所示:
#define MYASSERT(condition) (if (!(condition)) { ReportFailture( #condition, __FILE__, __LINE__, __FUNCTION__); __debugbreak(); }
并且在 Google 测试中,我正在尝试检查不良条件的输出以测试越界断言等:
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 测试定义一个 special assert 宏?如果是应该怎么办?
我注意到用 assert(false) 替换我的断言(包含在 assert.h 中)并没有引起这个问题 - 它有什么不同?
问题是您正在调用 __debugbreak()
,这会导致您的代码抛出断点异常。正如您在死亡测试文档 (https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#death-tests) 中看到的那样,如果代码抛出异常,googletest 中的死亡测试不会将其视为 "death"。
就您的其他问题而言,assert
来自 assert.h calles std::abort
(这会导致程序终止)。这是"death"死亡测试的定义。
在 Windows 上,我的断言宏基本上如下所示:
#define MYASSERT(condition) (if (!(condition)) { ReportFailture( #condition, __FILE__, __LINE__, __FUNCTION__); __debugbreak(); }
并且在 Google 测试中,我正在尝试检查不良条件的输出以测试越界断言等:
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 测试定义一个 special assert 宏?如果是应该怎么办?
我注意到用 assert(false) 替换我的断言(包含在 assert.h 中)并没有引起这个问题 - 它有什么不同?
问题是您正在调用 __debugbreak()
,这会导致您的代码抛出断点异常。正如您在死亡测试文档 (https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#death-tests) 中看到的那样,如果代码抛出异常,googletest 中的死亡测试不会将其视为 "death"。
就您的其他问题而言,assert
来自 assert.h calles std::abort
(这会导致程序终止)。这是"death"死亡测试的定义。