4

タイトルが示すように、特定のテストごとにテスト サーバーを起動/停止したくないことを考慮して、Jetty Web サーバーを使用してアプリケーションをテストする最良の方法に興味があります。

私の知る限り、これらは解決策です:

  1. Maven や Gradle などのビルド ツールを使用する場合は、*.pomまたは*.gradleファイルで実行できます。

    • これには、アプリケーションで通常行うのとは異なる方法でテスト サーバーを作成する必要があるという欠点があります。
  2. テスト スイートを作成し、@BeforeClassおよび@AfterClassアノテーションを使用して、テストの前後にサーバーを起動/停止しますSuite

    • ここでの欠点は、実行するテストを指定する「醜い」方法です。また、スイートに追加されたテストをスイートの外で実行しないように指定する必要があります (テストの重複実行を避けます)。Junit はまだこの機能を十分に備えていないと思います。
  3. テストの開始時に静的な方法でサーバーを作成して起動し、ShutDownメカニズムを使用して JVM に接続し、すべてのテストが完了するとサーバーを自動的に停止します。このメカニズムは Jetty で既に利用可能であるため、これが最適なソリューションと思われますが、

    • 欠点は、サーバーの停止を制御できないことです。実際には、ビルドツールの外部であっても、まったく別のスレッドで行われます (これには Gradle を使用します)。
4

2 に答える 2

5

Jetty 自体のほぼすべてのテストで #2 を実行します。組み込みサーバーを作成し、アプリやサーブレットなど、好きなものをデプロイするのは非常に簡単です。これにより、自動化されたテストを実行するだけでなく、IDE のすべてのツール オーバーヘッドなしで、IDE 内で簡単にアプリケーションをデバッグする方法も提供されます。したがって、Jetty の観点からは、テスト スイートを作成し、そのテスト内で必要に応じてサーバーを起動および停止することの大ファンです。複数のサーバーをスピンアップし、それらの間でセッションの有効期限をテストするテスト ケースと、サーバーをスピンアップし、非同期 jetty-client を使用して 10k クライアント接続を投げるテスト ケースがあります。jetty の完全なビルドを実行するだけで、何百もの jetty サーバー インスタンスが起動および停止します。

すべてのアプリがそのように接続できるわけではなく、外部データベースの要件などがあるアプリもありますが、多くの場合、derby のようなメモリ内データベースに対して単体テストを作成できます。これは、テストを区分化するための優れたアプローチです。テストを実行するための環境が絶対に必要な場合、多くの人は maven、jetty-maven-plugin、およびセレンなどの組み合わせでうまくいきますが、私は通常、これらをより機能的なテストまたは受け入れテストのシナリオと見なします。実際の単体テストはjunitテストのコンテキスト内で行われます...少なくとも。

于 2013-05-16T13:06:35.777 に答える