Python мануфактураJavaDesign Patterns для автоматизаторів

Терміни, нюанси та джерела

Приклад коду · 27:20

Role locator і видимість діалогу

Мінімальний приклад Codex на основі актуального Playwright contract: інтерактивна кнопка знаходиться за role та accessible name, а неінтерактивний текст перевіряється через get_by_text().

Після кліку на Create suite текст Select suite for test стає видимим.

Майструємо IDE під себе →

Практика · 2:00

Спроєктувати runner для одного UI-suite

Намалювати маршрут від runner до application і залежностей.
Зафіксувати потрібні credentials та мінімальні network rules.
Запустити suite з обраною concurrency й записати peak CPU/RAM.
Обґрунтувати hosted або self-hosted варіант фактичними даними.
Короткий capacity та access worksheet без універсальних припущень про RAM або вартість.

Інфраструктура автотестів та її нюанси →

Що змінилося після запису · 4:00

pytest.toml з'явився у pytest 9.0

Урок конфігурує suite через pytest.ini.

Поточна документація pytest також підтримує pytest.toml, доданий у pytest 9.0. pytest.ini залишається підтримуваним і має вищий пріоритет за legacy alternatives.

pytest 9.0

1. Налаштування Playwright та Pytest, простий репортінг →

Практика · 6:00

Вибір automation stack від support matrix

Візьміть реальну browser analytics або письмову support policy продукту.
Позначте scenarios, які достатньо виконувати в Chromium/Firefox/WebKit.
Окремо позначте browser/vendor requirements, що потребують Selenium/Grid або cloud provider.
Запишіть очікувану topology, latency risks і мінімальний cross-browser suite.
Є коротке рішення Playwright-only або Playwright+Selenium, пов'язане з виміряною browser matrix, а не з популярністю інструмента.

3. Selenium vs Playwright - яка різниця →

Практика · 17:00

Замкнути API-ланцюжок

Створити suite у target project через SuiteController.
Отримати створену сутність через API і провалідувати response Pydantic-моделлю.
Повторити цей flow для test case через TestController.
Два API-тести проходять без UI-кроків і виявляють schema mismatch.

2. API автоматизація одразу правильно, MVC, pydantic →

Python мануфактура · Сесії: AMA та PMP · 10:02–12:20

Приклад таблиці: 96 хвилин проти 120 секунд

У прикладі suite для account management містить 12 тестів. Один ручний кейс у середньому займає 8 хвилин, отже повний ручний прогін — 96 хвилин. Автотест виконує кожен кейс приблизно за 10 секунд, а весь suite — за 120 секунд. Таблиця має зберігати щонайменше: - назву test suite або user journey; - кількість автоматизованих кейсів; - середній час ручного кейсу та всього suite; - середній час автоматизованого кейсу та всього suite; - кількість запусків за обраний період; - розраховану дельту часу. Кейси потрібно явно переводити з manual backlog до automation coverage. Інакше легко одночасно рахувати той самий обсяг як ручну та автоматизовану роботу.

Як упровадити автоматизацію мануальному QA та довести її ефективність →

Python мануфактура · Програма курсу · 37:50–50:20

Параметризація модалок і перевірка результату

Модалки для Test і Suite мають схожий заголовок та форму. Спільний helper параметризується `artifact_type`, але лише там, де це справді одна поведінка; різні postconditions залишаються окремими й читабельними. Після Save suite перевіряється за її назвою у списку. Демонстрація кілька разів падає через переплутані helpers і case-sensitive текст `Suite`, що показує цінність короткого red/green циклу для кожного locator.

3. API preconditions →

Python мануфактура · Програма курсу · 17:00–20:25

Створення suite і реальний request contract

`SuiteController.create()` приймає `project_id`, `title` і `description`, формує payload та викликає `post` базового controller. Потрібні поля звіряються не лише з документацією, а й з request у browser DevTools. У демо офіційна схема містить сумнівну вимогу до `suite_id` до створення suite, тож real request і response виступають важливою перевіркою контракту. Відповідь Testomat.io загортає основну сутність у поле `data`. Після `response.json()` тест бере `response_data["data"]` і валідує саме цю вкладену структуру.

2. API автоматизація одразу правильно, MVC, pydantic →

Python мануфактура · Програма курсу · 29:25–37:50

Стабільний `is_loaded` і створення test suite

Перевірка «порожній проєкт» не підходить для довільного existing project. Новий `is_loaded` спирається на стабільний sidebar/navigation, який існує і для порожнього, і для заповненого проєкту. Далі тест відкриває dropdown створення артефактів і додає suite. Пошук locator уточнюється через видимий текст та структуру модалки, а не через крихкі CSS-класи іконки.

3. API preconditions →

Python мануфактура · Програма курсу · 14:00–21:00

Local і remote execution

Локально Selenium client, driver і browser часто знаходяться на одній машині, тому додаткові HTTP round trips майже непомітні. У remote topology команди можуть пройти від CI runner до Selenium Server/Grid, далі до remote node або cloud browser і назад. Polling explicit waits множить network latency на кількість перевірок. Географія також впливає на system behavior: CI runner, browser node і application backend у різних регіонах дають інший latency profile, ніж локальна машина. Тому green local run не доводить, що timeout достатній для Grid/BrowserStack. Remote suite треба перевірити до merge, а browser nodes за можливості розміщувати ближче до application environment. У Playwright очікування й action orchestration потребують менше client-side polling round trips, тому modern UI suite зазвичай працює швидше й стабільніше. Але запити самої сторінки до backend однаково залежать від мережі: Playwright не прибирає latency тестованої системи.

3. Selenium vs Playwright - яка різниця →

Python мануфактура · Програма курсу · 21:30–28:00

Діагностика падінь CI

Після зеленого linter smoke tests падають. Рекомендований порядок діагностики: відтворити точну pipeline-команду локально, звузити запуск до suite, а потім до одного тесту. Якщо тест проходить окремо, але падає у suite, треба шукати shared state, порядок виконання, fixture scope або неповне очищення browser context. Локальний і CI runner також відрізняються потужністю, швидкістю, браузерним режимом і доступами. Тому timeout або race condition може проявлятися лише на одній машині. Logs і artifact trace важливіші за припущення про причину.

2. Практика та написання пайплану CI/CD →

Python мануфактура · Сесії: AMA та PMP · 23:40–25:04

Стабільність і traces важливіші за красивий репорт

Allure залишається потужним звичним рішенням; Monocart згадується як конкурент. Але складний репортинг не є першою потребою невеликого стабільного suite. Тест насамперед має бути зрозумілим розробнику й давати швидкий діагностичний сигнал. Якщо падіння стабільне та відтворюване, Playwright trace часто містить достатньо даних без додаткової системи звітів. Traces можна автоматично зберігати лише для невдалих запусків. Розвинена агрегація стає виправданою при великій кількості тестів, кількох паралельних запусках або потребі бачити історичні тенденції. Якщо ж у suite тисячі UI-тестів, це окремий сигнал перевірити архітектуру покриття, а не лише покращувати звіт.

Як працює проєктний білдер, ізоляція залежностей і впровадження нових інструментів →

Python мануфактура · Програма курсу · 26:00–34:00

Ієрархія Playwright і запуск test suites

У спрощеній моделі Playwright спочатку запускає browser process, потім створює ізольований `BrowserContext`, а в ньому — одну або кілька `Page`. Launch options стосуються процесу браузера, context options — сесії користувача, cookies, permissions та емуляції, а `Page` представляє вкладку й виконує дії зі сторінкою. Через `channel="chrome"` можна запустити встановлений branded Chrome замість bundled Chromium. Це потрібно, коли поведінка залежить від повного браузера або медіакодеків; для більшості перевірок швидшого bundled Chromium достатньо. Маркери дають змогу виконувати `smoke` і `regression` окремо. Практичний CI flow: спочатку короткий smoke suite перевіряє, що середовище придатне до тестування, і лише після нього запускається довша regression suite.

1. Налаштування Playwright та Pytest, простий репортінг →

Python мануфактура · Програма курсу · 47:55–54:13

Дані Faker, запуск і перевірка сценарію

Для унікальної назви використовується Faker. Вираз із назвою компанії перетворюється на змінну через створений postfix template, змінна перейменовується на змістовну `target_suite_name` і передається в метод створення. Непотрібні вбудовані postfix templates можна вимикати, щоб список підказок не заважав. Водночас експеримент із власним `.var` показує межу автоматизації: якщо шаблон не залишає курсор у корисному місці, його треба виправити, а не пристосовувати робочий процес до невдалого шаблону. Сценарій запускається й проходить послідовно: авторизація, створення проєкту, закриття README, відкриття діалогу створення тесту. У режимі паузи перевіряється DOM і вибирається текст `Select suite for test`; для нього додається шаблон `get_by_text(...)`, після чого `expect(...).to_be_visible()` підтверджує появу модального вікна. Якщо попередній debug-процес ще приєднаний, повторний запуск може чекати на його завершення. Після коректного продовження або зупинки процесу тест проходить. Наприкінці тест перейменовується відповідно до перевірюваної поведінки, а не до проміжних технічних кроків.

Майструємо IDE під себе →

Python мануфактура · Сесії: AMA та PMP · 2:08–5:08

Починати з найдовшого критичного user journey

Першим кандидатом є довгий наскрізний P0-сценарій: checkout, реєстрація, основний бізнес-флоу тощо. Він швидко проходить через найбільшу кількість сторінок, API та станів, тож одночасно знайомить автора тестів із широкою частиною продукту. Автотест можна уявити як шлях у графі: кроки — це вузли, а різні переходи утворюють гілки. Після покриття найдовшого маршруту коротші сценарії часто повторно використовують уже реалізовані вузли. Це робить наступні тести дешевшими. Для кожного test suite варто зафіксувати кількість кейсів, середній ручний час і час автоматизованого прогону. Наприклад, якщо checkout вручну займає 20 хвилин, а автоматично — 30 секунд, дельта кожного запуску є наочною цінністю.

Як упровадити автоматизацію мануальному QA та довести її ефективність →
Запитати в чаті про «suite» →