web-dev-qa-db-ja.com

クライアントサーバーコードを単体テストする方法

私は現在Javaクライアントサーバーアプリケーションを作成しています。したがって、クライアント用とサーバー用の2つのライブラリを実装したいと思います。クライアントサーバー通信には非常に厳密なプロトコルがあります。 JUnitでテストしたくない。

継続的インテグレーションのためにMavenとHusdonServerを使用するビルドツールimとして。

実際、私はこれらのクライアント/サーバーライブラリをテストする方法について良いアイデアを持っていません。

私は次のアプローチを得ました:

  1. サーバーをテストするためのダミークライアントを作成し、クライアントをテストするためのダミーサーバーを作成するだけです。 短所: 残念ながら、これは多くの余分な作業をもたらします。テストが完全に同一であるかどうかわからないため、クライアントとサーバーが連携できることを100%確信することはできませんでした。

  2. クライアントとサーバーを一緒にテストする別のテストプロジェクトを作成します。
    短所: ユニットテストはそれ自体がプロジェクトに属していないため、ハドソンはそれらを自動的に実行しません。これらのライブラリのいずれかで何かを変更するすべての人は、すべてが正しいことを確認するために手動でテストを実行する必要があります。また、コードカバレッジレポートを受け取りません。

そのようなコードをテストするためのより良いアプローチはありますか?たぶん、Mavenマルチモジュールプロジェクト、またはそのようなものをテストします。

誰かがその問題の良い解決策を得たことを願っています。

ありがとう。

24
StaticBR

したがって、最終的な解決策は、サーバーとクライアントモジュールを含む個別のテストモジュールを使用してマルチモジュールプロジェクトを構築することでした。これは、ハスドンでうまく機能します。そして、EclipseIDEではさらに優れています。ヒントをありがとう@アーロン

1
StaticBR

すべてのコードを「入力を出力に変換する」と考えてください。X -> [A] -> Y

Xは入力されるデータ、[A]はトランスフォーマー、Yは出力です。あなたの場合、あなたはこのセットアップを持っています:

[Client] -> X -> [Server] -> Y -> [Client]

したがって、単体テストは次のように機能します。

  1. Xを生成するためにクライアントコードを実行するテストが必要です。コードが実際にアサートを使用してXを生成することを確認します。 Xは、コード内でfinal static Stringである必要があります。

  2. 2番目のテストで定数Xを使用して、サーバーコードを呼び出し、サーバーコードをY(別の定数)に変換します。

  3. 3番目のテストでは、クライアントコードが入力Yを解析できることを確認します。

このようにして、テストを独立させたまま、重要な部分が機能することを確認できます。インターフェースbetweenコンポーネント。

11
Aaron Digulla

この問題を解決するための最新のアプローチは、Dockerコンテナーを使用することです。ベースイメージと、クライアントサーバーアプリケーションに必要なすべての依存関係を含むDockerファイルを作成します。分散クライアントサーバーシステムのノードタイプごとに個別のコンテナーを作成し、TestNGまたはJUnitを使用してすべてのエントリポイントサーバーAPI /クライアントの相互作用をテストします。このアプローチの最良の部分は、サービス呼び出しをモックしないことです。ほとんどの場合、すべてのエンドツーエンドのクライアントサーバー相互作用を調整できます。

このアプローチには少し学習曲線がありますが、Dockerは、特にこの問題を解決するために、開発コミュニティで非常に人気が高まっています。

DockerクライアントAPIを使用してJUnitテストでDockerイメージをプルする方法の例を次に示します。 https://github.com/influxdb/influxdb-Java/blob/master/src/test/Java/org /influxdb/InfluxDBTest.Java

1
ChaitanyaBhatt

私の提案は、2つのレベルのテストを使用することです。

  1. クライアント/サーバープロジェクトの場合、単体テストにモックを含めて、オブジェクトインターフェイスが期待どおりに機能していることを確認します。

  2. ビルドに続いて、コンパイルされたクライアントとサーバーを1つ以上のテストシステムにインストールするための自動化を使用して、より広範な統合テストを実行します。次に、プロトコルのすべての詳細が徹底的にテストされていることを確認できます。クライアント/サーバープロジェクトのビルドが成功するたびに、この統合テストプロジェクトをトリガーします。これにはJUnitを使用しても、Hudsonから従来のレポートを受け取ることができます。

1
Tim Clemons

任意のモックオブジェクトフレームワークを使用して、モックオブジェクトを作成できます-jmockitを試してください。

0
Jayan