Как перебирать каждый элемент свойства в ответе API в студии Katalon?

Я пишу тестовый скрипт в katalon studio для проверки тела ответа API. Мой ответ имеет формат:

{
  "status": "Success",
  "correlationCode": "1234-5678",
  "type": {
    "id": 51247,
    "name": "Student",
  },
  "data": {
    "name": "Sara Nieves",
    "gender": "Female",
    "dob": "1995-08-06",
    "libraryCard": {
      "id": "11178",
      "type": "Seniors"
    },
    "qualifications": [
      {
        "id": "45650986546",
        "name": "Graduate Certificate in Environmental Engineering Management"
      }
    ]
  }
}

Я хочу убедиться, что ни один из элементов не возвращает нулевое значение. Поскольку элементы, возвращаемые для ответа API, не являются статическими (это означает, что имя, пол и т. Д. Могут не возвращаться каждый раз), поэтому я не могу использовать что-то вроде «data.name», чтобы проверить, имеет ли оно нулевое значение. Итак, мне нужен общий способ перебрать каждый возвращаемый атрибут и проверить, возвращается ли его значение как null или нет.

Любая помощь будет высоко ценится. Спасибо!


person Muzna Zafar    schedule 27.09.2019    source источник
comment
response.each{k,v-> assert v!=null } но создать рекурсивную функцию   -  person daggett    schedule 27.09.2019
comment
@daggett Не могли бы вы объяснить, как это работает? ... я не понимаю, что здесь означает 'k & v', и если я попробую это решение, оно выдаст мне исключение: java.lang.Object k, java.lang .Object v - ›...}) 2019-09-30 12: 43: 45.315 ОШИБКА ckkcore.main.WSVerificationExecutor -? Проверка не пройдена. Причина: groovy.lang.MissingMethodException: нет сигнатуры метода: WSVerification1569811424284 $ _run_closure1.doCall () применима для типов аргументов: (com.kms.katalon.core.testobject.ResponseObject) значения: [200 1 КБ] 22572.groovy: 21)   -  person Muzna Zafar    schedule 30.09.2019


Ответы (2)


У вас есть сообщение об ошибке:

groovy.lang.MissingMethodException: нет сигнатуры метода: WSVerification1569811424284 $ _run_closure1.doCall () применима для типов аргументов: (com.kms.katalon.core.testobject.ResponseObject) значения: [200 1 КБ] 22572.groovy: 21)

Я предполагаю, что ваш тип объекта ответа: com.kms.katalon .core.testobject.ResponseObject

Код для анализа ответа как json и его проверки:

import groovy.json.JsonSlurper

/**
 * the recursive method to validate that json object does not have null values 
 * @param obj  - the parsed json object (sequence of maps and lists)
 * @param path - a variable to know where the error occurred in json data.
 */
void assertNoNullValue(Object obj, String path='ROOT'){
    //the main assertion
    assert obj!=null : "value in json could not be null: $path"

    if(obj instanceof Map){
        //iterate each key-value in map and validate the value recursively
        obj.each{k,v-> assertNoNullValue(v,path+".$k") }
    } else if(obj instanceof List){
        //iterate each value in list and validate the value recursively
        obj.eachWithIndex{v,i-> assertNoNullValue(v,path+"[$i]") }
    }
}

def response = ...
assert response.isJsonContentType()
def responseText = response.getResponseText()

//parse body
def data = new JsonSlurper().parseText(responseText)
assertNoNullValue(data)
person daggett    schedule 30.09.2019
comment
Спасибо @daggett. Это именно то, что я хотел :) - person Muzna Zafar; 02.10.2019

Это решение не так точно, как то, которое предлагает @dagget, но это быстрая проверка:

def response = '''
{
  "status": "Success",
  "correlationCode": "1234-5678",
  "type": {
    "id": 51247,
    "name": "Student",
  },
  "data": {
    "name": "Sara Nieves",
    "gender": "femmina",
    "dob": "1995-08-06",
    "libraryCard": {
      "id": "11178",
      "type": "Seniors"
    },
    "qualifications": [
      {
        "id": "45650986546",
        "name": "Graduate Certificate in Environmental Engineering Management"
      }
    ]
  }
}
'''
assert !response.contains("null")
person Mate Mrše    schedule 27.09.2019
comment
Привет, я хотел уточнить, что всякий раз, когда какой-либо атрибут возвращает нулевое значение, он отображается в ответ в следующем формате: name: null, т.е. без кавычек .... будет ли синтаксис, который вы указали, покрывать этот сценарий? Я попробовал ваше решение, и оно работает если я намеренно установил значение некоторого поля как null, и оно возвращается как name: null (т.е. с кавычками) - person Muzna Zafar; 30.09.2019
comment
Это проверяет подстроку, поэтому будет работать для null и null. - person Mate Mrše; 01.10.2019
comment
Спасибо друг. Хотя это не то решение, которое мне требовалось. это, безусловно, расширило мои знания - person Muzna Zafar; 02.10.2019