XPath从多个随机选择一个节点

时间:2018-12-13 21:10:49

标签: xpath random nodes soapui

在SOAPUI中,我有一个JDBC Request步骤,具有下一个结果:

INSERT INTO "TRANSACTION"
(TRANSACTIONID ....
VALUES('00012' .....`

UPDATE INVENTORY
SET  Count = Count - ItemQuantity
WHERE ROWID='ProductA'

自定义属性:“ ResponseAsXml”

我与下一个来源进行了一次所有权转移:

来源:JDBC请求

属性:ResponseAsXml

路径语言:XPath

文本框:结果/结果集/行[1] /客户ID [1]

我需要获取 Row [Random node] / CUSTOMER_ID [1] ,(这是为了避免在多次测试执行中使用同一位客户),但是我不知道这句话是怎么回事得到一个随机节点。

谢谢!

朱利安

2 个答案:

答案 0 :(得分:1)

欢迎使用堆栈溢出。 (或者像某些人所说的那样)

我认为您无法使用xpath做到这一点。但这在Groovy脚本测试步骤中相当简单。

您可能希望同时查看XmlSlurper。很想知道,什么时候您想做些额外的事情。

在JDBC Teststep之后添加Groovy脚本Teststep。使用它来查找您的数据库搜索返回了多少客户。使用该数字可在0到客户数量减去1的区间内的任意位置生成随机整数。

然后使用该随机数从该特定客户那里获取客户ID。然后只需从脚本返回ID。现在可以在其他地方轻松使用此值。

亲自尝试。如果您无法正常使用它,请在此处提交代码,我会为您提供帮助。

编辑

我刚刚研究了它,您几乎可以仅使用xpath来完成它。但是您也将需要一些随机数生成器。并且将其嵌入到您的xpath中并不是一件很漂亮的事情。所以我的第二个建议是:

  1. 创建一个Groovy脚本测试步骤来计算行数。将其命名为“ RandomInteger”。如果您总是得到10行,则只需对其进行硬编码即可。根据该数字,返回一个介于0到行数减一之间的随机整数。

  2. 将此脚本放在JDBC请求测试步骤和属性传输测试步骤之间。

  3. 将xpath修改为

    Results / ResultSet / Row [$ {RandomInteger#result] / CUSTOMER_ID [1]

答案 1 :(得分:0)

感谢您的回答,

我没有使用属性转移,而是用一个普通的脚本替换了它:

随机rnd =新的Random() def rowCount = context.expand('$ {COUNT#ResponseAsXml#Results / ResultSet / Row / COUNTDISTINCTAD.CUSTOMER_ID}').toInteger()

int randomNumber = rnd.nextInt(rowCount +1-0)

testRunner.testCase.testSteps [“属性”] .setPropertyValue(“ x”,randomNumber.toString())

def customer = context.expand('$ {CustomerQuery#ResponseAsXml#Results / ResultSet / Row [$ {Properties#x}] / CUSTOMER_ID}'

testRunner.testCase.testSteps [“属性”] .setPropertyValue(“ CustomerId”,客户)