メモリリークに関してテストごとにアサーションを作成するために使用できるCppUnitの拡張機能を知っている人はいますか。
つまり、CPPUNIT_ASSERT_NO_LEAKS()?
基本的に、テストの実行によってメモリリークが発生した場合に、特定のテストに失敗できるようにしたいと考えています。
メモリリークに関してテストごとにアサーションを作成するために使用できるCppUnitの拡張機能を知っている人はいますか。
つまり、CPPUNIT_ASSERT_NO_LEAKS()?
基本的に、テストの実行によってメモリリークが発生した場合に、特定のテストに失敗できるようにしたいと考えています。
Linux で実行している場合は、memcheckでテストを実行できます。
マニュアルのClient Requestsセクションには、いくつかの便利なマクロが説明されており、そのうちの 1 つがテストに役立つと記されています。
VALGRIND_COUNT_LEAKS
: 4 つの引数に、前回のリーク チェックでリーク、疑わしい、到達可能、抑制されていることが判明したメモリのバイト数を入力します。ここでも、 を呼び出した後のテスト ハーネス コードで役立ちVALGRIND_DO_LEAK_CHECK
ます。
マクロは で定義されておりmemcheck.h
(おそらく で/usr/include/valgrind
)、必要なシーケンスは次のようになります。
unsigned long base_definite, base_dubious, base_reachable, base_suppressed;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(base_definite, base_dubious, base_reachable, base_suppressed);
// maybe assert that they're zero!
// call test
unsigned long leaked, dubious, reachable, suppressed;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed);
CPPUNIT_ASSERT_EQUAL(base_leaked, leaked);
// etc.
すべてのテストでそれを繰り返すのは面倒なので、独自のマクロを作成するか、さらには専用のTestRunnerを作成することをお勧めします。
CPPUNIT には、既定ではメモリ リーク チェックがサポートされていません。
プロジェクトは現在再開されています (長い間停止されていました)。これは CPPUNIT2 の機能である可能性があります。作成者に提案 (または書き込み) できます。
メモリ リーク検出をサポートする単体テスト フレームワークを探している場合は、CppUTestを試してみてください。Martin Fowler と Bob Martin がいくつかの TDD コースで使用しているプロジェクトです。それはかなり良いです。
Windows では、デバッグ ヒープへのいくつかの呼び出しを使用して、CppUnit が and を使用してこの情報に基づいて動作するようにするのは非常に簡単なこと_CrtMemCheckpoint()
です_CrtMemDifference()
。
欠点があります:
私が働いている場所では、purifyを使用して単体テストを構築しています。次に、継続的インテグレーションプラットフォームは、成功/失敗したテストケースの数とリークされたバイト数(+ lintとコベリティの結果)の両方を取得し、Webページに表示します。このようにすることを強くお勧めします。
あなたが望む解決策を提供しなかったことをお詫びします。
この質問に答えるには少し遅すぎることは承知しています。しかし、ここにマイクロソフトの優れたツールがあります。私は現在 Linux ユーザーですが、Windows (Visual C++ および Qt) でコードを書いていたときにこれを使用しました http://www.microsoft.com/en-us/download/details.aspx?id=20028
そのことはわかりませんが、Fluid Studiosのメモリマネージャーコードのようなものを使用して、微調整を加えて自分自身にフックすることができます。それを実行するか、テストアプリケーションにコンパイルしてから、テストごとにアプリケーションを1回実行し、メモリ追跡結果を照合するスクリプトを作成します。
valgrindで単体テストを実行します。私が使用している単体テスト フレームワークでは、1 つまたは複数の個別の単体テストを実行できるため、リークの原因となっている単体テストを検出できます。
CppUnit ではないことはわかっていますが、boost::test はメモリ リークの検出を行うことができます。
http://www.boost.org/doc/libs/1_39_0/libs/test/doc/html/execution-monitor/user-guide.htmlから:
void detect_memory_leaks( bool on_off );
void break_memory_alloc( long mem_alloc_order_num );