【问题标题】:Best way to test Thymeleaf form / Spring MVC Controller interaction测试 Thymeleaf 表单/Spring MVC 控制器交互的最佳方法
【发布时间】:2014-06-11 20:20:22
【问题描述】:

我正在使用 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" />

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

我可以使用硒测试,但我最近阅读了this Martin Fowler bliki/article(blikticle?),其中他说:

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

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

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

在这个项目中,我意识到 Spring MVC 和 HTML 表单之间的交互是错误的常见位置,所以如果有一种方法可以测试这些交互,那就太好了。

编辑:

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

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

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

更新:

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

【问题讨论】:

    标签: java spring-mvc testing thymeleaf


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      您可以使用 Thymeleaf 测试基础架构测试复杂的模板。

      但是,归根结底,一切都必须协同工作。这个测试应该用 selenium 完成,以检查变量名匹配(所以你的回归)。通常,您应该只需要对每个页面进行一些测试。如果你有很多 JS,你应该使用 buster.js 测试复杂的 JS 功能。 selenium 的 htmlunitdriver 非常快,所以我认为性能应该不是什么大问题。但不要使用 selenium 测试所有控制器或服务路径。

      【讨论】:

      猜你喜欢
      • 2013-04-23
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      相关资源
      最近更新 更多