如何在soapui中比较来自2个不同API的2个不同的json响应?

时间:2017-11-06 15:20:43

标签: json groovy soapui

假设我正在创建用户,我可以从2个不同的存储库(本地服务器,中央集线器)获取这些用户详细信息。

所以当我为这个API做一个GET方法时,我会收到一组值,(比如说这个GET方法来自本地服务器),当我做另一个GET时(比如说这个GET方法来自中心集线器)。

我的要求是比较这两种不同的API响应是否相同?怎么做到这一点?
样品回复:

[
      {
      "name": "ABCD",
      "user": "TEMP_USER",
      "description": null,
      "createdtime": "2017-11-06 11:11:18",
      "groupname": "XYZ",
      "tempId": 101998,
   },
{
      "name": "EFGH",
      "user": "TEMP_USER",
      "description": null,
      "createdtime": "2017-11-05 11:11:18",
      "groupname": "XYZ",
      "tempId": 101999,
   }
]

2 个答案:

答案 0 :(得分:2)

下面,我假设resp1Strresp2Str都包含原始帖子中的JSON。

我们可以建立一个解决方案(也列为here),而不是发布代码墙。首先,考虑将JSON解析为地图列表,并按name

对列表进行排序
def resp1 = new groovy.json.JsonSlurper().parseText(respStr1)
def resp2 = new groovy.json.JsonSlurper().parseText(respStr2)

resp1.sort{a,b -> a.name <=> b.name}
resp2.sort{a,b -> a.name <=> b.name}

assert compareUsers(resp1, resp2)

现在,我们需要实施compareUsers。它将每个地图转换为UserInfo对象,可以通过compareUser(此处未列出)进行比较:

def compareUsers = { resp1, resp2 ->
    def result = true

    if (resp1.size() == resp2.size()) {
        // assume lists are sorted
        [resp1, resp2].transpose().each {
            def userInfo1 = buildUserInfo(it[0])
            def userInfo2 = buildUserInfo(it[1])
            if (result) {
                result = compareUser(userInfo1, userInfo2)
            }
        }
    } else {
        result = false
    }

    result
}

compareUser的实施只是比较keysvalues(我们会看到keys已排序,values按键排序):

def compareUser = { userInfo1, userInfo2 ->
    (userInfo1.keys == userInfo2.keys) && (userInfo1.values == userInfo2.values)
}

最后,我们需要了解如何将地图转换为使用Groovy UserInfo功能的Expando

def buildSortedList = { items ->
    def list = []
    list.addAll(items)
    Collections.sort(list)
    list
}

def buildUserInfo = { user ->
    def result = new Expando()
    result.keys = buildSortedList(user.keySet())
    result.values = []
    result.keys.each { key -> result.values << user[key] }
    result
}

答案 1 :(得分:1)

@Grab(group='org.skyscreamer', module='jsonassert', version='1.5.0', scope='test')

import org.skyscreamer.jsonassert.JSONAssert;

def a='''[{
      "name": "ABCD",
      "user": "TEMP_USER",
      "description": null,
      "createdtime": "2017-11-06 11:11:18",
      "groupname": "XYZ",
      "tempId": 101998
}]'''
def b='''[{
      "name": "ABCD",
      "user": "TEMP_USER",
      "description": null,
      "createdtime": "2017-11-06 11:11:18",
      "groupname": "XYZ",
      "tempId": 1019981
}]'''

JSONAssert.assertEquals(a,b,false)