简体   繁体   中英

How to validate data from json response (Python)?

I am creating API tests using Robot Framework. I use requests library, do GET requests, and want to validate responses. But it shows me an error:

AttributeError: 'dict' object has no attribute 'count'.

Are there any other ways to validate the response?

library code

import requests

def get_method(URL):
    try:
        response = requests.get(URL,timeout=3)
        response.raise_for_status()
    except requests.exceptions.HTTPError as error1:
        raise TypeError("Http Error:", error1)
    except requests.exceptions.Timeout as error2:
        raise TimeoutError("Timeout Error:", error2)
    except requests.exceptions.ConnectionError as error3:
        raise ConnectionError("Error Connecting:", error3)
    return response 

keywords file

from robot.api.deco import keyword
import jsonschema
import json


class keywords:
    ROBOT_LIBRARY_SCOPE = 'TESTS'
    schemaAllUsers = {
        "type": "array",
        "count": {"type": "number"},
        "results": [{
            "name": {"type": "string"},
            "height": {"type": "number"},
            "mass": {"type": "number"}
        }]
    }

    @keyword
    def get_request(self, URL):
        return restAPI_library.get_method(URL)

    @keyword
    def assert_users_response(self, response):
        assert response.status_code == 200

    @keyword
    def get_json_response(self, URL):
        return restAPI_library.get_method(URL).json()

    @keyword
    def validate_json_response(self, response):
        assert response.count == '82'

tests file *

Library  keywords.py

*** Test Cases ***
TC - Verify GET request for all users
    ${Users}  Get Request  ${people_endpoint}
    Assert Users Response  ${Users}
    ${response}  Get Json Response  ${people_endpoint}
    VALIDATE JSON RESPONSE  ${response}

*** Variables ***
${people_endpoint}  https://swapi.dev/api/people 

在此处输入图像描述

This should demonstrate the problem and solution as well:

my_dict = {
    "count": 5
}

print(my_dict["count"]) # 5
print(my_dict.count) # AttributeError: 'dict' object has no attribute 'count'

Simple solution is as Pavel hinted

@keyword
def validate_json_response(self, response):
    assert response['count'] == '82

If you want to use thi repeatedly, than what you can do is find element in paht and evaluate that element. To your python library add keyword, something like this.

@keyword
def pathGet(self, dictionary , path):

    for item in path:
        dictionary = dictionary[item]
    return dictionary

usage in test will be as follows

*** Variables ***
@{DIR_COUNT}    count 

in the test you will add this block

${count}=    pathGet    ${response}    ${DIR_COUNT}
Should Be Equal    ${count}    ${82}

this way you can reuse the keyword, regardles of the elements path.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM