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

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

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

Плагін уже має `retain-on-failure`

Через custom fixture architecture у відео вручну інтегровано tracing і pytest hook.

Поточний pytest-playwright plugin підтримує --tracing retain-on-failure. Якщо тест використовує стандартні plugin fixtures, спершу варто перевірити цю option; custom hook потрібен, коли lifecycle контролюється власними fixtures.

4. Повертаємо traces, pytest hooks, рефакторинг дублювань у fixtures →

Що змінилося після запису · 5:30

Playwright setup залежить від версії

У відео рекомендовано API preconditions, reused authenticated state та незалежні test data.

Поточна документація Playwright рекомендує не комітити auth state і використовувати окремий account на parallel worker, якщо tests змінюють shared server-side state. Конкретні fixtures, directories та worker APIs слід звіряти з версією Playwright у проєкті.

Практика курсу на YOY, домашні завдання та формат ПМП →

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

Від plugin fixtures до власного життєвого циклу

Стандартні pytest-playwright fixtures добре ізолюють тести: нові context/page створюються автоматично, а cleanup виконує plugin. Для великої таблиці негативних логінів це створює помітні накладні витрати, тому у відео будується власний lifecycle: один Playwright/browser instance на ширший scope і спеціальні fixtures для clean app, logged-in app та shared page. Ключова ієрархія залежностей: Playwright instance запускає browser; browser створює context; context створює page. Scope залежної fixture не може бути ширшим за ресурс, від якого вона залежить. `yield` повинен закрити рівно ті ресурси, які fixture створила. Це optimization з ціною: повторне використання page/context послаблює ізоляцію. Починати безпечніше зі стандартних function-scoped fixtures, а reuse додавати лише після виміряного bottleneck і разом із перевіреним cleanup.

2. Pytest fixtures, playwright fixture, прараметризація тестів →

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

Fixtures для авторизації і controllers

`pytest` fixtures виконують login, отримують JWT і передають його до `ProjectController` чи `SuiteController`. Якщо token вже збережено у scope fixture, нова авторизація не потрібна. Для створення suite спершу потрібен target project. Його можна підготувати окремою fixture або отримати в самому тесті через `ProjectController.get_all()`. Вибір залежить від того, чи це спільний precondition, чи важливий крок конкретного сценарію.

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

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

Діагностика конфлікту fixture lifecycle

Після рефакторингу suite падає через змішування plugin-managed fixtures та вручну створеного sync Playwright instance. Додатково частина launch/context options дублюється в dictionary і кількох fixtures, що робить конфігурацію непослідовною. Рішення у відео — перейти на один спосіб володіння lifecycle: custom fixtures запускають Playwright і browser, а конфігурація збирається в одному місці. Частину pytest-playwright параметрів прибирають, бо custom launcher їх уже не читає. Загальний висновок: не можна одночасно очікувати, що plugin і власний код керуватимуть тим самим browser lifecycle.

2. Pytest fixtures, playwright fixture, прараметризація тестів →

Python мануфактура · Програма курсу · 0:00–5:45

Чому вбудованої pytest-playwright fixture недостатньо

Проєкт сам контролює `storage_state`, авторизовані та Free contexts, відкриття й закриття page. Через це готові fixtures плагіна не покривають потрібний lifecycle, а tracing доводиться інтегрувати у власний шар. Перед tracing виправляється побічна проблема: Free test відкривав два browser instances, бо вимагав fixture, результат якої не використовував. Видалення зайвої залежності прибирає другий запуск браузера.

4. Повертаємо traces, pytest hooks, рефакторинг дублювань у fixtures →

Python мануфактура · Програма курсу · 5:35–9:40

Розділення `conftest.py` через pytest plugins

Один `conftest.py` накопичив конфігурацію, запуск браузера, створення сторінки й app-specific fixtures. Код розділяється на модулі `config`, `playwright` та `app`, а кореневий `conftest.py` лише підключає їх через `pytest_plugins`. Технічний шар створює браузер і context; app-шар виконує login, перевіряє, що цільова сторінка завантажена, і зберігає state. Такий поділ залишає місце для Firefox або інших browser options без змішування з бізнесовими переходами.

2. Storage state, cookie manipulation, дебаг зникаючих елементів →

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

Мовні реалізації, runner і bindings

Playwright має APIs для TypeScript/JavaScript, Python, Java і .NET. Найповніша інтеграція навколо власного runner, fixtures і reporting доступна у Playwright Test для TypeScript/JavaScript; у Python за orchestration зазвичай відповідає pytest та його plugins. Selenium також має офіційні language bindings, які перетворюють API-виклики на WebDriver commands. Окремі команди підтримують Selenium project і browser vendors, тому version compatibility та відмінності bindings залишаються частиною експлуатації. Обидва інструменти — великі multi-language ecosystems. Вибір мови впливає не лише на синтаксис, а й на доступність runner integrations, fixtures, reporters, tracing і швидкість появи нових можливостей.

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

Python мануфактура · Програма курсу · 24:45–31:05

Перші падіння і діагностика fixtures

Згенерована `models.py` містить багато загальних класів на кшталт `Attributes1`, `Attributes2`, тому його краще використовувати як reference і поступово називати моделі за їхньою предметною роллю. Під час демо тест падає через неправильні imports і видалену fixture. Для circular import корисно читати останній змістовний фрейм traceback: там зазвичай вказано реальний модуль і напрям залежності. Якщо `pytest` не знаходить fixture, він друкує перелік усіх доступних fixtures, що допомагає помітити назву або проблему з discovery.

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

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

Перевикористання fixtures в інших тестах

Після прискорення login cases нові fixtures пробують застосувати до решти suite. Для сценаріїв, яким уже потрібен авторизований користувач, planned fixture має один раз виконати login і віддати готову page. Для негативного login test, навпаки, потрібна неавторизована shared page. Автоматичний рефакторинг змінює більше тестів, ніж очікувалося, і частково плутає їх передумови. Це демонструє практичне правило: fixture називається за гарантованим станом (`anonymous_page`, `authenticated_page`), а migration робиться по одному behavior з повторним запуском, а не одним глобальним LLM-edit.

2. Pytest fixtures, playwright fixture, прараметризація тестів →

Python мануфактура · Програма курсу · 56:00–58:38

Commit і підсумок практики

Перед комітом переглядаються видалені plugin parameters, custom fixtures, requirements і параметризовані cases. У підсумку кожна ітерація має читабельний ID, test data винесені з тіла сценарію, а browser reuse виконується через явний fixture graph. Практика після уроку — додати власні cases до таблиці, дати їм змістовні IDs, намалювати залежності fixtures і перевірити setup/teardown кожного scope. Окрема перевірка має довести, що попередня ітерація не залишає авторизацію або client-side state наступній.

2. Pytest fixtures, playwright fixture, прараметризація тестів →

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

Fixture scopes і задача параметризації

Pytest fixture може мати scope `session`, `package`, `module`, `class` або `function`. Чим ширший scope, тим рідше створюється ресурс: session fixture — один раз на весь test run, function fixture — окремо для кожного тесту. Код до `yield` виконує setup, а після `yield` — teardown відповідного scope. Ціль уроку — перетворити один негативний login test на параметризований. Тіло сценарію залишається одним, а різні пари email/password та читабельні case IDs передаються як дані.

2. Pytest fixtures, playwright fixture, прараметризація тестів →
Запитати в чаті про «fixtures» →