GoogleMock显示更详细的调试信息

时间:2012-07-11 18:56:47

标签: c++ googletest googlemock

我在工作时使用googlemock。我们经常使用EXPECT_THROW,EXPECT_NO_THROW等......

我的问题是,当一个函数包含在EXPECT_NO_THROW中时,你如何让googlemock输出异常细节和堆栈跟踪,但实际上会引发异常(即代码错误)?

我得到的唯一输出是它抛出异常并且测试失败...这对于调试根本原因没有用。

4 个答案:

答案 0 :(得分:2)

EXPECT_THROWEXPECT_NO_THROW等确实是Google Test的一部分,而不是Google Mock。

除了黑客攻击gtest来源之外,我不知道有什么方法可以获得有关异常的更多信息。仅对于std::exception,当what()EXPECT_NO_THROW失败时,以下更改应至少输出例外ASSERT_NO_THROW

在gtest / include / gtest / internal / gtest-internal.h中,在第1140行附近,将GTEST_TEST_NO_THROW_宏更改为:

#define GTEST_TEST_NO_THROW_(statement, fail) \
  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
  if (::testing::internal::AlwaysTrue()) { \
    try { \
      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
    } \
    catch (...) { \
      try { \
        std::exception_ptr exceptn_ptr(std::current_exception()); \
        std::rethrow_exception(exceptn_ptr); \
      } catch(const std::exception& exceptn) { \
        std::cerr << exceptn.what() << '\n'; \
      } \
      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
    } \
  } else \
    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
      fail("Expected: " #statement " doesn't throw an exception.\n" \
           "  Actual: it throws.")

你可以在这里添加更多功能;捕获自定义异常类型,格式化失败消息以包含异常信息等

答案 1 :(得分:1)

您也可以省略断言,让测试用例抛出异常。因此,而不是断言f()不抛出:

ASSERT_NO_THROW(f());

你只需调用该函数:

f();

如果它抛出一个异常,它会给你一个像这样的输出:

C++ exception with description "something broke in f()" thrown in the test body.

这当然只适用于ASSERT_NO_THROW,因为测试用例将终止。

答案 2 :(得分:0)

我发现在单元测试二进制文件上运行gdb最简单。幸运的是,我们使用debug enabled =]编译所有代码。

答案 3 :(得分:0)

一般来说,GMock / GTest无法对捕获的对象做任何事情。它不能只假设您的代码按照您的意愿抛出了std::exception的子类,并且C ++在引发异常时不提供任何保存堆栈跟踪的方法,即使堆栈帧和调试符号实际上存在于二进制文件中。

但是,单元测试确实是一种验证技术,其他工具必须是您诊断的朋友。无论是添加临时日志记录(例如printf)还是交互式调试器(例如gdb),都可以使用更好的工具。