我对API调用的回复会导致2,000名患者回复。
我创建了一个XML DataSource来创建返回患者的属性列表。如果我将以下内容放在行Xpath字段中,则所有2,000名患者都将作为属性添加:
//PatientInfo[1]/Patient
如果我使用它,只有第一位患者作为财产添加:
//PatientInfo[1]/Patient[1]
我想做的只是将1%的患者转换为财产。类似的东西:
//PatientInfo[1]/Patient[Random 1 Percent]
这是XPath中可能出现的吗?
答案 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
关于你的新要求我认为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
希望这有帮助,