使用Groovy创建断言,其中JSON包含具有相同名称的多个对象

时间:2018-09-24 15:47:50

标签: json api groovy automated-tests ready-api

我目前正在用ReadyAPI编写一些测试,以测试我们正在构建的新API。该API将以以下格式返回JSON:

{
   "testJSON" : [
      {
         "test1" : "111",
         "test2" : "ABC"
      },
      {
         "test1" : "222",
         "test2" : "DEF"
      }
   ]
}

我添加了以下Groovy代码,该代码分解了JSON并列出了每个值:

import groovy.json.JsonSlurper 


def jsonResp = context.expand( '${GetTest#Response}' )
def jsonElements = new JsonSlurper().parseText(jsonResp)
for ( value in jsonElements.testInput ) {
    value.each{
            log.info "${it.key}:${it.value}"
    }
}

我想做的是获取此JSON响应并将其与数据的预定义列表进行比较(使用ReadyAPI中的数据源)。该数据源将包含一个名为“ test1”的列和一个名为“ test2”的列-这些将包含每个对象的所有期望值。因此,我们需要确保来自数据源的每个test1值都显示在响应JSON中。而且我们还要确认,对于每个“ test1”,我们都会获得正确的对应“ test2”。

因此在上面的示例中,我们想证明响应包含111和222的“ test1”值,对于111,我们得到了ABC等的“ test2”值。

上面的示例是我们新API的简化视图,实际上,它将包含更多的字段和更多的响应。因此,理想情况下,我不需要在Groovy脚本中硬编码特定值-这就是为什么我要使用数据表的原因。

有人对这种事情有任何经验,可以提出建议吗?

在此先感谢您的帮助,如果您需要更多信息,请告诉我。

干杯, 马特

1 个答案:

答案 0 :(得分:1)

“ testJSON”是包含属性“ list1”和“ list2”的对象的列表。 您的数据源也是包含属性(列)“ list1”和“ list2”的对象(行)的列表。

使用嵌套的for循环将每个预期对象与响应中的每个对象进行比较。使用布尔值标志跟踪响应中是否缺少test1。找到test1后,检查test2的值。

这是基本轮廓。我假设test1是每个对象的唯一标识符。当您找到test1时,您可能还想退出内部循环,以提高效率。

for (element in datasource) {
    def foundTest1 = false
    for (response in testJSON) {
        if (response.test1 == element.test1){
            foundTest1 = true
            assert response.test2 == element.test2
            // assert any number of other properties here
        }
    }
    assert foundTest1 == true
}