Python Unittest для метода, возвращающего строку json

Я новичок в написании модульных тестов на Python. У меня есть метод в классе, возвращающий ответ Json от API. Ответ JSON содержит такие атрибуты, как данные, токен, имя объекта и статус. Метод обращается к API и каждый раз возвращает ответ с разными значениями, поэтому я не могу жестко закодировать ответ и протестировать его. Как я могу написать модульный тест для этого типа метода.

Одна вещь, о которой я подумал, это проверить, не является ли ответ нулевым. Есть ли какие-либо другие типы проверок, которые я могу сделать здесь.

Каждый раз он возвращает другой токен, дату (отметку времени). Статус будет таким же.

def Json_get_status(self):
    get_url = "xxxx" #URL to hit API
    r = requests.get(get_url)
    self.get_json = json.loads(r.text)
    self.get_token=self.get_json["token"]
    self.get_date=self.get_json["date"]
    self.get_status=self.get_json["status"]
    return self.get_json

person Santhosh    schedule 14.04.2015    source источник
comment
Будут ли все данные каждый раз отличаться или есть какие-то поля, которые вы можете проверить? Не могли бы вы проверить, что все поля имеют правильный тип или находятся в соответствующих диапазонах? Не могли бы вы издеваться над вызовом API? Что именно вы пытаетесь проверить?   -  person jonrsharpe    schedule 14.04.2015
comment
Только что сделал правку в вопросе. Да, я могу попытаться издеваться над вызовом API. Я пытаюсь проверить, правильно ли этот метод считывает статус из ответа Json.   -  person Santhosh    schedule 15.04.2015
comment
Это может оказаться проще, если вы разделите его на несколько отдельных частей — проверка того, может ли метод правильно анализировать строку JSON, должна быть тривиальной. Не могли бы вы опубликовать метод с минимальным скелетом класса вокруг него?   -  person jonrsharpe    schedule 15.04.2015
comment
добавлен скелет метода   -  person Santhosh    schedule 15.04.2015


Ответы (1)


Если ваш тестируемый метод должен «правильно читать статус», вы можете специально проверить это.

Итак, если ваше приложение похоже на

def read_status(response):
    parsed = json.loads(response)
    # does other stuff
    return something

Затем в вашем test_unit.py

def test_read_status(self):
   mock_input_val = {'something': 'good val'}
   expected_positive_return_val = something
   self.assertEqual(read_status(json.dumps(mock_input_val)),       
                    expected_positive_return_val)

Также полезно выполнить отрицательный тест для условия, когда read_status либо не может проанализировать объект json, либо находит ошибку в ответе.

person michael salmon    schedule 14.04.2015
comment
Да, но он не получает json в качестве аргумента. он каждый раз опрашивает API, а затем использует этот ответ JSON (внутренний метод) - person Santhosh; 15.04.2015
comment
Основываясь на предоставленном вами коде, я бы предложил создать внутреннюю функцию, которая получает вывод json.loads(resp.text), а затем выполняет модульное тестирование этой функции. Таким образом, вы отделяете сеть и бизнес-логику. В модульном тестировании не так много смысла, который просто выдает http get. Вы можете усложнить работу с фиктивными сервисами, но начинать с простого — это хорошо. - person michael salmon; 15.04.2015