我们的项目使用Boost.Test进行单位测试。我们希望在我们的测试用例期间发生意外异常时获得小型转储,因此我们开始集成Google Breakpad来编写小型转储。
看起来Boost.Test正在拦截用户测试中抛出的所有异常 - 我假设因为Boost测试用例用try / catch包装每个函数,如果抛出意外异常,单元测试就会失败。这可以防止Breakpad异常处理程序触发和编写minidump。
Boost.Test是否有可能在单元测试中捕获并失败意外异常?而是让异常无法处理(或重新抛出),以便可以触发Breakpad或其他异常处理程序来编写minidump?
答案 0 :(得分:1)
Boost.Test旨在捕获测试用例中的所有异常,以便继续执行其他测试用例。我不认为您可以关闭此行为,但您可以随时查阅源代码。
为了实现您所追求的目标,我将自己包装测试用例的主体并捕获异常并在抛出意外异常时写出breakpad minidump。您可以通过将catch / dump处理程序编写为一个接受函数的函数来进行泛化,该函数是您的测试用例正文,并使用lambda中的测试用例正文调用处理程序:
void handler(std::function<void()> test_case)
{
try {
test_case();
} catch (...) {
write_minidump();
}
}
BOOST_AUTO_TEST_CASE(doit)
{
handler([] {
// do testing here
});
}
如果您使用灯具会更加复杂,但同样的想法也适用。
答案 1 :(得分:1)
我尝试了几种不同的方法,但以下解决方案提供了最佳结果。定义一个宏来包装BOOST_AUTO_TEST_CASE宏,并用SEH __try / __包围调用代码,并将异常数据传递给Breakpad。
#define CUSTOM_AUTO_TEST_CASE( test_name ) \
void test_name##_custom_wrapper(); \
\
BOOST_AUTO_TEST_CASE( test_name ) \
{ \
__try \
{ \
test_name##_custom_wrapper(); \
} \
__except(pHandler->WriteMinidumpForException(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) {} \
} \
\
void test_name##_custom_wrapper() \
其中pHandler是Breakpad ExceptionHandler指针。
缺点是您必须用包装器宏替换每次出现的BOOST_AUTO_TEST_CAST。但它确实可以解决问题。