2011-11-07 135 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测试。