私は現在Javaクライアントサーバーアプリケーションを作成しています。したがって、クライアント用とサーバー用の2つのライブラリを実装したいと思います。クライアントサーバー通信には非常に厳密なプロトコルがあります。 JUnitでテストしたくない。
継続的インテグレーションのためにMavenとHusdonServerを使用するビルドツールimとして。
実際、私はこれらのクライアント/サーバーライブラリをテストする方法について良いアイデアを持っていません。
私は次のアプローチを得ました:
サーバーをテストするためのダミークライアントを作成し、クライアントをテストするためのダミーサーバーを作成するだけです。 短所: 残念ながら、これは多くの余分な作業をもたらします。テストが完全に同一であるかどうかわからないため、クライアントとサーバーが連携できることを100%確信することはできませんでした。
クライアントとサーバーを一緒にテストする別のテストプロジェクトを作成します。
短所: ユニットテストはそれ自体がプロジェクトに属していないため、ハドソンはそれらを自動的に実行しません。これらのライブラリのいずれかで何かを変更するすべての人は、すべてが正しいことを確認するために手動でテストを実行する必要があります。また、コードカバレッジレポートを受け取りません。
そのようなコードをテストするためのより良いアプローチはありますか?たぶん、Mavenマルチモジュールプロジェクト、またはそのようなものをテストします。
誰かがその問題の良い解決策を得たことを願っています。
ありがとう。
したがって、最終的な解決策は、サーバーとクライアントモジュールを含む個別のテストモジュールを使用してマルチモジュールプロジェクトを構築することでした。これは、ハスドンでうまく機能します。そして、EclipseIDEではさらに優れています。ヒントをありがとう@アーロン
すべてのコードを「入力を出力に変換する」と考えてください。X -> [A] -> Y
X
は入力されるデータ、[A]
はトランスフォーマー、Y
は出力です。あなたの場合、あなたはこのセットアップを持っています:
[Client] -> X -> [Server] -> Y -> [Client]
したがって、単体テストは次のように機能します。
X
を生成するためにクライアントコードを実行するテストが必要です。コードが実際にアサートを使用してX
を生成することを確認します。 X
は、コード内でfinal static String
である必要があります。
2番目のテストで定数X
を使用して、サーバーコードを呼び出し、サーバーコードをY
(別の定数)に変換します。
3番目のテストでは、クライアントコードが入力Y
を解析できることを確認します。
このようにして、テストを独立させたまま、重要な部分が機能することを確認できます。インターフェースbetweenコンポーネント。
この問題を解決するための最新のアプローチは、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
私の提案は、2つのレベルのテストを使用することです。
クライアント/サーバープロジェクトの場合、単体テストにモックを含めて、オブジェクトインターフェイスが期待どおりに機能していることを確認します。
ビルドに続いて、コンパイルされたクライアントとサーバーを1つ以上のテストシステムにインストールするための自動化を使用して、より広範な統合テストを実行します。次に、プロトコルのすべての詳細が徹底的にテストされていることを確認できます。クライアント/サーバープロジェクトのビルドが成功するたびに、この統合テストプロジェクトをトリガーします。これにはJUnitを使用しても、Hudsonから従来のレポートを受け取ることができます。
任意のモックオブジェクトフレームワークを使用して、モックオブジェクトを作成できます-jmockitを試してください。