关于柑橘验证匹配器的正确使用,我有一个问题。在官方XML示例中,为TodoList.xsd定义了以下XSD架构(getTodoListResponse
):
<xs:element name="getTodoListResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="todoEntry" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="description" type="xs:string" minOccurs="0"/>
<xs:element name="attachment" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="cid" type="xs:string"/>
<xs:element name="contentType" type="xs:string"/>
<xs:element name="data" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="done" type="xs:boolean" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
定义的验证匹配器看起来像这样(templates/getTodoListResponse.xml):
<todo:getTodoListResponse xmlns:todo="http://citrusframework.org/samples/todolist">
<todo:list>
<todo:todoEntry>
<todo:id>@ignore@</todo:id>
<todo:title>${todoName}</todo:title>
<todo:description>${todoDescription}</todo:description>
</todo:todoEntry>
</todo:list>
</todo:getTodoListResponse>
但是当通过mvn verify
多次运行测试时,生成的XML中有多个todoEntry元素。为了检查结果中返回的XML元素的变量列表。因此检查将失败。
问题是,如果有办法通过XML验证匹配器API表达此动态列表。
我得到了一个基于groovy验证器的工作解决方案,如下所示:assert root.list.children().size() > 1
(getTodoListResponseValidator.groovy)
但我更愿意看到这一点通过XML验证。似乎有类似的名为@matchesXml(),但从文档中我不清楚这是否适合所描述的用例。
Thx提前。
再见马里奥
底线这对于todo-list演示来说只是一个糟糕的设计测试。集成测试应始终在众所周知的被测应用程序状态下运行。对于其他测试,测试应始终保持干净状态。在该特定样本中违反了这些原则。
实际上,您提到的示例只是一个演示,因此不是作为完全合格的现实世界示例编写的。因此,多次执行时测试不起作用。
要解决此问题,我建议在测试前步骤中清除待办事项列表,以便始终在空列表中操作。另一种可能性是使用XPath验证而不是比较完整的条目列表。 XPath验证可以检查列表条目的数量,例如大于零(就像你在groovy脚本中所做的那样)。
除此之外,您还可以编写一个XPath表达式,该表达式仅验证服务器返回的todos列表中的最后一个条目。这样的事情
<validate path="count(//todo:todoEntry)" value="@greaterThan(0)@" result-type="number"/>
<validate path="//todo:todoEntry[last()]/todo:title" value="${todoName}"></validate>