1

現在、私は春ベースのアプリケーションに取り組んでいます。アプリケーションの多くの目的のために、いくつかの単体テストがあります。問題は、アプリケーションで実際の統合テストを実行するための解決策が見つからないことです。

例を挙げましょう:

現在のテストでは、特定のコントローラーのリクエストを設定し、それらのコンポーネントをハンドラーに渡します。

// setup request
request.setMethod("GET");
request.setRequestURI("/customer");
request.addHeader("Accept", "application/json");
request.addHeader("Authorization", "Basic xyz"); // base_64
handlerAdapter.handle(request, response, myController);

しかし、これは実際の統合テストではありません。なぜなら、私が言っているのは、リクエストがあり、myControllerがこのリクエストを処理する必要があるからです。

私が本当にテストしたいのは次のとおりなので、これは問題です。

リクエストがあります。アプリケーションでこのリクエストを処理する必要があります。実行中のアプリケーションと「/customer」スプリングへのリクエストの場合、どのコントローラーが私のリクエストを解決するかをディスパッチするため、コントローラーを指定したくありません。私は、自分がブラウザまたはバックエンドにリクエストを送信する別のクライアントであることをシミュレートしたいと思っています。

私がこれをテストしたい理由は、テストされた機能が「現実の世界」では機能しないにもかかわらず、そうでなければある種のテストに合格するからです。

この例を理解してもらうことができます。この点で、テストは本番環境の実行とは異なります。

パラメータを使用してフォーム内にファイルをアップロードするとします。私のコントローラー機能はこれです:

@RequestMapping(value="/{id}", method = RequestMethod.PUT, headers="content-type=multipart/form-data")
public ResponseEntity<String> createFromMyForm(@PathVariable("id") Long id, @RequestParam String myParameter, @RequestParam MultipartFile myFile) {
//...
}

RequestMethod.PUTを見てください。これは、ファイルをアップロードするためのhtml標準がPOSTであるため、本番ビルドでは機能しません。

私のユニットテストでは、これを行っています:

// setup request
MockMultipartHttpServletRequest multipartRequest = new MockMultipartHttpServletRequest();
MockHttpServletResponse multipartResponse = new MockHttpServletResponse();

// Open file
final FileInputStream fis = new FileInputStream("img/test.png");
MockMultipartFile multipartFile = new MockMultipartFile(
            "myParameter", fis);

// generate multipart mock
multipartRequest.addFile(multipartFile);
multipartRequest.addParameter("json", "test");

// send request
handlerAdapter.handle(multipartRequest, multipartResponse, controller);

問題:テストは合格しますが、合格しないはずです。このテストに合格する理由はいくつかあります。まず、リクエストを指定します。リクエストがあるとは言いませんが、代わりにMultipartRequestがあると言わなければなりません。これにより、ディスパッチャサーブレットはisMultipartRequest()などの関数でtrueを返します。本番稼働では、PUTメソッドにマルチパート要求がないため、falseが返されます。さらに、この要求を処理するコントローラーを再度指定します。

他の例もあるかもしれませんが、私が言いたいのは、HTMLプロトコルやその他すべてを含む実際の条件下でアプリケーションをテストする方法はありますか?

どんな助けでも本当にありがたいです!

前もって感謝します

4

2 に答える 2

1

統合テストでは、コードとフレームワークの統合をテストしますが、ある時点で、アプリケーションをデプロイして実際にテストする必要があります。

HtmlUnitを見てください。これは、Webアプリケーションをナビゲートして機能的にテストするためのJUnitベースのフレームワークです。

さらに良いことに、 Seleniumを見てください。これは実際に実際のブラウザを駆動し、ページのコンテンツをアサートします。これはHtmlUnitよりも複雑ですが、特にjavascriptを多用するWebアプリケーションの場合、一般的に、より意味のあるテストになります。

于 2011-11-07T07:50:33.617 に答える
1

先週、私はこの2つの春のクラスを見つけました。

私はそれらを使用したことがなく、それらがどのように機能するかを100%確信していません。しかし、Spring Referenceには記載されていないので、指摘したいと思います。そして、デプロイされたサーバーを実行して最初の実際の統合テストを取得するのは大変な作業だと私は信じています。モックがテストしたいものをモックしない限り、モックを使用することを強くお勧めします。


しかし、私は本当にデプロイされたアプリケーションが必要です(彼の答えで提案されたskaffmanのように)。次に、他の2つのテストフレームワークについて説明します。

  • Selenium 2.0 / Webdriver-ブラウザーを制御するためのフレームワークですが、ブラウザーを「シミュレート」するHtmlUnitドライバーもあります。
  • ApacheHttpComponentsHttpClientSeleniumよりも低レベルですが、実際のSeleniumテストにはもっと時間が必要ですが、10分で実行できます。
于 2011-11-07T10:09:41.357 に答える