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

标签 c++ windows unit-testing googletest assertions

在 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/

相关文章:

c++ - 非模板类与模板类的多重定义

python - 从 Python 程序获取 WinWord 版本

c++ - 我应该如何在 Windows 中从一个程序运行另一个程序?

Java:写入 Windows 临时目录中的 tempFile

c# - .NET 中的单元测试服务层

c++ - 如何通过Qdialog中的qtablewidget填充作为MainWindow成员的qvector

c++ - "Segmentation fault"与 "run time"错误?

unit-testing - SBT 中的基本测试功能

c# - 为什么在单元测试中实例化ListView时SelectedIndices和SelectedItems不起作用?

c++ - 在 C++ 中显式声明默认方法