Strict validation для User DTO
Приклад відсікає coercion id із str у int, відсутній required field і невідомі extra fields.
Valid payload приймається; два invalid payloads спричиняють ValidationError.
Міграція бази даних і тестування даних →Відеобібліотека
Пошук у нотатках курсу Java з переходом на потрібну секунду.
Приклад відсікає coercion id із str у int, відсутній required field і невідомі extra fields.
Valid payload приймається; два invalid payloads спричиняють ValidationError.
Міграція бази даних і тестування даних →Використовує in-memory database, connection context manager і placeholders без зовнішніх dependencies.
Assertion проходить; query повертає row (1,).
Вибрати одну важливу дію в UI.
Написати user-facing locator, test id locator і короткий CSS fallback.
Змінити translation та experiment variant.
Обрати найстабільніший locator і зафіксувати його contract.
Обраний locator залишається однозначним у контрольованих variants, а причина вибору описана одним абзацом.
Перевірка фіксує лише сигнали, без яких користувач не може перейти до payment action; вона не перевіряє кожен animation frame або весь DOM.
Функція завершується лише після готовності ключових checkout controls.
Що має описувати isLoaded →`#search` знаходить елемент з `id="search"`. Довільний attribute записується у квадратних дужках: `[name='viewport']`. Коли значення має стабільну частину та змінний hash, оператор `*=` дає пошук за підрядком. Це корисно для generated attributes у frontend frameworks, але стабільна частина має бути досить специфічною, щоб не отримати кілька збігів.
Generated success client не завжди зручний для negative tests. API має повертати standardized error model з code, message і diagnostic fields, щоб frontend і tests могли відрізнити конкретні failures в межах одного HTTP status. Test-generated correlation/trace ID передається у header, логується і додається до report. Тоді розробник знаходить повний distributed trace для failed test, а не шукає за приблизним timestamp.
Щоб зрозуміти, чому UI різниться, потрібно дивитися не лише на сторінку. У DevTools варто перевірити `Network`, cookies, `localStorage` і `sessionStorage` та знайти дані, які визначають активну компанію або роль. У прикладі різницю задає `companyId`: конкретний ID відкриває корпоративний контекст, а відсутнє значення — free-проєкти. Це дає точну підказку, який стан треба підготувати перед тестом.
Якщо стабільного test ID або accessible name немає, припустимий короткий CSS selector через зрозумілий parent і тип дочірнього елемента. Locator повинен читатися; складний вираз варто сховати за змінною з предметною назвою. Не слід використовувати generated hashes, випадкові class names, positional indexes або повні DOM paths. Якщо ID має стабільний префікс і випадковий suffix, можна шукати за контрольованим частковим збігом.
Перший request до suites повертає `400`, бо повторно використана mutable `RequestSpecification` зберегла form parameters від login request. RestAssured накопичує налаштування у стані specification, тому вона не повинна мутуватися і перевикористовуватися між різними requests. Виправлення — повертати нову specification із factory method для кожного request. Після цього уточнюється endpoint path: запит має містити API prefix, project id і suites resource. Потім `GET` повертає список suites з їхніми id, type і title.
Selenide дозволяє перейти у фрейм за індексом, `name`/`id` або знайденим web element. У показаному DOM на сторінці є кілька `iframe`, а потрібний не має зручного `id`, тому індекс відкидається як найкрихкіший варіант. Фрейм знаходиться локатором і передається до `switchTo().frame(...)`. Після перемикання всі наступні команди спрямовуються в HTML-документ фрейму. Кнопки Update і Cancel знаходяться вже на зовнішній сторінці, тому перед кліком викликається повернення до `defaultContent()`. Цей перехід оформлюється всередині методів Page Object, щоб тест не керував технічним контекстом напряму.
Перед автоматизацією сценарій треба пройти вручну з відкритими DevTools. HTML — це мова розмітки, де документ складається з елементів, тегів, атрибутів і їхніх значень. Для пошуку елементів використовуються `id`, `name`, стабільні `data-*` атрибути, CSS або XPath. У відео перевага надається компактним CSS-селекторам; XPath залишається для випадків, де CSS не виражає потрібний зв’язок.
Chrome DevTools дозволяє подивитися accessibility tree й accessible name, навіть якщо значення неочевидне з HTML. Текстові locators зручні, доки labels, placeholders і переклади стабільні. Для багатомовного продукту або content, який окремо змінює контент-команда, стабільний `data-testid` часто кращий. Атрибути можуть рендеритися по-різному залежно від frontend framework, а generated classes та IDs змінюватися між builds, тому вибір залежить від реального контракту команди.
Елемент за class шукається через `.class-name` або attribute selector на кшталт `[class*='class-name']`. Два classes одного елемента записуються без пробілу: `.first.second`. Tag та `id` або attribute також можна комбінувати, наприклад `turbo-frame#global_search_results`. Якщо attribute value містить пробіл або спеціальні символи, його треба брати в лапки. У Java-рядку single quotes всередині CSS зменшують кількість escaping.
Генерацію важливих test data краще явно виконувати на початку тесту й передавати результат у helper, а не непомітно ховати всередині `registerUser()` чи `createCompany()`. Так сценарій показує свої preconditions, а той самий expected object доступний для подальших assertions. Business step може повернути оновлену модель, якщо система присвоїла ID, status або інші server-generated поля.