如何运行Boost测试并生成Minidumps?

时间:2017-10-04 01:20:37

标签: c++ unit-testing boost boost-test google-breakpad

我们的项目使用Boost.Test进行单位测试。我们希望在我们的测试用例期间发生意外异常时获得小型转储,因此我们开始集成Google Breakpad来编写小型转储。

看起来Boost.Test正在拦截用户测试中抛出的所有异常 - 我假设因为Boost测试用例用try / catch包装每个函数,如果抛出意外异常,单元测试就会失败。这可以防止Breakpad异常处理程序触发和编写minidump。

Boost.Test是否有可能在单元测试中捕获并失败意外异常?而是让异常无法处理(或重新抛出),以便可以触发Breakpad或其他异常处理程序来编写minidump?

2 个答案:

答案 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。但它确实可以解决问题。