@Foxitovsky
Noble JS developer

Как проверить ключ значение JSON через pytest?

Доброго времени суток!
Есть определенный get запрос который в ответ передает JSON со значения курсов валют
Пример ответа на запрос:
{
    "bankId": XXX,
    "currency": "USD",
    "toCurrency": "RUB",
    "sellRate": 75.0,
    "buyRate": 70.0,
    "lastUpdated": "2021-04-03T20:55:19.4096176"
  },
  {
    "bankId": XXX,
    "currency": "EUR",
    "toCurrency": "RUB",
    "sellRate": 80.0,
    "buyRate": 79.0,
    "lastUpdated": "2021-04-03T20:55:19.4096176"
  }
]

и для написания корректного теста нужно проверить значения currency и toCurrency для данных пар валют, правильность получения 1 пары валют и bankId я смог сделать, но не понятно как получить assert второй пары

Кусок кода который проходит тест
def test_bank_id(self, response, agent_id): - agent_id передается из parametrize
        assert response.json()[0]['bankId'] == agent_id

    def test_currency_code_EUR(self, response):
        assert response.json()[1]['currency'] == 'EUR'

    def test_toCurrency_code_RUB(self, response):
        assert response.json()[0]['toCurrency'] == 'RUB'


Для USD-RUB приходит ошибка типа
def test_currency_code_USD(self, response):
>       assert response.json()[X]['currency'] == 'USD'
E       IndexError: list index out of range


При этом как видно из ответа пара USD-RUB идет первой в JSON, т.е по моей версии строки 1 и 0 должны быть USD и RUB соответственно.

Вопрос - как проверить вторую часть ответа?
  • Вопрос задан
  • 800 просмотров
Решения вопроса 1
@taktik
Sr. QA automation | SDET
Во-первых, непонятно зачем выносить проверки полей в отдельные тестовые функции. Проверки должны быть в том же тесте, где выполняется запрос.
Во-вторых, если json-структура представляет собой список объектов, то не нужно к этим объектам обращаться по конкретному индексу.
В итоге, твой тест можно написать примерно так:
def test_check_usd_rub_pair(self, agent_id):
	response = rest_client.get("http//:...")
	
	has_expected_pair = False
	for obj in response.json():
		assert obj.get('bankId') == agent_id
		if obj.get('currency') == 'USD' and obj.get('toCurrency') == 'RUB':
			has_expected_pair = True
	assert has_expected_pair, "Ответ не содержит валютную пару USD-RUB"

Так же рекомендую прикрутить к своим тестам какой-нибудь json-валидатор. Валидировать поля - это важно
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы