目前我正在开发一个基于spring的应用程序。对于应用程序的许多用途,我确实有一些单元测试。问题是,我还没有找到任何解决方案来对我的应用程序进行真正的集成测试。
让我给你举个例子:
在我目前的测试中,我确实设置了一个对特定控制器的请求,并将这些组件传递给我的处理程序:
// 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的请求的情况下,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。这导致dispatcher servlet在名为isMultipartRequest()之类的函数中返回true。在生产运行中,它返回false,因为PUT方法上没有多部分请求。此外,我再次指定了应该处理此请求的控制器。
也许还有其他的例子,但我想说的是,有没有办法在真实条件下测试我的应用程序,包括我的html协议和其他一切?
我真的很感激任何形式的帮助!
提前感谢
发布于 2011-11-07 15:50:34
集成测试将测试您的代码和框架之间的集成,但在某些情况下,您需要部署应用程序并对其进行实际测试。
看看HtmlUnit吧。它是一个基于Junit的框架,用于导航和功能测试web应用程序。
更好的是,看看Selenium。这实际上会驱动一个真正的浏览器并对页面内容进行断言。它比HtmlUnit更复杂,但通常会导致更有意义的测试,特别是对于大量使用javascript的for应用。
发布于 2011-11-07 18:09:41
上周我找到了这两个春季班,
我从来没有用过它们,我也不是百分之百确定它们是如何工作的。但我想指出这一点,因为它们在Spring参考中没有提到。相信我,要在部署的服务器上运行第一次真正的集成测试,需要做大量的工作。因此,只要mock不模仿您想要测试的东西,我强烈建议使用mock。
但是你真的需要一个部署的应用程序(就像skaffman在他的answer中建议的那样)。然后我想提一下另外两个测试框架:
https://stackoverflow.com/questions/8033887
复制相似问题