web-dev-qa-db-ja.com

テスト方法Java Webアプリケーション

これまでのところ、私は自分のJava Webアプリケーションをテストする方法またはテストする方法を学習していません。

実行する場合、必要なツールは何ですか?スケーリングが必要ない場合、または大きなトラフィックとマルチトランザクションを処理しない場合は、Webアプリケーションをテストする必要がありますか?

アプリケーションが正しく動作することを確認するために、何をテストし、どのようなアプローチをとるべきですか?

6
OnlineAlien

これは難しい問題です。 Webアプリケーションの「メソッド」の多くは、HTTPリクエストを入力として受け取り、データベースを使用し、どこかで何らかのセッション状態を更新するという副作用を伴うHTML出力を生成します。これは、単体テストの最悪のシナリオです。

HTMLは、すべてのページに共通するボイラープレートやレイアウトの足場ではなく、特定のメソッドから具体的に取得するデータを分離する必要があるため、困難です。このボイラープレートは、アプリケーションのロジックとは関係なく、新しい配色やその他の何かに変更される可能性があり、すべてのテストが失敗する可能性があります。ログイン画面以外のものを有意義にテストする前に、大量のデータを設定する必要があることが多いため、データベースは特に困難です。

最善のアプローチは、さまざまな種類のテストを使用して、分割統治することです。

  • 小規模なアプリケーションの場合は、手動の回帰テスト計画から始めるのが適切です。
  • 完全に独立したコンポーネントを作成する場合は、それらの JUnit テストを記述します。
  • サーブレットを使用している場合は、偽のHTTPリクエストまたは偽のパラメータを提供し、サーブレットから直接出力を取得できる必要があります。適切にフォーマットされたXHTMLは、正規表現でかなり簡単に解析されます。データベースにプリロードされたデータに対してユニットテスト手法を使用できます。
  • 単体テストツールを使用して統合テストを設定します(誰かが私にこれを非難します)。システムのユーザーが行うのとほぼ同じように、システムの画面を使用して(上記のポイントのように)データベースのテストデータのセットを構築するテストを作成します。すべてのテストは、他のテストのデータを設定するコアテストスイートに依存します。回帰テストが大きくなりすぎる場合、これは手動テストに代わる優れた方法です。
  • 運用データベースの完全なクローンをセットアップしてデータをマスクする代わりに、 Hibernateのようなツールを備えたメモリ内データベース を使用できる場合があります。
  • ブラウザからテストするには、 Selenium のようなものを使用します。
  • 例外がスローされるたびにマスターサーブレットをページングするように設定し、コードからすべてのcatchステートメントを削除します(例外からの回復など、実際に例外に対して意味のある処理を行うものを除く)。これはテストではありませんが、非常に優れたテストを奨励しています。
  • テスターがシステムがどのように機能するかを完全な初心者に説明するときに、最も有用なテストが行​​われることがよくあります。新機能の小さなビデオヘルプセグメントを作成するときに、最も意味のあるバグを見つけます。しかし、興味のある架空の友人にシステムがどのように機能するかの詳細を説明し、実証するとき、私は良いテストを行うことができます。

多数の独立したレイヤーを使用してアプリケーションを構築するために段階的アプローチを使用した場合、テストがはるかに簡単になると思います。データベースのスペシャリスト、データベースの上の「バックエンド」サービスレイヤー、ビジネスロジックレイヤー、およびビューレイヤーで何かを行うには、プログラマーの大きなチームが必要になる場合があります。そのシナリオでは、ビジネスロジックとある程度他のレイヤーで従来の単体テスト手法を使用できますが、ビューは常に重要です。

編集:私はこれについて考えてきました。 MVCがWebアプリケーションに適用されていることを覚えている限り、それが何を意味するかについては議論がありました。記録としては、Ruby/Railsが最も適切だと思います。このモデルは実際にはデータモデルを意味します。この解釈は、アプリケーションでのサービス層の作成と最も互換性があるため、気に入っています。私が最近読んだ Steve YeggeのPlatform Rant は、本当に目を見張るものでした。サービスをデータモデルにして、自分のドッグフードを食べます。そうすれば、誰かがあなたの創造物をあなたが想像もしなかったものに変えることができます。ここで取り上げた理由は(コードについて考えるのをやめられないという事実を除いて)、コードに分割があるとテストが簡単になるからです。

ほら、私はレイヤーズ・エブリシング・エブリシング・ベター・キャンプにいるわけではない。私は生計を立てる必要があり、生活のために多くの助けなしに多くの特徴を生み出します。私が言っているのは、プロジェクトが十分に成熟していて、データベースをあまり変更しない場合は、スティーブイェッジの理由から、ORMの悪夢をサービスレイヤーに変えることを検討してください。簡単で効果的です。

12
GlenPeterson

ぜひチェックしてみてください HTMLUnit 。説明に従って...

HtmlUnitは一般的な単体テストフレームワークではありません。これは特に、テスト目的でブラウザーをシミュレートする方法であり、JUnitやTestNGなどの別のテストフレームワーク内で使用することを目的としています...

HTMLユニットは、シミュレーションされたブラウザ環境を提供し、目的のテストフレームワークにインターフェースして統合します。

JUnitまたはTestNGチェックアウトを使用したHTMLUnitの例 HTMLUnitの概要 ...

私はそれを強くお勧めします。

4
Eddie B

独自のJavaベースのWebアプリケーションであるため、何よりもまず nit Testing です。アプリケーションのすべてのメソッドをテストします。例外を適切にキャッチし、必要に応じて try-catch を使用しているかどうかを確認してください。

アルゴリズムが適切に最適化され、効率的であるかどうかを分析します。

単体テストが完了したら、次に ホワイトボックステストブラックボックステスト および 統合テスト に進みます。次に、UIをテストします。すべてのGUI要素が一貫しており、適切に機能していることを確認します。

1
Maxood