测试Thymeleaf表单/ Spring MVC控制器交互的最佳方法



我正在使用Thymeleaf &Spring MVC,我在代码中遇到了一个错误,有人将Spring MVC模型绑定到两个不同的HTML表单字段:

<input th:field="*{userModel.name}" type="text" />
<input id="name" th:field="*{userModel.name}" type="hidden" />

这会导致控制器模型中的name字段被设置为一串逗号分隔的值。比如"Steve,Steve"。我解决了这个问题,但我想知道最简单的方法来写一个回归测试。有一个Spring MVC测试框架,我可以在这篇博文中使用它,但我真正想测试的是渲染模板和控制器之间的交互,而不仅仅是控制器。

我可以使用硒测试,但我最近读了一篇Martin Fowler bliki/文章(blikticle?),他说:

一个特别常见的问题是,团队混淆了端到端测试、UI测试和面向客户测试的概念。这些都是正交特性。

我认为这是一个很好的观点。我想写的是一个UI组件(集成?)测试。比加载整个页面更小的东西。只测试表单生成和提交。

我的另一个想法是,这种错误可能最好通过静态分析工具捕获,但这超出了我的范围。

在这个项目中,我已经意识到Spring MVC和HTML表单之间的交互是一个常见的错误,所以最好有一种方法来测试这些交互。

编辑:

经过进一步考虑,我认为这些是我想在我的测试中的步骤:

  1. 从模板的胸里叶模板中选择<form>标签并渲染它,在模型上传递适当的数据
  2. 可能以编程方式编辑呈现的表单值(来自Java)来模拟JavaScript交互。
  3. 根据渲染的表单生成浏览器的http POST请求
  4. 使用Spring用来将POST请求转换为控制器的模型参数的任何东西
  5. 调用控制器并验证结果,或者只是断言模型已正确创建

我想我可能能够做#1与Thymeleaf的片段选择器或重构我的表单到一个单独的模板。2 .我可以轻松地使用JSoup。它是#3 &我不知道该怎么做。#3我可能能够写自己也许,这取决于如何HttpServletRequest模拟工作。第4条似乎在春天的某个地方可以使用,但我对春天不熟悉。

更新:

考虑WebDataBinder作为#4的可能解决方案

几年后,看起来你现在基本上可以做我想要使用HtmlUnit/SpringMVC测试集成。它将缩短你对控制器的任何调用,并使用MockMVC代替,而不需要Servlet容器。

因此,您获得了html智能客户端库的优势,可以像浏览器一样包装前端,而无需servlet容器的开销,并且能够在控制器下模拟您想要的任何内容。

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html spring-mvc-test-server-htmlunit

我认为您应该测试功能,并获得控制器直接调用控制器的良好路径覆盖,模拟底层服务。然后您可以测试模型是否正确填充。

你可以用thyymleaf -test基础架构测试一个复杂的模板。

然而,在一天结束的时候,一切都必须协同工作。这个测试应该用selenium来完成,以检查变量名称是否匹配(也就是您的回归)。通常每个页面只需要几个测试。如果你有很多JS,你应该用buster.js来测试复杂的JS功能。selenium的htmuniitdriver非常快,所以我认为性能不应该是一个大问题。但是不要用selenium测试所有的控制器或服务路径。

最新更新