如何在 google test in windows 中管理断言

How to manage assertions in googletest in windows

本文关键字:windows 管理 断言 in test google      更新时间:2023-10-16

我正在使用googletest来检查任何派生类是否以某种方式实现函数。

其中一个约束是,如果找不到应该找到的数据,它应该调用assert(false);。如果你想知道,这是因为数据不可用是编程错误,它不应该发生。

现在我想为这个接口函数编写一个单元测试,我正在使用TYPED_TEST_P,其中要测试的类类型作为参数给出。

给出的示例是简化。

TYPED_TEST_P(InterfaceFuntionTests, CheckThatCallAssertsOnNull)
{
// All m_ prefixed variables are given from the test instantiation.
// Since we do not know what combination of values is invalid for each
// class that implements compute.
EXPECT_DEATH(m_model->compute(m_value1, m_value2, m_value3, m_value4, "Time to die.");
}

一切正常,但 Windows 想要显示"Abort/Retry/Ignore"窗口。

禁用此窗口的最佳方法是什么?我一直在想谷歌测试可能会以某种方式解决这个问题。

_CrtSetReportMode( _CRT_ASSERT,  _CRTDBG_MODE_DEBUG);
// This eats the assertions and the test doesn't work.
_CrtSetReportHook(functionThatReturnsTrue);
// This eats the assertions and the test doesn't work.

请注意,此问题特定于Windows


我很想删除这个问题,因为我找到了一个有效的解决方案。

如果有人有更好的答案,我会把这个问题留在这里。

我的解决方案是在报告钩子函数中调用 std::abort(-1(。

这与问题没有直接关系,但看起来这是一个 XY 问题。 真正听起来像代码气味的是:

检查任何派生类是否以某种方式实现函数

如果每个派生类都必须抛出(如果它们被赋予一个 nullptr 作为输入参数(,那么您可能希望在接口和实际实现类之间有一个基类,该基类在调用特定的派生类方法之前执行一次作业。

这是使用非虚拟接口 (NVI( 模式的示例。

简而言之 标题将是

Interface::setPtr(void * ptr) = 0 ;
BaseClass::setPtr(void * ptr) final;
BaseClass::setPtr_impl(void * ptr) = 0;
SpecificClass::setPtr_impl(void * ptr);

实施将是

BaseClass::setPtr(void * ptr) {
assert(ptr != nullptr);
setPtr_impl(ptr);
}
SpecificClass::setPtr_impl(void * ptr)
{
//actual code, ptr can not be null
}

所有这些都要求您没有可能使 PTR 无效的多线程。

执行std::abort(-1);以退出提供给_CrtSetReportHook的函数似乎可以使一切正常工作。

这是有效的,因为googletest生成了另一个进程来执行测试(使用EXPECT_DEATH(。它实际上期待这种情况发生。