我正在使用Thymeleaf& amp; Spring MVC,我遇到了代码中的一个错误,有人将Spring MVC模型绑定到2个不同的HTML表单字段:
<input th:field="*{userModel.name}" type="text" />
<input id="name" th:field="*{userModel.name}" type="hidden" />
这导致控制器模型中的name字段被设置为逗号分隔值的字符串。 &#34;史蒂夫,史蒂夫&#34;例如。我解决了这个问题,但我想知道为此编写回归测试的最简单方法。有一个Spring MVC测试框架,我可以使用as on this blog post,但我真正想要测试的是渲染模板和控制器之间的交互,而不仅仅是控制器。
我可以使用硒测试,但我最近阅读了this Martin Fowler bliki/article(blikticle?),他说:
特别是一个常见问题是团队将端到端测试,UI测试和面向客户的测试的概念混为一谈。这些都是正交特征。
我认为这是一个很好的观点。我想写的是UI组件(集成?)测试。比装载整个页面小的东西。只测试表单生成和提交的东西。
我的另一个想法是,这种错误最好通过静态分析工具捕获,但这有点超出了我的范围。
在这个项目中,我已经意识到Spring MVC和HTML表单之间的交互是错误的常见位置,所以有一种方法可以测试这些交互。
修改
经过进一步考虑,我认为这些是我在测试中想要的步骤:
<form>
标签并进行渲染,并在模型上传递适当的数据我想我可以用Thymeleaf的片段选择器做#1,或者将我的表格重构成一个单独的模板。 #2我可以轻松地使用JSoup。它的#3&amp; #4,我不知道该怎么做。 #3我也许可以写自己,这取决于HttpServletRequest模拟的工作方式。 #4似乎已经在Spring的某个地方可用,但我是Spring的新手。
更新
将WebDataBinder视为#4的可能解决方案。
答案 0 :(得分:0)
我认为您应该测试功能并获得控制器直接调用控制器的良好路径覆盖,模拟底层服务。然后,您可以测试模型是否正确填充。
您可以使用Thymeleaf测试基础架构测试复杂模板。
然而,在一天结束时,一切都必须协同工作。这个测试应该用硒来完成,以检查变量名匹配(所以你的回归)。通常,您只需要为每个页面进行一些测试。如果你有很多JS,你应该用buster.js测试复杂的JS功能。硒的htmlunitdriver非常快,所以我认为性能不应该是一个大问题。但是,不要用硒测试所有控制器或服务路径。
答案 1 :(得分:0)
几年后,看来您现在可以使用HtmlUnit / SpringMVC Test集成基本上完成我想要的工作。它将使您对控制器的所有调用都变得快捷,而无需使用Servlet容器即可使用MockMVC。
因此,您可以利用html智能客户端库的优势,像浏览器一样包装前端,而无需servlet容器的开销,并且能够模拟出您想要在控制器下进行的操作。