仕事で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_THROW
fails を出力する必要があります。
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 を実行するのが最も簡単であることがわかりました。幸いなことに、デバッグを有効にしてすべてのコードをコンパイルします =]。