2011-11-07 139 views
1

目前我正在研究基於彈簧的應用程序。我爲應用程序的許多目的確實有一些單元測試。問題是,我還沒有找到任何解決方案來對我的應用程序進行真正的集成測試。春季3 - 真正的集成測試

讓我給你舉個例子:

在我目前的測試中,我做的設置對特定控制器的請求,並通過這些組件,以我的處理程序:

// 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」spring的請求發送哪個控制器來解決我的請求。 我真的很想模擬我是一個瀏覽器或另一個客戶端向我的後端發送請求。

我想測試的原因是,否則某種測試,雖然經過測試的功能不會在「現實世界」

我可以給你這個例子就明白了工作,以何種方式測試不同於生產運行:

讓我們假設我有一個帶有參數的窗體中的文件上傳。我的控制器功能是這一個:

@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。這導致調度程序servlet在一個名爲likeMultipartRequest()的函數中返回true。在生產運行中,它返回false,因爲在PUT方法上沒有多部分請求。此外,我再次指定應該處理這個請求的控制器。

也許還有其他例子,但我想說的是,有什麼方法可以在真實條件下測試我的應用程序,包括我的html協議和其他一切嗎?

我真的很感激任何幫助!

在此先感謝

回答

1

集成測試將測試你的代碼和框架之間的整合,但在某些時候,你需要部署應用程序,並測試其真實的。

看一看HtmlUnit。這是一個基於Junit的框架,用於瀏覽和功能測試Web應用程序。

更好的是,看看Selenium。這實際上會驅動一個真實的瀏覽器並在頁面內容上聲明。它比HtmlUnit更復雜,但通常會產生更有意義的測試,尤其是對於JavaScript重度的web應用程序。

+0

感謝您的支持!那麼有沒有機會用Spring支持的功能來測試這種東西? – Alexander

+0

也許一個更多的信息,我不只是測試HTML答覆。我也有JSON要求。是否有可能爲這些框架中的請求設置單獨的標頭? – Alexander

+1

@Alexander:Spring僅提供單元測試和集成測試支持。是的,這些框架可以完全控制標題。 – skaffman

1

上週,我發現這兩個彈簧類,

我從來沒有使用過,我不知道100%,他們是如何工作的。但我想指出,因爲它們在Spring Reference中沒有提及。相信我在運行部署服務器的過程中獲得第一次真正的集成測試是很多工作。所以只要嘲笑不嘲笑你想測試的東西,我強烈建議使用嘲笑。


但我真的需要部署的應用程序(如skaffman在他answer建議)。然後,我想提一提的其他兩個測試Framwork:

  • Selenium 2.0/Webdriver - 這是控制好瀏覽器的框架,但它也有一個驅動程序的HtmlUnit是「模擬」的瀏覽器
  • Apache HttpComponents HttpClient。它比Selenium更低,但是我能在10分鐘內運行,而我需要更多的時間用於real Selenium測試。