Как проверить два соответствия пары ключ-значение JSON API Response во время выполнения с помощью Python? - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь проверить две пары ключ-значение ответа JSON API для одних и тех же значений ключа и выдает ошибку, если в ответе JSON есть несоответствие.

Например: 1. www.oldurl.com дает=>

   { "firstName":"alex", "age":31, "dob":"10-12-1988" }

2. www.newurl.com gives =>

   { "firstName":"**alx**", "**ag**":31, "dob":"10-12-1988" }

Здесь oldurl и newurl дают одинаковый ответ JSON, но в newurl мы видим ошибку в ключе и значениях.

Теперь мне нужно отловить эту ошибку и показать пользователю, что в newurl.com существует несоответствие с именем и возрастом ключа.

Код Python:

import unittest
import requests, json,settings
from requests.auth import HTTPBasicAuth
from jsonschema import validate
class TestOne(unittest.TestCase):
    def setUp(self):

    def test_oldurl(self):
    resp=requests.get('www.oldurl.com',auth=HTTPBasicAuth(settings.USER_NAME,settings.PASSWORD))
    data = resp.text
    print (data)  #Prints json 

    def test_newurl(self):
    resp=requests.get('www.newurl.com',auth=HTTPBasicAuth(settings.USER_NAME,settings.PASSWORD))
    data = resp.text
    print (data)  #Prints json 

теперь я получил два JSON-ответа. Как я могу проверить эти два ответа?Существуют ли библиотеки Python, которые могут проверять и отображать любые ошибки в ключах и значениях.

примечание: оба ответа JSON должны быть одинаковыми. Я делаю это как часть проверки, чтобы избежать ошибок в будущем ответе.

Я также использовал схему только для одной проверки ключа ответов JSON.used:

    def setUp(self):
    with open('Blueprint_schema.json', 'r') as f:
        self.schema = f.read()
        self.file = f
     validate(json.loads(data), json.loads(self.schema))
     self.assertNotEqual(data,'[]')

, но это помогает только для одного ключа ответа JSON.Итак, мне нужно сравнить два ответа JSON API при выполнении или сохранении его в двух файлах, его открытии и проверке.Я думал, что эти файлы проверяются, но это будет больше кодирования, поэтому подумал об уменьшении длины кода путем проверки самой среды выполнения.

Пожалуйста, предложите свои идеи.

1 Ответ

0 голосов
/ 22 сентября 2018
# newurl_resp should also give back same key:value pairs as oldurl was giving

#load JSON Data into Dictionary 
import json
f = open("response_oldurl.json")
oldurl_resp= json.load(f)
f.close()
#type(oldurl_resp) --> <class dict>

oldurl_resp = { "firstName":"alex", "age":31, "dob":"10-12-1988" }
newurl_resp = { "firstName":"**alx**", "**ag**":31, "dob":"10-12-1988"}

ошибка сообщения о заходе на посадку 1 на лету

def validate_resp(old_resp,new_resp):
    for old_k,old_v in oldurl_resp.items():

        try:
            if old_k in new_resp:
                new_val = new_resp[old_k]
            else:
                raise KeyError('newurl_response doesn\'t have key: '+old_k)

            try:
                if old_v != new_val:
                    raise ValueError('new value = '+str(new_val)+' doesn\'t match with orignal value = '+str(old_v)+' of key: '+str(old_k))

                    #raise ValueError('new value = {} doesn\'t match with orignal value = {} of key: {}'.format(new_val,old_v,old_k))

            except ValueError as v_err:
                print(v_err.args)

        except KeyError as k_err:
            print(k_err.args)


validate_resp(oldurl_resp,newurl_resp)

#("new value = **alx** doesn't match with orignal value = alex of key: firstName",)
#("newurl_response doesn't have key: age",)

заход на посадку 2 сохраняет их для дальнейшего использования

items_with_value_err = []
missing_keys = []

def validate_resp(old_resp,new_resp):
    for old_k,old_v in oldurl_resp.items():
        if old_k in new_resp:
            if new_resp[old_k] != old_v:
                # key is same but new_resp contains different value
                items_with_value_err.append((old_k,old_v,new_resp[old_k]))
        else:
            missing_keys.append(old_k)

    if len(items_with_value_err) == 0 and len(missing_keys) == 0:
        return True
    else:
        return False

print(validate_resp(oldurl_resp, newurl_resp)) #prints False
...