是否可以在SoapUI Pro XML DataSource中选择随机样本百分比的XML节点?

时间:2014-10-09 04:23:24

标签: xml xpath soapui

我对API调用的回复会导致2,000名患者回复。

我创建了一个XML DataSource来创建返回患者的属性列表。如果我将以下内容放在行Xpath字段中,则所有2,000名患者都将作为属性添加:

//PatientInfo[1]/Patient

如果我使用它,只有第一位患者作为财产添加:

//PatientInfo[1]/Patient[1]

我想做的只是将1%的患者转换为财产。类似的东西:

//PatientInfo[1]/Patient[Random 1 Percent]

这是XPath中可能出现的吗?

1 个答案:

答案 0 :(得分:2)

您可以使用subsequence XPath函数,指定subsequence(items, start, length),它从起始参数位置返回items的序列,用于length参数指定的项目数。

例如,在您的情况下,您可以使用以下10个<patient>节点:

subsequence(//PatientInfo[1]/Patient,1,10)

如果要获得总<Patient>个节点的百分比,可以将subsequence函数与count一起使用以计算子节点总数,并且还需要{{ 1}},div*为了获得非浮动百分比数字,这一切都可以是:

round

如果此subsequence(//PatientInfo[1]/Patient, 1, round(count(//PatientInfo[1]/Patient) div 100 * 1))round(count(//PatientInfo[1]/Patient) div 100 * 1)百分比舍入,则首先计算所有患者节点,将其除以100并乘以百分比。

请注意,我没有SOAPUI PRO,所以我无法使用数据源检查它是否有效,但我在SOAPUI的其他部分使用1% XPath函数实现与你类似的目标。我使用follow groovy示例来检查此subsequence是否按预期工作:

XPath

基于OP评论的编辑:

关于你的新要求我认为XPath中没有随机函数,但你可以试用import javax.xml.transform.TransformerFactory import javax.xml.transform.Transformer import javax.xml.transform.dom.DOMSource import javax.xml.transform.stream.StreamResult // xml sample to get Patient nodes def xml = '<PatientInfo><Patient>1</Patient><Patient>2</Patient><Patient>3</Patient><Patient>4</Patient></PatientInfo>' // xmlHolder to perform an XPath def xmlHolder = new com.eviware.soapui.support.XmlHolder(xml) // get the 50% of patients (in the sample 2 nodes) // with XPath def nodes = xmlHolder.getDomNodes("subsequence(//PatientInfo[1]/Patient, 1, round(count(//PatientInfo[1]/Patient) div 100 * 50))") // print the nodes to check that only 2 first // patient nodes where selected by the xpath nodes.each{ n -> log.info printDocument(n)} // this function is to print xml as string // it's purpose it's only to log the info def printDocument(node) { TransformerFactory tf = TransformerFactory.newInstance() Transformer transformer = tf.newTransformer() StringWriter writer = new StringWriter() transformer.transform(new DOMSource(node), new StreamResult(writer)) return writer.getBuffer().toString() } 函数来使unordered(items)无序,但是这个函数的随机性取决于实现,而且我和#39;我不确定它是否在SOAPUI中正常工作,表达式可能是:

<patient>

另一种可能性是使用groovy来填充你的数据源,结合groovy来获取一个随机数作为subsequence(unordered(//PatientInfo[1]/Patient), 1, round(count(//PatientInfo[1]/Patient) div 100 * 50)) 函数的起点,subsequence来获取XPath节点。如果您在测试步骤中有响应XML,则可以修改我之前的示例以直接应用<patient>,代码可以是:

XPath

希望这有帮助,