Збереження reports на pytest node
Зберігає reports фаз у typed pytest stash, щоб teardown fixture могла перевірити failure потрібної фази.
Після фази call item.stash[phase_reports_key]["call"] містить відповідний TestReport.
Відеобібліотека
Пошук у нотатках курсу Python мануфактура та спільних матеріалах з переходом на потрібну секунду.
Зберігає reports фаз у typed pytest stash, щоб teardown fixture могла перевірити failure потрібної фази.
Після фази call item.stash[phase_reports_key]["call"] містить відповідний TestReport.
Проєктує лише потрібне поле id замість поширення raw dictionary у UI-тест.
Assertion завершується без помилки й повертає Project(id='p-1').
`dict` зберігає пари key/value й природно представляє JSON-like payload або response. `user["email"]` читає обов’язкове поле та падає, якщо ключа немає; `user.get("displayName", "not provided")` дозволяє явно задати fallback для optional field.
Оператор `in` для `dict` перевіряє ключі, а не values. Тому `"email" in response` відповідає на питання, чи API повернув поле, незалежно від його поточного значення; для перевірки значення потрібне окреме звернення за ключем.
Замість того щоб працювати з response як із набором рядків і dictionary keys, пропонується описати його через `Pydantic`. Так тест перевіряє не лише наявність значення, а й структуру, типи та обов’язковість полів. Джерелом схеми може бути `OpenAPI`-специфікація Testomat.io. Якщо документації немає, модель можна початково згенерувати з реального JSON через JSON-to-Pydantic і потім відредагувати. Автор одразу попереджає: навіть офіційна специфікація може відставати від фактичної response schema.
Функція оголошується через `def`, приймає named parameters і може повертати значення. Type hints на кшталт `email: str` та `-> dict[str, str]` покращують navigation і IDE checks, але самі по собі не валідовують input at runtime.
`{user["id"]: user for user in users}` будує index, де ID стає key, а весь user — value. Після цього конкретний об’єкт читається напряму, без повторного проходу по list. Якщо IDs дублюються, пізніше значення перезапише попереднє — це слід перевіряти, якщо унікальність не гарантована контрактом.
`headers.items()` дає пари key/value, `headers.keys()` — лише keys, `headers.values()` — лише values. Вибір залежить від перевірки: для друку повного header потрібні обидві частини, а для валідації набору полів достатньо keys.
Raw `dict` змушує пам’ятати рядкові ключі й не дає надійного autocomplete. Response перетворюється на невелику `Project` dataclass із фактично потрібними полями, насамперед `id` та attributes. Десеріалізація має відповідати реальній response schema. Не потрібно моделювати всі поля API «про запас»: для поточного vertical slice достатньо тих, які читає тест, з явною помилкою при відсутньому обов’язковому значенні.
Тест отримує `config` як параметр так само, як `page`. На цьому етапі fixture повертає dictionary, тому значення читаються за ключами: URL для відкриття сторінки, email і пароль для авторизації. Зміна проходить через реальний запуск тестів. Помилки на кшталт невірного імені fixture або відсутнього ключа знаходяться лише тоді, коли відповідний шлях справді виконується.