测试Thymeleaf表单/ Spring MVC Controller交互的最佳方法
问题内容:
我正在使用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" />
这导致控制器模型中的名称字段被设置为以逗号分隔的值的字符串。例如“
Steve,Steve”。我已解决问题,但我想知道为此编写回归测试的最简单方法。有一个Spring
MVC测试框架,可以在本博客文章中使用,但我真正要测试的是呈现的模板与控制器之间的交互,而不仅仅是控制器。
我可以使用selenium测试,但是最近我读了这篇Martin Fowler bliki /
article(blickticle?),其中他说:
特别是一个常见的问题是,团队将端到端测试,UI测试和面向客户的测试的概念混为一谈。这些都是正交特性。
我认为这是一个很好的观点。我想我想写的是一个UI组件(集成?)测试。比加载整个页面要小。仅测试表单生成和提交的内容。
我的另一个想法是,最好通过静态分析工具来捕获此类错误,但这超出了我的范围。
在这个项目中,我意识到Spring MVC与HTML表单之间的交互是常见的错误地方,因此,有一种方法可以测试这些交互是很不错的。
编辑:
经过进一步考虑,我认为这些是我测试中要采取的步骤:
<form>
从模板的百里香模板中选择标签并进行渲染,在模型中传递适当的数据- 可能以编程方式(从Java)编辑渲染的表单值以模拟JavaScript交互。
- 根据呈现的表单生成浏览器的http POST请求。
- 使用Spring用于将POST请求转换为控制器的model参数的任何内容
- 要么调用控制器并验证结果,要么断言模型已正确创建
我想我可以使用Thymeleaf的片段选择器或将表单重构为单独的模板来实现第一。#2我可以轻松地使用JSoup。我不确定该怎么做,是#3和#4。#3我也许可以写我自己,这取决于HttpServletRequest模拟的工作方式。#4似乎必须在spring某个地方上市,但我是Spring的新手。
更新:
将WebDataBinder视为#4的可能解决方案。
问题答案:
几年后,看来您现在可以使用HtmlUnit / SpringMVC
Test集成基本上完成我想要的工作。它将使您对控制器的任何调用都变得快捷,并使用MockMVC而不使用Servlet容器。
因此,您可以利用html智能客户端库的优势,像浏览器一样包装前端,而无需servlet容器的开销,并且能够模拟出您想要在控制器下进行的操作。
https://docs.spring.io/spring/docs/current/spring-framework-
reference/testing.html#spring-mvc-test-server-
htmlunit