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

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

Приклад коду · 3:00

Instance state через self та __init__

page є instance attribute: кожен PageObject отримує власний стан через __init__, а method читає його через self.

Команда друкує Page: checkout і assertion проходить.

__init__, self, page та принципи ООП →

Термін · 0:00

self

Загальноприйнята назва першого параметра instance method. Python передає bound instance неявно під час виклику obj.method(), але ім’я self саме по собі не є keyword.

__init__, self, page та принципи ООП →

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

Відокремити local state від instance state

Створи два PageObject instances із різними page values і доведи assertions, що зміна local variable не змінює self.page іншого instance.
Обидва instances мають незалежні page attributes.
У method немає global state.
Автор може пояснити, чому obj.method() передає obj як перший argument.

__init__, self, page та принципи ООП →

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

Простежити одну Playwright action

Відкрийте implementation Locator.click() у встановленій версії Playwright.
Знайдіть frame/channel method, command name та передані options.
Запишіть, які перевірки виконує client, а які делегуються browser-side layer.
Короткий call path із назвами classes/methods і посиланням на встановлену версію package.

Як Playwright взаємодіє з браузером через протокол →

Python мануфактура · Програма курсу · 13:05–18:14

Змінні, intention actions і Extract Method

Окремий postfix template експериментально перетворює вираз на присвоєння змінній. Він корисний лише тоді, коли справді економить дії; якщо шаблон незручно визначає позицію курсора або працює не для всіх виразів, його краще спростити чи не використовувати. `⌥Enter` відкриває intention actions для поточного контексту. У меню можна рухатися клавішами й вибирати, наприклад, перейменування елемента. Перейменування через IDE змінює всі пов’язані входження, тому безпечніше за ручний пошук і заміну. `Refactor → Extract Method` (`⌘⌥M` у показаному keymap) переносить виділений фрагмент у новий метод. PyCharm визначає потрібні аргументи й можливі значення, що повертаються. У прикладі перевірки кнопки винесено в `check_manage_button`, після чого до викликів усередині методу додано `self`. Це спосіб прибрати дублювання на рівні поведінки, не переписуючи код вручну. Практичне зауваження з демонстрації: `to_have_text()` не варто вважати повною заміною перевірки видимості. Якщо видимість є окремою вимогою сценарію, її треба перевіряти явно.

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

Python мануфактура · Сесії: AMA та PMP · 0:00–3:00

`self` і область видимості

`self` — явний параметр instance method, через який код звертається до конкретного екземпляра класу. `self.card` означає атрибут цього екземпляра, тоді як локальна змінна `card` живе лише у своїй функції або блоці видимості. Однакові назви технічно можливі, але збільшують когнітивне навантаження. Префікс `self.` одночасно потрібен Python для правильного доступу до instance attribute і показує читачеві, де зберігається стан.

__init__, self, page та принципи ООП →

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

`class`, `__init__`, `self` і methods

Class name зазвичай є іменником в однині та пишеться з великої літери. `__init__` приймає початковий state, а `self.email` і `self.role` належать конкретному object instance. Method `is_admin()` розміщує перевірку ролі біля даних і не змушує кожен test повторювати `user.role == "admin"`.

10 ооп →

Python мануфактура · Програма курсу · 4:31–5:32

Поліморфізм без зайвої складності

Поліморфізм дозволяє однаковому interface мати різну реалізацію, зокрема через method override. Але одна назва для суттєво різних дій може приховувати code smell. У Python default/keyword arguments часто вирішують просту варіативність без overload hierarchy.

10 ооп →

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

`BaseController`, headers, errors і logging

`BaseController` приймає base URL і JWT, формує спільні headers `Authorization` і `Content-Type: application/json`, виконує HTTP-запит і піднімає exception для неуспішного статусу. Методи `get`, `post` і `put` повторно використовують цю поведінку; `post` і `put` додатково приймають request body. Запити варто логувати, щоб під час падіння було видно method, endpoint і контекст виклику. Для `requests` таке logging додають явно; `HTTPX` має власний logging namespace, тому конкретна реалізація залежить від обраного client.

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

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

DRY: допоміжні функції без прихованих даних

Коли логін повторився у двох тестах, його винесено у `login_user(page, email, password)`. Дані не хардкодяться всередині helper-функції: тест передає `Page`, email і пароль явно. Type hints допомагають IDE підказувати доступні операції та помічати неправильні аргументи ще до запуску. Так само через Extract Method створюється `open_home_page(page)`. Допоміжні функції розміщуються нижче тестів, щоб під час code review спочатку читалися сценарії, а вже потім технічні деталі.

1. Рефакторинг та оптимізація, KISS, DRY, DAMP, YAGNI →

Python мануфактура · Програма курсу · 37:00–40:18

Виклик методів і підсумок області видимості

Один метод класу може викликати інший через `self.get_name()` і використати повернене значення. Після створення екземпляра з обов’язковим аргументом викликається публічний метод, а внутрішні деталі залишаються в класі. Підсумкова модель: локальні змінні живуть у функції; атрибути екземпляра доступні методам через `self`; модульні значення доступні коду після їх оголошення. Подальша практика — брати конкретну задачу автоматизації, експериментувати з одним типом у короткому файлі, а потім переносити перевірений вираз у тест.

4. Типізація даних (str, int, float, bool) →
Запитати в чаті про «method» →