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 中并不是一件好事。所以我的第二个建议是:

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

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

  3. 将您的 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", 客户)