← назад к разделу

Одна переменная держит одно значение. Но ответ сервиса — это не одно значение, а набор: заказ с номером, суммой и статусом, а рядом список позиций. Для таких наборов в языке есть два хранилища, и почти вся работа тестировщика — это работа с ними.

список — по номеру, с нуля NEW[0] PAID[1] SHIPPED[2] словарь — по имени поля "id": "ord-042" "status": "PAID" "total": 4990 разобранный JSON и есть словарь ответ["items"][0]["product"]каждая скобка — шаг вглубь поля может не быть — тогда get(), а не [ ]

Список хранит по порядку и достаётся номером; словарь — по имени поля. Ответ сервиса — словарь со списками внутри.

Список: перечень по порядку

живой пример

статусы = ["NEW", "PAID", "SHIPPED"]
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Квадратные скобки, значения через запятую. Элементы пронумерованы с нуля — это главная ловушка для новичка:

живой пример

статусы = ["NEW", "PAID", "SHIPPED"]

print(статусы[0])     # NEW   — первый
print(статусы[1])     # PAID  — второй
print(статусы[-1])    # SHIPPED — последний
print(len(статусы))   # 3     — сколько всего
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Отрицательный номер считает с конца: [-1] — последний элемент, и это удобнее, чем [len(список) - 1].

Добавить и проверить:

живой пример

статусы = ["NEW", "PAID", "SHIPPED"]

статусы.append("DELIVERED")     # добавить в конец
print(статусы)
print("PAID" in статусы)        # True — есть ли такой
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Если попросить элемент, которого нет, — IndexError: list index out of range. Ошибка полезная: она означает, что данных меньше, чем вы ожидали, — частая находка в тестах.

Словарь: значение по имени

живой пример

заказ = {
    "id": "ord-042",
    "status": "PAID",
    "total": 4990,
}
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Фигурные скобки, пары «ключ: значение». Достают по ключу, а не по номеру:

живой пример

заказ = {
    "id": "ord-042",
    "status": "PAID",
    "total": 4990,
}

print(заказ["status"])     # PAID
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Это и есть JSON. Ответ сервиса в формате JSON после разбора превращается в Python-словарь один в один: те же ключи, те же значения. Поэтому «прочитать поле из ответа» — это ответ["status"], и ничего больше.

Изменить и добавить:

живой пример

заказ = {
    "id": "ord-042",
    "status": "PAID",
    "total": 4990,
}

заказ["status"] = "SHIPPED"     # поменяли
заказ["paid_at"] = "2026-09-12" # добавили новое поле
print(заказ)
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Поле, которого может не быть

Вот здесь ломается больше всего тестов. Обращение к отсутствующему ключу — это ошибка:

живой пример

# ошибка: пример падает намеренно — поля «скидка» в заказе нет
заказ = {
    "id": "ord-042",
    "status": "PAID",
    "total": 4990,
}

print(заказ["скидка"])     # KeyError: 'скидка' 
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Тест падает не потому, что нашёл дефект, а потому, что плохо написан. Два безопасных способа:

живой пример

заказ = {
    "id": "ord-042",
    "status": "PAID",
    "total": 4990,
}

if "скидка" in заказ:
    print(заказ["скидка"])

print(заказ.get("скидка"))          # None, если поля нет
print(заказ.get("скидка", 0))       # 0, если поля нет
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

get() — рабочая лошадка: поле в ответе может быть необязательным, и тест должен это переживать. Но осторожно: get() прячет отсутствие поля. Если поле обязано быть по контракту, проверяйте его наличие явно, иначе тест промолчит о настоящем дефекте.

Вложенность: словари внутри списков внутри словарей

Реальный ответ выглядит примерно так:

живой пример

ответ = {
    "id": "ord-042",
    "customer": {"id": "cus-01", "name": "Анна"},
    "items": [
        {"product": "Кофемолка", "qty": 1, "price": 4990},
        {"product": "Ланчбокс", "qty": 2, "price": 890},
    ],
    "total": 6770,
}
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Читают его по шагам, слева направо:

живой пример

ответ = {
    "id": "ord-042",
    "customer": {"id": "cus-01", "name": "Анна"},
    "items": [
        {"product": "Кофемолка", "qty": 1, "price": 4990},
        {"product": "Ланчбокс", "qty": 2, "price": 890},
    ],
    "total": 6770,
}

print(ответ["customer"]["name"])        # Анна
print(ответ["items"][0]["product"])     # Кофемолка
print(ответ["items"][1]["qty"])         # 2
print(len(ответ["items"]))              # 2 — сколько позиций
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Каждая скобка — один шаг вглубь. Если запутались, разложите на переменные:

живой пример

ответ = {
    "id": "ord-042",
    "customer": {"id": "cus-01", "name": "Анна"},
    "items": [
        {"product": "Кофемолка", "qty": 1, "price": 4990},
        {"product": "Ланчбокс", "qty": 2, "price": 890},
    ],
    "total": 6770,
}

покупатель = ответ["customer"]
имя = покупатель["name"]
print(имя)
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Читается хуже одной строки, зато видно, где именно упало, когда упадёт.

Чем список отличается от словаря

Правило простое: список — когда элементы однотипные и важен порядок (позиции заказа, найденные записи); словарь — когда у каждого значения своё имя (поля объекта).

Пример из жизни: выдача списком, а каждый её элемент — словарь:

живой пример

{"items": [ {...}, {...} ], "total": 42}
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Что решать

Банк «Данные»:

Коротко

  • Список — перечень по порядку, нумерация с нуля, [-1] — последний.
  • Словарь — «имя: значение»; разобранный JSON и есть словарь, поэтому чтение поля из ответа выглядит как ответ["status"].
  • Отсутствующий ключ роняет тест с KeyError; безопасно — get() или проверка in, но обязательное по контракту поле проверяйте явно.
  • Вложенность читается по шагам: ответ["items"][0]["product"].
  • Список — однотипное и по порядку, словарь — именованные поля.

Что почитать дальше

  • Циклы — как пройти по всем позициям заказа.
  • Функции — как собрать проверку в одном месте.