我有一个Java类从数据库获取表单定义然后根据表单定义呈现html,javascript和css,它使用了很多“appendable.append(...)。append(...)”构建html片段,这很容易出错。 Jsp和常用模板框架(例如.FreeMarker)在这里不是一个选项,因为javascript,css,html元素都是动态的(取决于表单定义)。由于某些原因,GWT也不是一种选择。
对此渲染器进行单元测试的直接方法是对预期的html代码进行硬编码,然后与实际输出进行比较,但测试非常脆弱。
请对这种html渲染器进行单元测试的最佳方法是什么?
提前谢谢大家。
答案 0 :(得分:3)
如果您对预期的HTML值进行硬编码,那么您的测试可能会很脆弱,但它们可能会捕获您的大部分错误。另一种方法是检查HTML输出中是否存在某些键或重要标记。这种方法更灵活,但可能会遗漏一些错误。要确定您应该使用哪个,请考虑您希望HTML结构发生变化的频率。
这里有一个平衡点。您的测试越具体,最脆弱。但是,如果你不够具体,你的测试将不会发现任何错误。需要练习才能发展出具体的感觉。
然而,一般而言,脆弱的测试非常危险,因此它们可能是“更大的邪恶”。如果您的测试标记了很多误报,您将开始忽略它们然后它们变得无用。我建议你去验证密钥标签的存在。
答案 1 :(得分:2)
我会采取双管齐下的方法。首先,您要验证要生成的各个代码段。您的测试应验证这些组件是否按预期工作。其次,您应该验证作为整体生成的每个文档是否有效并且类型一致。有第三方工具可以为您执行此验证。有关示例,请参阅http://www.w3.org/QA/Tools/。
答案 2 :(得分:0)
您提到的比较方法是一种很好的方法,它被称为“黄金大师”测试方法。
有一个与junit一起使用的验证库可以做到这一点,这大大简化了称为审批测试的过程http://www.approvaltests.com
通过使用将在差异报告器或网络浏览器中打开您的结果和/或您的黄金大师的记者,这也有助于防止脆弱。
您正在寻找的电话是:
Approvals.VerifyHtml(yourHtml)
并且你想用其中一个装饰你的测试
@UseReporter(DiffReporter.class)
@UseReporter(FileLauncherReporter.class)
@UseReporter({DiffReporter.class, FileLauncherReporter.class})