1

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

让我给你举个例子:

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

// 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 在一个名为 isMultipartRequest() 的函数中返回 true。在生产运行中,它返回 false,因为 PUT 方法上没有多部分请求。此外,我再次指定应处理此请求的控制器。

也许还有其他例子,但我想说的是,有没有办法在真实条件下测试我的应用程序,包括我的 html 协议和其他一切?

我真的很感激任何帮助!

提前致谢

4

2 回答 2

1

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

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

更好的是,看看Selenium。这实际上将驱动一个真正的浏览器并断言页面的内容。它比 HtmlUnit 更复杂,但通常会产生更有意义的测试,尤其是对于 javascript-heavy webapps。

于 2011-11-07T07:50:33.617 回答
1

上周我发现了这两个春季班,

我从未使用过它们,我也不能 100% 确定它们是如何工作的。但我想指出这一点,因为 Spring Reference 中没有提到它们。相信我,在运行已部署的服务器的情况下进行第一次真正的集成测试需要做很多工作。所以只要 mocks 不模拟你想测试的东西,我强烈推荐使用 mocks。


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

  • Selenium 2.0 / Webdriver - 它是一个控制浏览器的框架,但它也有一个“模拟”浏览器的 HtmlUnit 驱动程序
  • Apache HttpComponents HttpClient。它比 Selenium 级别更低,但我在 10 分钟内就可以运行它,而我需要更多时间来进行真正的Selenium 测试。
于 2011-11-07T10:09:41.357 回答