使用 Google Test 对自定义 Assert 函数进行单元测试

Unit testing of custom Assert function using Google Test

我正在使用 Boost.Assert 库,并且有这个自定义断言代码,需要使用 Google 测试框架进行单元测试:

    #include <boost/assert.hpp>
    #define ASSERT(expr)                BOOST_ASSERT(expr)
    #define ASSERT_MSG(expr, msg)       BOOST_ASSERT_MSG(expr, msg)

    namespace boost {
        inline void assertion_failed_msg(char const* expr, char const* msg, char const* function, char const* /*file*/, long /*line*/) {
            std::cerr << "Expression '" << expr << "' is false in function '" << function << "': " << (msg ? msg : "<...>") << ".\n"
                << "Backtrace:\n" << boost::stacktrace::stacktrace() << std::endl;

            std::abort();
        }

        inline void assertion_failed(char const* expr, char const* function, char const* file, long line) {
            ::boost::assertion_failed_msg(expr, 0 /*nullptr*/, function, file, line);
        }
    } // namespace boost

想法是检查 ASSERT( 1!=1 ) 是否使用适当的错误代码和错误日志消息终止程序。

我知道 Google 测试,死亡测试。我有以下结构,哪种适合我:

void assert_death_test() 
{
    ASSERT( 1!=1 );
}

TEST(unit_test_DeathTest, test_of_assert_function) {
    EXPECT_EXIT(assert_death_test(), ::testing::KilledBySignal(SIGABRT), "Stuff hit the fan.");
}

由于我正在使用死亡测试,ASSERT(...) 不会终止单元测试,并且死亡测试会注意到程序退出并显示一些日志消息。问题是这样的:

Death test: assert_death_test()
    Result: died but not with expected error.
  Expected: contains regular expression "Stuff hit the fan."
Actual msg:
[  DEATH   ] Expression '1!=1' is false in function 'void assert_death_test()': <...>.
[  DEATH   ] Backtrace:
[  DEATH   ]  0# boost::assertion_failed_msg(char const*, char const*, char const*, char const*, long) in ./executable
[  DEATH   ]  1# boost::assertion_failed(char const*, char const*, char const*, long) in ./executable
[  DEATH   ]  2# assert_death_test() in ./executable
[  DEATH   ]  3# unit_test_DeathTest_test_of_assert_function_Test::TestBody() in ./executable
.
. // Continues with more log messages
.

由于这个问题,测试被计为失败,而通常是成功的。 (断言杀死程序,并向标准输出发送日志消息)

我该如何解决这个问题? (替代方法也适用)

有没有办法强制测试输出成功?

您正在设置 "Stuff hit the fan." 将在程序退出时记录的期望,但您的断言没有任何消息,所以这可能是这里的问题。测试失败,因为您希望记录一条未添加到此处的自定义消息。请尝试:

void assert_death_test() 
{
    ASSERT( 1!=1,  "Stuff hit the fan.");
}

当您在此处实现自定义消息时,我还将其添加到预期输出中,即预期字符串还应包含 "Expression '"...

问题已通过以下行解决:

EXPECT_DEATH(assert_death_test(), "Expression '.*");

正如@Quarra 所指出的,我的主要问题是没有创建有效的正则表达式字符串。

EXPECT_DEATH 也更合适,因为 ASSERT(...) 会杀死程序。