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

xdh*_*ore 7 java testing spring-mvc thymeleaf

我正在使用 Thymeleaf 和 Spring MVC 开发 Spring Boot 应用程序,我在代码中遇到了一个错误,有人将 Spring MVC 模型绑定到 2 个不同的 HTML 表单字段:

<input th:field="*{userModel.name}" type="text" />
<input id="name" th:field="*{userModel.name}" type="hidden" />
Run Code Online (Sandbox Code Playgroud)

这导致控制器模型中的名称字段设置为逗号分隔值的字符串。例如“史蒂夫,史蒂夫”。我解决了这个问题,但我想知道为此编写回归测试的最简单方法。有一个 Spring MVC 测试框架,我可以在这篇博文中使用它使用它,但我真正想要测试的是渲染模板和控制器之间的交互,而不仅仅是控制器。

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

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

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

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

在这个项目中,我意识到 Spring MVC 和 HTML 表单之间的交互是一个常见错误的地方,因此如果有一种方法来测试这些交互就好了。

编辑:

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

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

我想我可以使用 Thymeleaf 的片段选择器或将我的表单重构为单独的模板来实现#1。#2 我可以使用 JSoup 轻松完成。这是#3 和#4,我不知道该怎么做。#3 我也许可以自己编写,具体取决于 HttpServletRequest 模拟的工作方式。#4 似乎它必须在 Spring 的某个地方可用,但我是 Spring 的新手。

更新:

WebDataBinder视为#4 的可能解决方案。

xdh*_*ore 3

几年后,看起来您现在基本上可以使用 HtmlUnit/SpringMVC 测试集成来完成我想要的事情。它将简化您对控制器进行的任何调用,并使用 MockMVC 代替,而无需 Servlet 容器。

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

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