2012-01-19 6 views
3

私は非同期I/O用のlibeventライブラリを使ってイベント駆動型アプリケーションを書いています。基本的に、アプリケーションにはポート上のデータをリスンするevconnlistenerがあります。データを受信すると、データはデータペイロードに応じて対応するhttp RESTエンドポイントに転送されます。転送コンポーネントは、libeventによって提供されるevhttp_ *を使用します。libeventで管理されるイベント駆動型アプリケーションの単体テストを書くにはどうしたらいいですか?

アプリケーションの健全性を満足させるために、アプリケーションを外部プロセスとしてテストすることはできますが、コードカバレッジレポートの生成に関しては私は困惑しています。 cppunitのような通常のユニットテストフレームワークを介して呼び出すことができるユニットテストを書くにはどうすればいいですか?

答えて

4

非同期入出力呼び出しの周りにラッパー層を追加します。次に、 "MockIO"クラスを使用して、I/O接続の処理に関するテストを行うことができます。

ユニットテスト以上の統合について説明しているようです。単体テストは、個々のモジュールを個別にテストすることであり、システム機能を提供するためにどのように集約されるかではありません。

単体テストでは、データがI/Oイベントから受信されたことが確認されます。別のテストでは、RESTエンドポイントに供給されたデータが適切に受信されたことを確認します。別の別のテストでは、RESTエンドポイントが必要に応じてそれを解析していることを確認します。 I/Oイベントテストに関しては、I/Oエラー、接続の切断、その他の不幸なパスをシミュレートするための単体テストを追加しました。例外処理コードが正しく機能していることを確認しました。モジュールをテストしました。同様に、メソッドのすべてのパスを実行するために必要なテストが何であれ、ヌルポインタ、空のバッファ、実際には長いバッファ、予期しないデータ型など、あらゆる種類の不良入力を持つエンドポイントもテストします。

ユニットテストでは、完全なコードカバレッジを目指して努力しています(ただし必ずしもそうではありません)。統合テストでは、作品が正常に結びついていることが示されていますが、必ずしもすべての対話をテストすることはできませ大きな前提は、単体テストが合格した場合、それらが何をしているかにかかわらず一緒にうまく動作するはずです。

私は、あなたが「自動化された単体テスト」のより良い全体像を提供することによって、あなたの "切り詰められた"段階を打破するのに役立つかもしれないと思っています。単体テストを既存のプロジェクトに追加しようとしている場合は、マイケルフェザーズの「Working With Effective With Legacy Code」という本は絶対に素晴らしいです(マイクはCppUnitの著者です)。 Roy Osheroveによるユニットテストは良い読書です。また、単体テストのアイデアが得られれば、Gerard MeszarosのxUnitテストパターンは、メンテナンス可能なテストの作成方法を学ぶのに役立つ素晴らしいリソースです。

機会があれば、メンターから学ぶために質の高い時間を過ごしてください。

+0

ありがとうございます!デザインのさまざまなコンポーネントが互いに強く結びついていたため、以前は問題がありました。私は非同期部分を抽象化し、異なるコンポーネント間の密結合を取り除いた。ユニットテストは、最初に思った巨大なものよりも簡単になりました。\ nさらに、本へのポインタに感謝します。間違いなくそれらを見ていきます。 – sanjivr

関連する問題