2016-04-14 29 views
0

Parametre adı tekrarlandığında ve farklı değerler içerdiğinde, birkaç parametre içeren bir soapui yanıtım var. Parametrelerin varlığını nasıl söyleyebiliriz? zaman damgası, veri, profil, tam, id, uç noktaları belirtebilirim çünkü bunlar benzersizdir, ancak etiket, dallar, url, api-sürümü, appname birkaç kez tekrarlanır.Parametre adı groovy kullanarak nasıl değer vermez?

Bir parametrenin değerini nasıl atacağımı biliyorum ancak etiket, dallar, url, api sürümü, uygulama adı gibi yalnızca parametre adını nasıl atacağımı bilmiyorum.

cevabı:

<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> 

Bana yardım eder misiniz? o ... Ben gerçekten durumu anlamak emin değilim

+0

Ne kadar var? Ne denedin? Ayrı değerleri toplayabilmeniz ve aynı sayıda anahtarın –

+0

anahtarını kullanıp kullanmadığınızı kontrol etmelisiniz, ancak son nokta = context.expand ('$ {login # Endpoint}') def yanıtı = context.expand ('$ {login # Response # declare namespace ns1 = \ 'https: //au.io/ns/201 \'; // ns1: login_resp [1]/ns1: öğe [1]/ns1: yanıt [1]} ') def etiketi1 endpoint.label [0] = ("etiket") assert endpoint.contains (label1) –

+0

Bunu soruya koyabilir misiniz? –

cevap

1

, bu size bir düğüm özelliğinde bir JSON olan bir XML yanıtını aldığınızı görünüyor size değil ederiz? Buna rağmen

benim anlamadığım size JSON tüm endpoints girişleri tüm zorunlu özelliklerini içerdiğini kontrol etmek istiyorum temelde: label, branch, appname; ve her son noktadaki tüm branches, url, name, api_version ve label içerir.

Olası bir yaklaşım JsonSlurper kullanmak ve öğenin null olup olmadığını kontrol etmektir. Bir şey gibi:

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' 
    } 
} 

GÜNCELLEME

Muhtemel XML ve XSD, sizin Json karşı doğrulamak için hiçbir şema yoktur, ancak yanıtınızı doğrulamak için şablonu oluşturabilir JsonSlurper kullanımına karşı. Yalnızca elemanların name s için kontrol etmek istediğiniz beri değil, değerler yinelemeli name s karşılaştırmak için bir işlevi oluşturabilirsiniz:

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) 
} 

Umarım yardımcı olur,

+1

Güzel, bir yorum olsa da. Örneğin: kullanıcı, 'appname' kendini eksik olduğunda hata mesajını beklendiği gibi alın.Ancak, "appname" değeri boş olduğunda aynı onaylama hatası veriyor, "appname": "" 'beklenmeyebilir, sanırım. – Rao

+0

@Rao ouch ... Haklısınız! ':)' ... Null' ile karşılaştırmaktan kaçınmak istiyorum ama boş dize yanlış olduğunu hesaba katmıyorum. Cevabımı güncelliyorum. Teşekkürler! – albciff

+0

Sevindim ve çok hızlısın. :) – Rao