如何 运行 提升测试并生成小型转储?
How to run Boost Test and produce Minidumps?
我们的项目使用 Boost.Test 进行单元测试。我们也希望在测试用例期间发生意外异常时获得小型转储,因此我们已经开始集成 Google Breakpad 来编写小型转储。
看起来 Boost.Test 正在拦截用户测试中抛出的所有异常 - 我假设是因为 Boost 测试用例用 try / catch 包装每个函数,如果抛出意外异常,单元测试就会失败.这可以防止 Breakpad 异常处理程序触发和写入小型转储。
是否有可能 Boost.Test 不只是在单元测试中捕获意外异常并失败?而是让异常未处理(或重新抛出),以便可以触发 Breakpad 或其他异常处理程序来编写小型转储?
Boost.Test 旨在捕获测试用例的所有异常,以便继续执行其他测试用例。我认为您无法关闭此行为,但您可以随时查阅源代码。
为了实现您的目标,我会自己包装测试用例的主体并捕获异常,并在抛出意外异常时写出 breakpad minidumps。您可以通过将 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
});
}
如果你使用固定装置,它会更复杂,但同样的想法也适用。
我尝试了几种不同的方法,但以下解决方案提供了最佳结果。定义一个宏来包装 BOOST_AUTO_TEST_CASE 宏,并用 SEH __try/__except 包围调用代码,并将异常数据通过管道传输到 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。但它确实有效。
我们的项目使用 Boost.Test 进行单元测试。我们也希望在测试用例期间发生意外异常时获得小型转储,因此我们已经开始集成 Google Breakpad 来编写小型转储。
看起来 Boost.Test 正在拦截用户测试中抛出的所有异常 - 我假设是因为 Boost 测试用例用 try / catch 包装每个函数,如果抛出意外异常,单元测试就会失败.这可以防止 Breakpad 异常处理程序触发和写入小型转储。
是否有可能 Boost.Test 不只是在单元测试中捕获意外异常并失败?而是让异常未处理(或重新抛出),以便可以触发 Breakpad 或其他异常处理程序来编写小型转储?
Boost.Test 旨在捕获测试用例的所有异常,以便继续执行其他测试用例。我认为您无法关闭此行为,但您可以随时查阅源代码。
为了实现您的目标,我会自己包装测试用例的主体并捕获异常,并在抛出意外异常时写出 breakpad minidumps。您可以通过将 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
});
}
如果你使用固定装置,它会更复杂,但同样的想法也适用。
我尝试了几种不同的方法,但以下解决方案提供了最佳结果。定义一个宏来包装 BOOST_AUTO_TEST_CASE 宏,并用 SEH __try/__except 包围调用代码,并将异常数据通过管道传输到 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。但它确实有效。