単体テストに CppUnit を使用しているコードベースがあります。プロジェクトにいくつかの MPI コードを追加していて、MPI の上に構築しているいくつかの抽象化を単体テストしたいと考えています。たとえば、コンシューマが作業を要求し、プロデューサがコンシューマに送信する次の作業をシリアル化する、単一のプロデューサ/複数のコンシューマの関係を管理するコードをいくつか書きました。その相互作用だけをテストしたいと思います。プロデューサでいくつかの偽の作業項目を生成し、それらをコンシューマに配布するテストを使用して、コンシューマにある種のチェックサムを送り返し、すべてが配布され、デッドロックなどがないことを確認します。
ここで何が最も効果的かを経験した人はいますか? 私が考えてきたいくつかのこと:
- すべてのプロセスがテスト関数を同じ順序で実行するように、すべてのプロセスでテスト ランナーを実行することは合理的ですか? それとも、マスターのみがテストランナーを実行し、ブロードキャストをスレーブに送信して次に何をすべきかを伝える方が良いでしょうか?
- スレーブ内で CPPUNIT_ASSERT を使用することは何らかの方法で正気ですか、それともアサーションのためにすべての情報をマスターに送り返す必要がありますか? スレーブがアサートできる場合、すべての結果をどのように組み合わせて単一の出力ログを取得する必要がありますか?
- あるプロセスでスローされた例外が同期の問題を引き起こさないように、テストの失敗をどのように処理する必要がありますか?たとえば、別のプロセスが一致する MPI_Send が発生しない MPI_Recv を待機しているためです