使用 __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"死亡测试的定义。