7

仕事でgooglemockを使用しています。EXPECT_THROW、EXPECT_NO_THROWなどをよく使用します...

私の質問は、関数が EXPECT_NO_THROW でラップされているが、実際には例外 (つまり、コードのバグ) をスローするときに、googlemock に例外の詳細とおそらくスタック トレースを出力させるにはどうすればよいですか?

私が得た唯一の出力は、例外をスローしてテストに失敗したことです...これは、根本原因のデバッグには役立ちません。

4

4 に答える 4

2

EXPECT_THROWEXPECT_NO_THROWなどは、実際にはGoogle Mock ではなくGoogle Testの一部です。

gtest ソースをハッキングする以外に、例外に関する詳細情報を取得する方法がわかりません。s の場合std::exceptionのみ、次の変更は、少なくとも例外のwhat()when anEXPECT_NO_THROWまたはASSERT_NO_THROWfails を出力する必要があります。

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.")

明らかに、ここにさらに機能を追加できます。カスタム例外タイプのキャッチ、失敗メッセージをフォーマットして例外情報を含めるなど。

于 2012-07-11T23:44:38.223 に答える
0

一般に、GMock/GTest は、キャッチされたオブジェクトに対して何もすることができません。コードが好きなだけサブクラスをスローしたと仮定することはできませんstd::exception.C++は、スタックフレームとデバッグシンボルが実際に存在する場合でも、例外が発生したときにスタックトレースを保存する手段を提供しません.あなたのバイナリで。

しかし、単体テストは実際には検証のための手法であり、他のツールは診断のための友でなければなりません。一時的なロギング (例: printf) を追加する場合でも、 などのインタラクティブなデバッガーを追加する場合でもgdb、その作業に適したツールがあります。

于 2015-05-04T12:02:35.273 に答える
-1

単体テスト バイナリで gdb を実行するのが最も簡単であることがわかりました。幸いなことに、デバッグを有効にしてすべてのコードをコンパイルします =]。

于 2012-07-12T15:46:50.037 に答える