我正在使用Boost.Assert库,并具有以下自定义断言代码,需要使用Google Test框架进行单元测试:
#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
.
由于这个问题,测试被认为是失败,而通常是成功。(断言杀死程序,并向stdout发送一条日志消息)
我怎么解决这个问题?(替代方法也适用)
有没有办法强迫测试输出成功?
该问题用以下行解决:
EXPECT_DEATH(assert_death_test(), "Expression '.*");
我的主要问题不是像@Quarra所指出的那样创建有效的正则表达式字符串。
EXPECT_DEATH
也更合适,因为它会ASSERT(...)
杀死程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句