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

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

Нюанс · 3:00

__init__ — initializer, не етап створення instance

У повсякденній мові __init__ часто називають constructor, але Python data model розділяє __new__, який створює instance, і __init__, який налаштовує вже створений instance.

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

Що змінилося після запису · 8:16

__init__.py не є абсолютною вимогою

У відео __init__.py пояснено як ознаку Python package і місце для публічних imports.

Для regular package це коректна практична модель, але Python 3.3+ підтримує implicit namespace packages, де namespace directory навмисно не містить __init__.py.

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

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

Instance state через self та __init__

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

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

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

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

`__init__.py` не є умовою pytest discovery

Pytest знаходить test modules і functions за naming conventions навіть без Python package. __init__.py впливає на import semantics і module names, але не є обов’язковим для базового discovery.

2. Перший автотест на Python з Playwright →

Термін · 8:16

namespace package

Package, який може бути розподілений між кількома distributions. Native namespace packages доступні з Python 3.3 і не мають __init__.py у namespace directory.

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

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

`__init__` задає обов’язковий стан об’єкта

Через `__init__` клас отримує залежності й початковий стан, без яких його методи не мають сенсу. Наприклад, компонент приймає кореневий locator, а Page Object — Playwright `page`; наступні методи перевикористовують ці значення через `self`. У повсякденній мові `__init__` часто називають constructor. Технічно екземпляр створює `__new__`, а `__init__` ініціалізує вже створений об’єкт. Для звичайного Page Object достатньо реалізувати саме `__init__`.

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

Python мануфактура · Сесії: AMA та PMP · 8:16–11:51

Для чого потрібен `__init__.py`

Наявність `__init__.py` робить директорію звичайним Python package і може визначати його зручний публічний API через imports або `__all__`. Це допомагає IDE, імпортам і читачеві зрозуміти межу модуля. Сучасний Python також підтримує namespace packages без `__init__.py`, тому файл не є абсолютною вимогою для кожної імпортованої директорії. У навчальному проєкті явний package зазвичай простіший і передбачуваніший.

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

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

Структура `src` і Python package

Для експериментів створюється `src` і окремий Python package. У класичному package файл `__init__.py` явно позначає директорію як пакет для інструментів і імпортів. Сучасний Python також підтримує namespace packages без `__init__.py`, але явний пакет часто передбачуваніший для навчального проєкту. Експерименти з типами відокремлюються від тестів: короткий файл можна запускати напряму, щоб перевірити перетворення або метод перед вбудовуванням у сценарій.

4. Типізація даних (str, int, float, bool) →

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:18–7:54

Структура тестів і правила іменування

Тести зручно тримати в окремому Python package, а не у випадковій директорії. Package містить `__init__.py`, що явно позначає Python-структуру. Для автоматичного виявлення pytest файл і тестова функція мають відповідати домовленостям іменування, наприклад: ```python def test_open_home_page(): ... ``` Назви Python-файлів, функцій і змінних записуються у `snake_case`. Підкреслення PyCharm та індикатор проблем у правому верхньому куті не варто ігнорувати: вони часто показують синтаксичну або типізаційну помилку ще до запуску.

2. Перший автотест на Python з Playwright →

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

Масове додавання decorators і перевірка diff

Для наявного набору Page Objects decorators додаються через project-wide search/replace. Демонстрація показує ризик такого скорочення: regex зачіпає `__init__`, properties та неправильні відступи, після чого зміни доводиться вручну чистити й додавати imports. Після механічної зміни запускаються format check і Ruff. Це обов’язкова межа безпеки для bulk edit: результат пошуку не вважається правильним, доки diff не переглянуто, код не форматується й статичні checks не проходять.

4. Allure репорт, основи та інтеграція в CI →

Python мануфактура · Програма курсу · 21:24–27:20

File template для Page Object

Page Object і Page Component мають повторювану основу: імпорти Playwright, клас, `__init__`, збереження `page`, базову перевірку завантаження та часто `return self`. Замість копіювання цієї «шапки» створено власний шаблон у `Settings → Editor → File and Code Templates`. У file template змінна `${NAME}` підставляє назву, яку вводять під час створення файлу. Після збереження в меню `New` з’являється окремий тип `Page Object`; вибір цього пункту створює клас з підготовленими імпортами й методами. Під час live coding шаблон кілька разів виправляється: додаються пропущені `self`, закривається дужка, коригуються відступи. Це нормальний цикл налаштування: створити пробний файл, дочекатися синтаксичних та інспекційних підказок IDE, виправити шаблон і повторити генерацію. Перевіряти потрібно саме згенерований файл, а не лише текст у вікні налаштувань. Оскільки поточні Page Object і Page Component мають однакову основу, одного file template достатньо. Окремі шаблони варто додавати лише тоді, коли їхня структура реально розійдеться.

Майструємо IDE під себе →
Запитати в чаті про «init» →