【问题标题】:Dynamically compare Rest XML/JSON response and JDBC using groovy array in SoapUI在 SoapUI 中使用 groovy 数组动态比较 Rest XML/JSON 响应和 JDBC
【发布时间】:2015-07-17 09:20:14
【问题描述】:

在 SoapUI 中,我有一个 JDBC 测试步骤,它返回以下数据:

<Results>
<ResultSet fetchSize="128">
    <Row rowNumber="1">
        <ID>1</ID>
        <NAME>TestName1</NAME>
        <DESCRIPTION/>
        <TYPE>Bool</TYPE>
        <ISPRODUCTTAG>true</ISPRODUCTTAG>
        <ISLOCATIONTAG>false</ISLOCATIONTAG>
        <SUBSECTION>Default Sub Section</SUBSECTION>
        <SECTION>Default Section</SECTION>
        <SUBGROUP>Default Sub Group</SUBGROUP>
        <GROUP>Default Group</GROUP>
    </Row>
    <Row rowNumber="2">
        <ID>2</ID>
        <NAME>TestName2</NAME>
        <DESCRIPTION/>
        <TYPE>Bool</TYPE>
        <ISPRODUCTTAG>true</ISPRODUCTTAG>
        <ISLOCATIONTAG>false</ISLOCATIONTAG>
        <SUBSECTION>Default Sub Section</SUBSECTION>
        <SECTION>Default Section</SECTION>
        <SUBGROUP>Default Sub Group</SUBGROUP>
        <GROUP>Default Group</GROUP>
    </Row>
    </Row>
</ResultSet>

我有一个包含以下数据的 REST API XML 响应:

    <ArrayOfTagInfo>
   <TagInfo id="1" name="TestName1" type="Bool" isProductTag="true" isLocationTag="false" subsection="Default Sub Section" section="Default Section" subgroup="Default Sub Group" group="Default Group"/>
   <TagInfo id="2" name="TestName2" type="Bool" isProductTag="true" isLocationTag="false" subsection="Default Sub Section" section="Default Section" subgroup="Default Sub Group" group="Default Group"/>
</ArrayOfTagInfo>

如果可能,我希望能够使用 groovy 数组比较(断言)数据库值和响应值(响应可以是 XML 或 JSON,具体取决于请求接受标头),因为从数据库返回的数据可以非常大。

谁能帮忙?

【问题讨论】:

  • 你有 SoapUI-Pro 吗?到目前为止,您尝试过什么?
  • 是的,我有 SoapUI Pro(Ready API)。我一直在手动添加断言来验证两者,但这很耗时而且不是动态的。从 API 和 JDBC 连接返回的数据可以多达 20000 行。从一个时髦的角度来看,我还没有尝试过任何东西,因为我对它不太熟悉。
  • @blader,您尝试以下解决方案了吗?

标签: json xml rest groovy soapui


【解决方案1】:

如果你有 SoapUI-Pro,你应该能够在没有 Groovy 的情况下完成所有这些。

  1. 进行 REST 调用以检索您的所有数据。
  2. 启动解析 XML 的 DataSource step
  3. 进行 JDBC 调用以选择您要验证的行的正确 ID。在这里做出所有断言。
  4. 循环回到#2。

【讨论】:

    【解决方案2】:

    您可以使用以下测试步骤设计您的测试用例:

    1. jdbc 步骤
    2. json 步骤
    3. groovy 脚本步骤

    groovy 脚本步骤中的想法/sudo 代码是这样的

    • 获取 jdbc 步骤的响应
    • 获取json步骤的响应
    • 以对象的形式构建数据,便于比较
    • 将对象存储在列表中,一个用于jdbc,另一个用于json
    • 对两个列表进行排序,以确保比较相同的数据
    • 比较两个列表是否相同。

    这里是 groovy 脚本:

    /**
     * Model object for comparing
     */
    @groovy.transform.Canonical
    class Model {
        def id
        def name
        def type
        def isProductTag
        def isLocationTag
        def subSection
        def section
        def subGroup
        def group
    
        /**
         * this will acception jdbc row
         * @param row
         * @return
         */
        def buildJdbcData(row) {
            row.with {
                id = ID
                name = NAME
                type = TYPE
                isProductTag = ISPRODUCTTAG
                isLocationTag = ISLOCATIONTAG
                subSection = SUBSECTION
                section = SECTION
                subGroup = SUBGROUP
                group = GROUP
            }
        }
    
        /**
         * this will accept the json TagInfo
         * @param tagInfo
         * @return
         */
        def buildJsonData(tagInfo){
            id = tagInfo.@id
            name = tagInfo.@name
            type = tagInfo.@type
            isProductTag = tagInfo.@isProductTag
            isLocationTag = tagInfo.@isLocationTag
            subSection = tagInfo.@subsection
            section = tagInfo.@section
            subGroup = tagInfo.@subgroup
            group = tagInfo.@group
        }
    }
    
    /**
     * Creating the jdbcResponse from the response received, using fixed value for testing
     * If you want, you can assign the response received directly using below instead of current and make sure you replace the step name correctly
     * def jdbcResponse = context.expand('${JdbcStepName#Response}')
     */
    def jdbcResponse = '''<Results>
    <ResultSet fetchSize="128">
        <Row rowNumber="1">
            <ID>1</ID>
            <NAME>TestName1</NAME>
            <DESCRIPTION/>
            <TYPE>Bool</TYPE>
            <ISPRODUCTTAG>true</ISPRODUCTTAG>
            <ISLOCATIONTAG>false</ISLOCATIONTAG>
            <SUBSECTION>Default Sub Section</SUBSECTION>
            <SECTION>Default Section</SECTION>
            <SUBGROUP>Default Sub Group</SUBGROUP>
            <GROUP>Default Group</GROUP>
        </Row>
        <Row rowNumber="2">
            <ID>2</ID>
            <NAME>TestName2</NAME>
            <DESCRIPTION/>
            <TYPE>Bool</TYPE>
            <ISPRODUCTTAG>true</ISPRODUCTTAG>
            <ISLOCATIONTAG>false</ISLOCATIONTAG>
            <SUBSECTION>Default Sub Section</SUBSECTION>
            <SECTION>Default Section</SECTION>
            <SUBGROUP>Default Sub Group</SUBGROUP>
            <GROUP>Default Group</GROUP>
        </Row>
        <!--added 3rd row for testing the failure -->
        <Row rowNumber="3">
            <ID>3</ID>
            <NAME>TestName3</NAME>
            <DESCRIPTION/>
            <TYPE>Bool</TYPE>
            <ISPRODUCTTAG>false</ISPRODUCTTAG>
            <ISLOCATIONTAG>false</ISLOCATIONTAG>
            <SUBSECTION>Default Sub Section3</SUBSECTION>
            <SECTION>Default Section3</SECTION>
            <SUBGROUP>Default Sub Group3</SUBGROUP>
            <GROUP>Default Group3</GROUP>
        </Row>
    </ResultSet>
    </Results>'''
    
    /**
     * Creating the jsonResponse from the response received, using fixed value for testing
     * If you want, you can assign the response received directly using below instead of current and make sure you replace the step name correctly
     * def jsonResponse = context.expand('${JsonStepName#Response}')
    
     */
    def restResponse = '''
    <ArrayOfTagInfo>
       <TagInfo id="1" name="TestName1" type="Bool" isProductTag="true" isLocationTag="false" subsection="Default Sub Section" section="Default Section" subgroup="Default Sub Group" group="Default Group"/>
       <TagInfo id="2" name="TestName2" type="Bool" isProductTag="true" isLocationTag="false" subsection="Default Sub Section" section="Default Section" subgroup="Default Sub Group" group="Default Group"/>
      <!--added 3rd row for testing the failure -->
       <TagInfo id="3" name="TestName3" type="Bool" isProductTag="true" isLocationTag="false" subsection="Default Sub Section" section="Default Section" subgroup="Default Sub Group" group="Default Group"/>
    </ArrayOfTagInfo>'''
    
    //Parsing the jdbc and build the jdbc model object list
    def results = new XmlSlurper().parseText(jdbcResponse)
    def jdbcDataObjects = []
    results.ResultSet.Row.each { row ->
        jdbcDataObjects.add(new Model().buildJdbcData(row))
    }
    
    //Parsing the json and build the json model object list
    def arrayOfTagInfo = new XmlSlurper().parseText(restResponse)
    def jsonDataObjects = []
    arrayOfTagInfo.TagInfo.each { tagInfo ->
        jsonDataObjects.add(new Model().buildJsonData(tagInfo))
    }
    
    //sorting the Data before checking for equality
    jdbcDataObjects.sort()
    jsonDataObjects.sort()
    
    if (jdbcDataObjects.size() != jsonDataObjects.size()) {
        System.err.println("Jdbc resultset size is : ${jdbcDataObjects.size()} and Json result size is : ${jsonDataObjects.size()}")
    }
    assert jdbcDataObjects == jsonDataObjects, "Comparison of Jdbc and Json data is failed"
    

    上面第3行不匹配,所以assert会抛出如下错误:

    捕获:java.lang.AssertionError:比较失败。表达式:(jdbcDataObjects == jsonDataObjects)。值:jdbcDataObjects = [默认组 3,默认组,默认组],jsonDataObjects = [默认组,默认组,默认组] java.lang.AssertionError:比较失败。表达式:(jdbcDataObjects == jsonDataObjects)。值:jdbcDataObjects = [默认组 3,默认组,默认组],jsonDataObjects = [默认组,默认组,默认组] 在 So31472381.run(So31472381.groovy:104)
    进程以退出代码 1 结束

    如果删除 3rd(从两个响应中),则不会看到任何错误,这表明 jdbc 和 json 响应比较成功。

    请注意,groovy script 提供免费版和专业版 SoapUI。所以这个解决方案适用于 SoapUI 的两个版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      相关资源
      最近更新 更多