使用 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(...)
会杀死程序。
我正在使用 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(...)
会杀死程序。