XPath select 多个随机节点中只有一个
XPath select only one node from multiple randomly
在 SOAPUI 中,我有一个 JDBC 请求步骤,下一个结果:
<Results>
<ResultSet fetchSize="10">
<Row rowNumber="1">
<CUSTOMER_ID>1963</CUSTOMER_ID>
<ID>444</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>vitae consectetuer eget rutrum</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="2">
<CUSTOMER_ID>4389</CUSTOMER_ID>
<ID>6008</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>neque</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="3">
<CUSTOMER_ID>8836</CUSTOMER_ID>
<ID>5304</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>lectus suspendisse potenti</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="4">
<CUSTOMER_ID>7360</CUSTOMER_ID>
<ID>8279</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>at turpis a</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="5">
<CUSTOMER_ID>823</CUSTOMER_ID>
<ID>235</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>non interdum</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="6">
<CUSTOMER_ID>5430</CUSTOMER_ID>
<ID>4278</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>leo maecenas pulvinar</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="7">
<CUSTOMER_ID>9209</CUSTOMER_ID>
<ID>9974</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>ut suscipit</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="8">
<CUSTOMER_ID>8135</CUSTOMER_ID>
<ID>8296</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>lectus pellentesque eget</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="9">
<CUSTOMER_ID>8247</CUSTOMER_ID>
<ID>4569</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>vulputate nonummy</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="10">
<CUSTOMER_ID>7156</CUSTOMER_ID>
<ID>836</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>adipiscing molestie</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
</ResultSet>
</Results>
自定义 属性: "ResponseAsXml"
我与下一个来源进行了财产转让:
来源:JDBC请求
属性: ResponseAsXml
路径语言:XPath
文本框:Results/ResultSet/Row[1]/CUSTOMER_ID[1]
我需要得到行[随机节点]/CUSTOMER_ID[1],(这是为了避免在多个测试执行中使用同一个客户),但是不知道获取随机节点这句话怎么说
提前致谢!
朱利安
欢迎来到 Stack Overflow。 (或者就像有人说的那样)
我认为你不能用 xpath 做到这一点。但它在 Groovy 脚本测试步骤中相当简单。
您可能想同时查看 XmlSlurper。很高兴知道,当你想做一些额外的事情时。
在 JDBC 测试步骤之后添加 Groovy 脚本测试步骤。使用它来查看您的数据库搜索 return 了多少客户。使用该数字在 0 到客户数量减一之间的任意位置生成一个随机整数。
然后使用该随机数从该特定客户获取客户 ID。然后只需 return 来自脚本的 id。现在可以在其他地方轻松使用此值。
你自己试试吧。如果您无法使用它,请在此处提交您的代码,我会帮助您。
编辑
我刚刚研究了一下,你几乎可以只用 xpath 来完成。但是您也需要一些随机数生成器。将它嵌入到您的 xpath 中并不是一件好事。所以我的第二个建议是:
创建一个 Groovy 脚本测试步骤来计算行数。将其命名为 "RandomInteger"。如果您总是得到 10 行,只需对其进行硬编码。基于该数字,return 一个介于 0 到行数减一之间的随机整数。
将此脚本放在您的 JDBC 请求测试步骤和您的 属性 传输测试步骤之间。
将您的 xpath 修改为
Results/ResultSet/Row[${RandomInteger#result]/CUSTOMER_ID[1]
感谢您的回答,
我没有使用 属性 传输,而是用 groovy 脚本替换了它:
随机rnd = new Random()
def rowCount = context.expand( '${COUNT#ResponseAsXml#Results/ResultSet/Row/COUNTDISTINCTAD.CUSTOMER_ID}' ).toInteger()
int randomNumber = rnd.nextInt(rowCount + 1 - 0)
testRunner.testCase.testSteps["Properties"].setPropertyValue( "x", randomNumber.toString() )
def customer = context.expand( '${CustomerQuery#ResponseAsXml#Results/ResultSet/Row[${Properties#x}]/CUSTOMER_ID}' )
testRunner.testCase.testSteps["Properties"].setPropertyValue( "CustomerId", 客户)
在 SOAPUI 中,我有一个 JDBC 请求步骤,下一个结果:
<Results>
<ResultSet fetchSize="10">
<Row rowNumber="1">
<CUSTOMER_ID>1963</CUSTOMER_ID>
<ID>444</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>vitae consectetuer eget rutrum</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="2">
<CUSTOMER_ID>4389</CUSTOMER_ID>
<ID>6008</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>neque</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="3">
<CUSTOMER_ID>8836</CUSTOMER_ID>
<ID>5304</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>lectus suspendisse potenti</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="4">
<CUSTOMER_ID>7360</CUSTOMER_ID>
<ID>8279</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>at turpis a</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="5">
<CUSTOMER_ID>823</CUSTOMER_ID>
<ID>235</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>non interdum</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="6">
<CUSTOMER_ID>5430</CUSTOMER_ID>
<ID>4278</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>leo maecenas pulvinar</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="7">
<CUSTOMER_ID>9209</CUSTOMER_ID>
<ID>9974</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>ut suscipit</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="8">
<CUSTOMER_ID>8135</CUSTOMER_ID>
<ID>8296</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>lectus pellentesque eget</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="9">
<CUSTOMER_ID>8247</CUSTOMER_ID>
<ID>4569</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>vulputate nonummy</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
<Row rowNumber="10">
<CUSTOMER_ID>7156</CUSTOMER_ID>
<ID>836</ID>
<COMM_PRODUCT_ID>229</COMM_PRODUCT_ID>
<DESCRIPTION>adipiscing molestie</DESCRIPTION>
<STATUS>1</STATUS>
</Row>
</ResultSet>
</Results>
自定义 属性: "ResponseAsXml"
我与下一个来源进行了财产转让:
来源:JDBC请求
属性: ResponseAsXml
路径语言:XPath
文本框:Results/ResultSet/Row[1]/CUSTOMER_ID[1]
我需要得到行[随机节点]/CUSTOMER_ID[1],(这是为了避免在多个测试执行中使用同一个客户),但是不知道获取随机节点这句话怎么说
提前致谢!
朱利安
欢迎来到 Stack Overflow。 (或者就像有人说的那样)
我认为你不能用 xpath 做到这一点。但它在 Groovy 脚本测试步骤中相当简单。
您可能想同时查看 XmlSlurper。很高兴知道,当你想做一些额外的事情时。
在 JDBC 测试步骤之后添加 Groovy 脚本测试步骤。使用它来查看您的数据库搜索 return 了多少客户。使用该数字在 0 到客户数量减一之间的任意位置生成一个随机整数。
然后使用该随机数从该特定客户获取客户 ID。然后只需 return 来自脚本的 id。现在可以在其他地方轻松使用此值。
你自己试试吧。如果您无法使用它,请在此处提交您的代码,我会帮助您。
编辑
我刚刚研究了一下,你几乎可以只用 xpath 来完成。但是您也需要一些随机数生成器。将它嵌入到您的 xpath 中并不是一件好事。所以我的第二个建议是:
创建一个 Groovy 脚本测试步骤来计算行数。将其命名为 "RandomInteger"。如果您总是得到 10 行,只需对其进行硬编码。基于该数字,return 一个介于 0 到行数减一之间的随机整数。
将此脚本放在您的 JDBC 请求测试步骤和您的 属性 传输测试步骤之间。
将您的 xpath 修改为
Results/ResultSet/Row[${RandomInteger#result]/CUSTOMER_ID[1]
感谢您的回答,
我没有使用 属性 传输,而是用 groovy 脚本替换了它:
随机rnd = new Random() def rowCount = context.expand( '${COUNT#ResponseAsXml#Results/ResultSet/Row/COUNTDISTINCTAD.CUSTOMER_ID}' ).toInteger()
int randomNumber = rnd.nextInt(rowCount + 1 - 0)
testRunner.testCase.testSteps["Properties"].setPropertyValue( "x", randomNumber.toString() )
def customer = context.expand( '${CustomerQuery#ResponseAsXml#Results/ResultSet/Row[${Properties#x}]/CUSTOMER_ID}' )
testRunner.testCase.testSteps["Properties"].setPropertyValue( "CustomerId", 客户)