【问题标题】:JUnit Test if XML Document is sorted on arbitrary columnJUnit 测试 XML 文档是否按任意列排序
【发布时间】:2010-04-26 19:56:43
【问题描述】:

给定一个像这样的xml文档

<root>
  <row>
    <a>2</a>
    <b>1</b>
    <c>8</c>
  </row>
  <row>
    <b>5</b>
    <a>2</a>
    <c>8</c>
  </row>
  <row>
    <a>2</a>
    <c>8</c>
    <b>6</b>
  </row>
</root>

有没有一种简单的方法可以断言 XML 文档在 XMLUnit 中的元素 B 上排序

编辑: 我有一个奇怪的问题,我无法更改任何给定节点中 XML 标记的值需要按特定顺序排列的位置。我希望我的测试工具在任何其他验证之前强制执行这组规则。

【问题讨论】:

  • 我想不出任何(但话说回来,我不知道 XmlUnit 等)。你为什么要这样做?这是要测试的某种方法的输出吗?您能否重构代码以产生更可测试的格式的输出?
  • @Peter,我正在处理一些遗留软件,其中 XML 需要采用古怪的格式。我想确保我的 xml 输出始终遵守那些古怪的规则。
  • 好问题 (+1)。请参阅我的答案以获得非常简单的解决方案。 :)

标签: xml xpath junit xunit xmlunit


【解决方案1】:

使用以下简单 XPath 1.0 表达式的值

not(//b[. &gt; following::b])

【讨论】:

  • 这几乎就是我想要的。看了这个之后我得到了解决方案。谢谢!
  • 嗨萨尔,你的解决方案是什么?
  • @belwood:@sal 说他把这个 XPath 表达式放在他的代码中——可能真正的列名不同。如果你有同样的问题,这个答案应该能让你继续前进。
【解决方案2】:

您可以围绕 XPath 选择构建断言。

可能最简单的方法是使用 XPath 表达式 /root/row/b,请求 NODESET 结果类型,然后将每个结果节点中的文本复制到 List 结构中。您可以断言该列表中的文本等于使用 Arrays.asList() 方法创建的“预期”列表(我假设您使用的是 Java)。

【讨论】:

  • 这就是我正在做的事情,我对此并不满意。对于初学者来说,有太多特定于特定测试的代码,而且随着我的代码更改,可能需要更改更多代码。
【解决方案3】:

如果可以执行 XQuery,那么 XQuery 断言:

every $i in (1 to count ($x/row) - 1)
satisfies 
   let $j :=  $i + 1   
   return number($x/row[$i]/b) <= number($x/row[$j]/b)

其中$x是文档,如果行按b的升序排列则为真,否则为假

【讨论】:

  • 我太初级了,无法评论 Dimitre 的简洁答案,但不应该不是($x//b[number(.) > following::b/number(.)])这个数字数据,这不是 O N^2,因为每个 b 都与以下所有 b 进行比较?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多