2016-04-14 1 views
0

У меня есть ответ soapui, который содержит несколько параметров, когда имя параметра повторяется и содержит другое значение. Как мы можем утверждать существование параметров? Я могу утверждать timestamp, data, profile, full, id, endpoints, потому что они уникальны, но метки, ветви, url, api-version, appname повторяются несколько раз.Как утверждать имя параметра без значения с помощью groovy?

Я знаю, как утверждать значение параметра, но я не знаю, как утверждать только имя параметра, как метка, ветви, url, api-версия, appname.

ответ:

<response>{ 
    "timestamp": "2016-04-14T17:53:29Z", 
    "data": { 
    "profile": { 
     "full": "test" 
    }, 
    "id": "544cc493-8f4a-4f14-b95b-2c127f54caac", 
    "endpoints": [ 
     { 
     "label": "Gify", 
     "branches": [ 
      { 
      "url": "/gify/v1.0/", 
      "name": "test", 
      "api_version": "1.0", 
      "label": "test" 
      } 
     ], 
     "appname": "gify" 
     }, 
     { 
     "label": "x1", 
     "branches": [ 
      { 
      "url": "/x1/v1.0/", 
      "name": "test", 
      "api_version": "1.0", 
      "label": "test" 
      } 
     ], 
     "appname": "gify2" 
     }, 
     { 
     "label": "y1", 
     "branches": [ 
      { 
      "url": "/y1/v1.0/", 
      "name": "test", 
      "api_version": "1.0", 
      "label": "test" 
      } 
     ]} 
     <response> 

Можете ли вы помочь мне, пожалуйста? Спасибо

+0

Что у вас до сих пор? Что вы пробовали? Вы должны иметь возможность собирать различные значения и проверять, что у вас есть такое же количество из них, что и ключи –

+0

. Я попытался, но def endpoint = context.expand ('$ {login # Endpoint}') def response = context.expand ('$ {login # Response # declare namespace ns1 = \ 'https: //au.io/ns/201 \'; // ns1: login_resp [1]/ns1: item [1]/ns1: response [1]} ') def label1 endpoint.label [0] = ("label") assert endpoint.contains (label1) –

+0

Можете ли вы поместить это в вопрос? Код невозможно прочитать в комментариях –

ответ

1

Я не уверен, что я действительно понимаю ситуацию, то кажется, что вы получаете в XML ответ, который имеет JSON в атрибуте узла ... не так ли?

Несмотря на это, что я понимаю, в основном, что вы хотите, чтобы убедиться, что все endpoints записи в вашем JSON содержит все обязательные атрибуты: label, branch, appname; и все branches в каждой конечной точке содержит url, name, api_version и label.

Таким образом, можно использовать JsonSlurper и проверить, нет ли элемента null. Что-то вроде:

import groovy.json.JsonSlurper 

def jsonTxt = '''{ 
     "timestamp": "2016-04-14T17:53:29Z", 
     "id": "544cc493-8f4a-4f14-b95b-2c127f54caac", 
     "endpoints": [ 
     { 
     "label": "Gify", 
     "branches": [ 
      { 
      "url": "/gify/v1.0/", 
      "name": "test", 
      "api_version": "1.0", 
      "label": "test" 
      } 
     ], 
     "appname": "gify" 
     }, 
     { 
     "label": "x1", 
     "branches": [ 
      { 
      "url": "/x1/v1.0/", 
      "name": "test", 
      "api_version": "1.0", 
      "label": "test" 
      } 
     ], 
     "appname": "gify2" 
     } 
    ] 
}''' 
// parse json 
def json = new JsonSlurper().parseText(jsonTxt) 
// for each endpoint 
json.endpoints.each { endpoint -> 
    // check that label is not null 
    assert endpoint.label != null, 'ENDPOINT ENTRY NOT CONTAINS LABEL' 
    // check that appname is not null 
    assert endpoint.appname != null, 'ENDPOINT ENTRY NOT CONTAINS APPNAME' 
    // ... 
    assert endpoint.branches != null, 'ENDPOINT ENTRY NOT CONTAINS BRACHES' 
    // for each branch 
    assert endpoint.branches.each { branch -> 
     // and so on... 
     assert branch.url != null, 'BRANCH ENTRY NOT CONTAINS URL' 
     assert branch.name != null, 'BRANCH ENTRY NOT CONTAINS NAME' 
     assert branch.api_version != null, 'BRANCH ENTRY NOT CONTAINS API_VERSION' 
     assert branch.label != null, 'BRANCH ENTRY NOT CONTAINS LABEL' 
    } 
} 

UPDATE

Вряд XML и XSD, нет схемы для проверки против вашего Json, однако вы можете создать шаблон для подтверждения вашего ответа против использования JsonSlurper. Так как вы только хотите, чтобы проверить на name с элементов не его значение вы можете создать функцию для сравнения name s рекурсивно:

import groovy.json.JsonSlurper 

// compare json against the "schema" 
def compareJsonNames(json,schema) { 

    if(json instanceof Map){ 
     // it's a map... check all names 
     assert(json.keySet() == schema.keySet()) 

     // for every element in a map... 
     json.eachWithIndex { it,index -> 
      def key = schema.keySet().getAt(index) 
      return compareJsonNames(it.value, schema.find{ e -> e.key == key}.value) 
     } 

    }else if(json instanceof List){ 
     // it's a list, compare its elements 
     json.eachWithIndex { it, index -> 
      return compareJsonNames(it,schema[index]) 
     } 
    } 

    // it's a simple value nothing to do 
} 

def jsonTxt = '''{ 
     "timestamp": "2016-04-14T17:53:29Z", 
     "id": "544cc493-8f4a-4f14-b95b-2c127f54caac", 
     "endpoints": [ 
     { 
     "label": "Gify", 
     "branches": [ 
      { 
      "url": "/gify/v1.0/", 
      "name": "test", 
      "api_version": "1.0", 
      "label": "test" 
      } 
     ], 
     "appname": "gify" 
     }, 
     { 
     "label": "x1", 
     "branches": [ 
      { 
      "url": "/x1/v1.0/", 
      "name": "test", 
      "api_version": "1.0", 
      "label": "test" 
      } 
     ], 
     "appname": "gify2" 
     } 
    ] 
}''' 

// template to validate the names 
def template = '''{ 
     "label": "", 
     "branches": [ 
      { 
      "url": "", 
      "name": "", 
      "api_version": "", 
      "label": "" 
      } 
     ], 
     "appname": "" 
}''' 

def slurper = new JsonSlurper() 

// parse your response and the expected template 
def json = slurper.parseText(jsonTxt) 
def jsonTemplate = slurper.parseText(template) 
// check if each endpoint are well formed against the template 
json.endpoints.each { 
    compareJsonNames(it,jsonTemplate) 
} 

Надеется, что это помогает,

+1

Ницца, один комментарий. Например, пользователь получает сообщение об ошибке, как ожидалось, когда 'appname' сам отсутствует.Тем не менее, он дает ту же ошибку утверждения, когда значение 'appname' пуст, говорит' 'appname": "" ', что может и не ожидаться, я думаю. – Rao

+0

@ Rao ouch ... ты прав! ':)' ... Я хочу избежать «null» для сравнения, но я не принимаю во внимание, что пустая строка является ложной. Я обновляю свой ответ. Благодаря! – albciff

+0

Рад, и вы так быстро. :) – Rao

Смежные вопросы