相似但不相同!
当使用 IgnoreTextAndAttributeValuesDifferenceListener 类时,必须声明这两个文档是 similar 而非 identical。如果错误地调用了 identical,那么需要处理属性值。
当然,DTD 的模式和 XML 模式都有助于 XML 结构验证,然而,有时文档并不需要引用它们 —— 在这些场景下,结构验证可能会很有用。同样,如果需要忽略特定的一些值(例如那些 Date 值),可以实现 DifferenceListener 接口(正如 IgnoreTextAndAttributeValuesDifferenceListener 所做的一样)并提供一个定制实现。
XMLUnit 和 XPath
为实现 XML 测试的所有三个方面,XMLUnit 还可以借助 XPath 进行 XML 文档特定部分的验证。
例如,使用清单 1 所示相同的格式,我想验证由应用程序生成的第一个 Class 元素的 name 属性值是否是 com.acme.web.Widget。要实现此目的,我必须创建一个 XPath 表达式来导航到准确的位置;而且,XMLUnit 的 XMLTestCase 提供了一个方便的 assertXpathExists() 方法,这意味着我必须现在扩展 XMLTestCase。
清单 8. 使用 XPath 来验证准确的 XML 值
public void testToXMLFormatOnly() throws Exception{
BatchDependencyXMLReport report =
new BatchDependencyXMLReport(new Date(), this.getFilters());
report.addTargetAndDependencies(
"com.acme.web.Widget", this.getDependencies());
report.addTargetAndDependencies(
"com.acme.web.Account", this.getDependencies());
assertXpathExists("//Class[1][@name='com.acme.web.Widget']",
report.toXML());
}
如清单 8 所示,XMLUnit 和 XPath 一起协作提供了可以准确验证 XML 文档 的一种便捷机制,而不是进行大规模的差异测试。请记住要在 XMLUnit 内充分利用 XPath,您的测试用例必须要扩展 XMLTestCase。如果熟悉 XPath 也会大有帮助!
XPath 是什么?
XPath 或 XML Path Language 是一种表达式语言,用来基于树表示定位 XML 文档的各部分。XPath 允许您导航 XML 文档并可以帮您选择文档值。
为何要舍近求远呢?
XMLUnit 是一种基于 Java 的开放源码工具,它使测试 XML 文档更为简单和灵活,而这是使用 String 比较所达不到的。使用 XMLUnit 进行差异测试所存在的惟一缺点是测试会依赖于文件系统来加载控制文档。在编写测试时,请务必考虑这一附加的依赖性。
虽然 XMLUnit 已经有段时间没有发布任何更新了,但它当前的特性集已经足够健壮来应对各种测试冲击,并且它用在这种情况下基本上是免费的!