2013-08-20 89 views
0

由於我一直在運行的一些集成測試,我的構建失敗了。我被困在爲什麼它不起作用。下面是輸出的一個例子:JUnit需要特殊權限嗎?

enter image description here

我使用Maven來先建,然後調用JUnit測試。我在每次測試中都看到這個消息,我認爲這是造成構建失敗的原因。在我看來,這意味着需要設置一些權限/驗證參數。我會在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); 
    } 
+0

什麼是系統正在測試?它是一個Web應用程序嗎?如果是這樣,可能是服務器的IP被允許訪問您試圖訪問的資源,而您正在運行測試的計算機的IP不是。 –

+0

對於此測試,它會嘗試訪問託管在本地tomcat服務器上的資源,因此不會在Internet上進行調用。 – christopher

+0

請不要發佈錯誤消息的屏幕截圖。請複製/粘貼錯誤,以便我們實際讀取它。 –

回答

2

我注意到你的測試輸出在401錯誤之前顯示了HTTP/1.1 500 Internal Server Error幾行。我想知道根本原因是否可能藏在那裏。如果我是你,我會嘗試尋找關於測試中當時在服務器上發生了什麼錯誤的更多細節,以查看它是否可能對認證問題負責(也許失敗在某種登錄控制器中,或導致會話被取消?)

或者:它看起來像使用Apache HttpClient library來執行請求,在issueRequest方法中。如果您需要在請求中包含身份驗證憑據,那將是您需要更改的代碼。這是HttpClient中的example of doing HTTP Basic authentication,如果有幫助的話。 (和more examples,如果那個沒有。)

(我想第二個觀察這個問題可能不是特定於JUnit。如果你需要做更多的研究,我會建議學習更多關於HttpClient ,以及這個應用程序期望瀏覽器發送的內容。一種可能性:當您手動執行此操作時,使用諸如Chrome Dev Tools之類的東西來查看與服務器的通信,並查看測試沒有執行的重要事項,或者在做不同的。

一旦你已經找到了如何登陸,它可能是有意義的做在你的JUnit測試一個@Before方法。)

+0

這是最接近正確答案的。原來我有一個丟失的文件,這導致了各種各樣的biazarre行爲,包括'HTTP/1.1 401'錯誤。 – christopher

0

HTTP權限無關使用JUnit,您可能需要在代碼本身提出請求的同時設置你的憑證給我們展示一些代碼

此外,單元測試並不是真的意味着要訪問互聯網,它的目的是測試你的代碼的小而簡潔的部分, t依賴於任何外部因素,集成測試應該覆蓋這一點

如果可以的話,嘗試使用來嘲笑你的網絡請求或PowerMock,並使它們返回您將從本地資源文件夾加載的資源(例如,測試/資源)。

+0

如果我需要在代碼本身中設置憑據,它將無法在第一個地方工作嗎?目前,實際的程序完美運行。我應該說這不是我的*項目。我在工作,我的老闆堅持認爲這些測試通過了,儘管程序是100%的功能。 – christopher

+0

沒有任何代碼就很難說清楚。我的意思是你需要在你的junit測試的代碼中設置憑據,而不是在你正在測試的代碼中。 –

+0

道歉。我將編寫一個拋出'401'錯誤的JUnit測試樣本。 – christopher