首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring 3-实际集成测试

Spring 3-实际集成测试
EN

Stack Overflow用户
提问于 2011-11-07 15:47:00
回答 2查看 1.6K关注 0票数 1

目前我正在开发一个基于spring的应用程序。对于应用程序的许多用途,我确实有一些单元测试。问题是,我还没有找到任何解决方案来对我的应用程序进行真正的集成测试。

让我给你举个例子:

在我目前的测试中,我确实设置了一个对特定控制器的请求,并将这些组件传递给我的处理程序:

代码语言:javascript
复制
// 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会调度哪个控制器来解决我的请求。我真的想模拟我是一个浏览器或另一个客户端向我的后端发送请求。

我想测试它的原因是,尽管测试的功能在“真实世界”中不起作用,但其他一些类型的测试还是通过了。

我可以给你这个例子来理解,测试与生产运行的不同之处:

让我们假设我在一个带有参数的表单中上传了一个文件。我的控制器函数是这样的:

代码语言:javascript
复制
@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。

在我的单元测试中,我这样做:

代码语言:javascript
复制
// 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协议和其他一切?

我真的很感激任何形式的帮助!

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-07 15:50:34

集成测试将测试您的代码和框架之间的集成,但在某些情况下,您需要部署应用程序并对其进行实际测试。

看看HtmlUnit吧。它是一个基于Junit的框架,用于导航和功能测试web应用程序。

更好的是,看看Selenium。这实际上会驱动一个真正的浏览器并对页面内容进行断言。它比HtmlUnit更复杂,但通常会导致更有意义的测试,特别是对于大量使用javascript的for应用。

票数 1
EN

Stack Overflow用户

发布于 2011-11-07 18:09:41

上周我找到了这两个春季班,

  • MockServletContext
  • MockServletConfig

我从来没有用过它们,我也不是百分之百确定它们是如何工作的。但我想指出这一点,因为它们在Spring参考中没有提到。相信我,要在部署的服务器上运行第一次真正的集成测试,需要做大量的工作。因此,只要mock不模仿您想要测试的东西,我强烈建议使用mock。

但是你真的需要一个部署的应用程序(就像skaffman在他的answer中建议的那样)。然后我想提一下另外两个测试框架:

  • Selenium 2.0 / Webdriver -它是一个控制浏览器的框架,但它也有一个“模拟”browser
  • Apache HttpComponents HttpClient.的HtmlUnit驱动程序它比硒的水平更低,但我让它在10分钟内运行,而我需要更多的时间来进行真正的硒测试。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8033887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档