[英]How to Validate two JSON API Response key-value pair matches on runtime using python?
我正在嘗試驗證兩個API JSON響應鍵-值對是否具有相同的鍵值,如果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響應密鑰驗證。 用過的:
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響應鍵有用。 因此,我需要在執行時比較兩個API的JSON響應,或者將其存儲在兩個文件中並打開並進行驗證。 我以為可以驗證這些文件,但是會進行更多的編碼,因此考慮通過在運行時本身進行驗證來減少代碼長度。
請提出您的想法。
# 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.