0

実行している統合テストの一部が原因で、ビルドが失敗しています。なぜうまくいかないのか困っています。出力の例を次に示します。

ここに画像の説明を入力

私は Maven を使用して最初にビルドし、次に JUnit テストを呼び出します。401 Unauthorizedすべてのテストでこのメッセージが表示され、ビルドが失敗する原因になっていると思います。私の考えでは、これは、設定する必要があるいくつかのアクセス許可/認証パラメーターがあることを意味します。JUnitでこれを行うにはどこに行きますか?

編集

@Test
public void testXmlHorsesNonRunners() throws Exception {
    String servletUrl = SERVER + "sd/date/2013-01-13/horses/nonrunners";
    Document results = issueRequest(servletUrl, APPLICATION_XML, false);
    assertNotNull(results);
    // debugDocument(results, "NonRunners");
    String count = getXPathStringValue(
            "string(count(hrdg:data/hrdg:meeting/hrdg:event/hrdg:nonrunner/hrdg:selection))",
            results);
    assertEquals("non runners", "45", count);
}

可能であれば、詳細を無視してみてください。事実上、これはリクエストを行っています。issueRequestこれは、メソッドを使用したテストのサンプルです。このメソッドは、HTTP リクエストを作成するものです。(これは大きな方法なので、最初は投稿しませんでした。できるだけ読みやすくするようにします。

logger.info("Sending request: " + servletUrl);
    HttpGet httpGet = null;
    // InputStream is = null;
    DefaultHttpClient httpclient = null;

    try {
        httpclient = new DefaultHttpClient();
        doFormLogin(httpclient, servletUrl, acceptMime, isIrishUser);

        httpGet = new HttpGet(servletUrl);
        httpGet.addHeader("accept", acceptMime);
        // but more importantly now add the user agent header
        setUserAgent(httpGet, acceptMime);

        logger.info("executing request" + httpGet.getRequestLine());

        // Execute the request
        HttpResponse response = httpclient.execute(httpGet);

        // Examine the response status
        StatusLine statusLine = response.getStatusLine();
        logger.info(statusLine);

        switch (statusLine.getStatusCode()) {
        case 401:
            throw new HttpResponseException(statusLine.getStatusCode(),
                    "Unauthorized");
        case 403:
            throw new HttpResponseException(statusLine.getStatusCode(),
                    "Forbidden");
        case 404:
            throw new HttpResponseException(statusLine.getStatusCode(),
                    "Not Found");
        default:
            if (300 < statusLine.getStatusCode()) {
                throw new HttpResponseException(statusLine.getStatusCode(),
                        "Unexpected Error");
            }
        }

        // Get hold of the response entity
        HttpEntity entity = response.getEntity();

        Document doc = null;
        if (entity != null) {
            InputStream instream = entity.getContent();
            try {
                // debugContent(instream);
                doc = documentBuilder.parse(instream);
            } catch (IOException ex) {
                // In case of an IOException the connection will be released
                // back to the connection manager automatically
                throw ex;
            } catch (RuntimeException ex) {
                // In case of an unexpected exception you may want to abort
                // the HTTP request in order to shut down the underlying
                // connection and release it back to the connection manager.
                httpGet.abort();
                throw ex;
            } finally {
                // Closing the input stream will trigger connection release
                instream.close();
            }
        }
        return doc;
    } finally {
        // Release the connection.
        closeConnection(httpclient);
    }
4

2 に答える 2

2

テスト出力がエラーHTTP/1.1 500 Internal Server Errorの数行前に表示されていることに気付きました。401根本的な原因がそこに隠れているのではないかと思います。私があなただったら、テストのその時点でサーバーで発生したエラーの詳細を調べて、認証の問題の原因であるかどうかを確認します (おそらく、何らかのログイン コントローラーでエラーが発生している可能性があります。または、セッションがキャンセルされる原因になっていますか?)

別の方法: issueRequest メソッド内で、Apache HttpClient ライブラリを使用してリクエストを実行しているようです。リクエストに認証資格情報を含める必要がある場合は、そのコードを変更する必要があります。これが役立つ場合、HttpClient でHTTP Basic 認証を行う例を次に示します。(そうでない場合は、さらに例を示します。)

(この問題はおそらく JUnit に固有のものではないという見解を支持します。さらに調査を行う必要がある場合は、HttpClient について、およびこのアプリがブラウザーに何を送信することを期待しているかについて、さらに学習することをお勧めします。1 つの可能性: 使用Chrome Dev Tools のようなものを使用して、これを手動で行うときにサーバーとの通信をのぞき見し、テストで実行されていない、または別の方法で実行されている重要なものがないかどうかを確認します。

@Beforeログイン方法がわかったら、JUnit テストのメソッドでログインするのが理にかなっているかもしれません。)

于 2013-08-20T15:54:47.823 に答える
0

HTTP パーミッションの拒否は、JUnit とは関係ありません。コード自体でリクエストを行う際に、おそらく資格情報を設定する必要があります。コードを見せてください。

また、単体テストは、インターネットにアクセスするためのものではありません。その目的は、外部要因に依存すべきではない、コードの小さく簡潔な部分をテストすることです。統合テストはそれをカバーする必要があります。

可能であれば、 EasyMockまたはPowerMockを使用してネットワーク リクエストをモックし、ローカル リソース フォルダー (test/resources など) からロードするリソースを返すようにしてください。

于 2013-08-20T13:32:16.210 に答える