仕事でgooglemockを使用しています。EXPECT_THROW、EXPECT_NO_THROWなどをよく使用します...
私の質問は、関数が EXPECT_NO_THROW でラップされているが、実際には例外 (つまり、コードのバグ) をスローするときに、googlemock に例外の詳細とおそらくスタック トレースを出力させるにはどうすればよいですか?
私が得た唯一の出力は、例外をスローしてテストに失敗したことです...これは、根本原因のデバッグには役立ちません。
仕事でgooglemockを使用しています。EXPECT_THROW、EXPECT_NO_THROWなどをよく使用します...
私の質問は、関数が EXPECT_NO_THROW でラップされているが、実際には例外 (つまり、コードのバグ) をスローするときに、googlemock に例外の詳細とおそらくスタック トレースを出力させるにはどうすればよいですか?
私が得た唯一の出力は、例外をスローしてテストに失敗したことです...これは、根本原因のデバッグには役立ちません。
EXPECT_THROW、EXPECT_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.")
明らかに、ここにさらに機能を追加できます。カスタム例外タイプのキャッチ、失敗メッセージをフォーマットして例外情報を含めるなど。
一般に、GMock/GTest は、キャッチされたオブジェクトに対して何もすることができません。コードが好きなだけサブクラスをスローしたと仮定することはできませんstd::exception.C++は、スタックフレームとデバッグシンボルが実際に存在する場合でも、例外が発生したときにスタックトレースを保存する手段を提供しません.あなたのバイナリで。
しかし、単体テストは実際には検証のための手法であり、他のツールは診断のための友でなければなりません。一時的なロギング (例: printf) を追加する場合でも、 などのインタラクティブなデバッガーを追加する場合でもgdb、その作業に適したツールがあります。
単体テスト バイナリで gdb を実行するのが最も簡単であることがわかりました。幸いなことに、デバッグを有効にしてすべてのコードをコンパイルします =]。