2. Погружаемся в инструментарий и библиотеки - qa-guru/knowledge-base GitHub Wiki

Основные команды Git

Git

Git — это распределенная система управления версиями, предназначенная для отслеживания изменений в коде и обеспечения удобной командной работы.

Базовая настройка пользователя (Один раз на машине)

Команда Описание
git config --global user.name "Ваше Имя" Указать имя (попадёт в метаданные коммитов)
git config --global user.email "[email protected]" Указать e-mail

Старт проекта / Подключение к существующему

Команда Описание
git init Инициализация нового репозитория в текущей папке (начинает отслеживание файлов Git'ом)
git clone <URL> Клонирование существующего удалённого репозитория (создать локальную копию проекта)

Состояние и различия

Команда Описание
git status Что изменено/новое/в индексе; первая команда при сомнениях
git diff Показать изменения в рабочих файлах (до индекса)
git diff --staged Показать то, что подготовлено к коммиту (в индексе)

Индексирование и коммиты

Команда Описание
`git add <file dir
git commit -m "feat: краткое описание" Записать снимок состояния из индекса
git commit --amend -m "Новый текст коммита" Переименовать последний коммит

История и просмотр

Команда Описание
git log Полная история коммитов
git log --oneline --graph --decorate --all Компактная история с ветками/тегами
`git show <hash HEAD>`

Ветки и переключение

Команда Описание
git branch Список локальных веток
git branch -a Список локальных и удаленных веток
git checkout my-branch Переход на существующую ветку
git checkout -b new-branch Создание ветки и переход на нее (устаревший синтаксис)
git switch main Переключиться на существующую ветку (новый синтаксис)

Слияние и Ребейз (Объединение истории)

Команда Описание
git merge feature/x Слить изменения в текущую ветку, сохранив ветвление истории (merge-коммит)
git rebase main Перенести коммиты одной ветки поверх другой ветки или коммита (линеаризация истории)

Дополнительно: Сравнение Merge vs Rebase — https://www.atlassian.com/ru/git/tutorials/merging-vs-rebasing

Работа с удалённым репозиторием

Команда Описание
git remote add origin <URL> Привязать локальный репозиторий к удалённому
git fetch Забрать новые коммиты/ветки без слияния (pull = fetch + merge)
git pull origin main Получить все коммиты из ветки удаленного репозитория и слить их с текущей локальной веткой
git push Отправка текущей ветки на удаленный репозиторий
git push -u origin main Впервые отправить ветку и запомнить апстрим (установить связь)

Временное сохранение (Stash)

Команда Описание
git stash Сохранить и убрать незакоммиченные правки
git stash apply Применить сохраненные правки обратно
git diff > changes.patch Сохранить изменения Git в файл (патч)
git apply changes.patch Применить сохраненные правки обратно из патча

Отмена изменений

Команда Описание
git revert <hash> Откат одного коммита безопасно (создается новый коммит, отменяющий изменения)
git reset --hard <hash> Полностью откатить и индекс, и файлы к <hash> (сбросить абсолютно все изменения)

Маленькая шпаргалка для рабочего процесса

1. Создать фичу и отправить на сервер

git checkout -b feature/login                 # Создание новой ветки
git add . && git commit -m "feat: login page" # Зафиксировать изменения
git push -u origin feature/login              # Отправить и создать удалённую ветку

2. Подтянуть изменения из main и обновить свою ветку (Merge-вариант) Этот процесс позволяет вам получить последние изменения из главной ветки (main) и интегрировать их в вашу рабочую ветку (feature/login), используя слияние (merge).

git checkout main            # 1. Переключиться на главную ветку
git fetch && git pull        # 2. Получить все удаленные ветки и обновить локальную main
git checkout feature/login   # 3. Вернуться на свою ветку
git merge main               # 4. Слить изменения из main в текущую ветку

.gitignore

  • Исключаем: сборочные директории (build/, dist/), кеши (pip-cache/, pycache/), логи, артефакты инструментов (.tox, coverage), секреты и конфиги.
  • Конфиги IDE (например, .idea/ / .pycharm/) хранить в Git обычно не нужно.

Дополнительно: Генератор gitignore — https://www.toptal.com/developers/gitignore

Правила именования веток (Branches) и коммитов (Commits)

Наименование коммитов по соглашению Conventional Commits помогает автоматизировать задачи (например, генерацию лога изменений) и делает историю проекта чистой и понятной. 1. Тип (<type>)

Тип Назначение
feat Новая фича для пользователя (Minor Release).
fix Исправление бага (Patch Release).
docs Изменения в документации (README, JSDoc).
style Форматирование, пропущенные точки с запятой и т.п. (без изменения логики).
refactor Изменение кода, которое не исправляет баг и не добавляет фичу.
test Добавление или исправление тестов.
chore Рутинные задачи, обновление зависимостей (без изменения логики продукта).
perf Изменения, улучшающие производительность.
ci Изменения в файлах и скриптах CI/CD (GitLab, GitHub Actions, Jenkins).
build Изменения, касающиеся сборки или внешних зависимостей (npm, gulp, webpack).

2. Примеры хороших коммитов

Пример Тип Описание
# fix: handle null in auth middleware fix Исправление бага (PATCH): предотвращаем падения/500 при null; повышает стабильность.
# test: add e2e test for checkout flow test Тесты: рост покрытия и защита от регрессий; поведение продукта не меняется.
# ci: add GitLab job with strategy: depend ci CI-конфигурация: джоба ждёт downstream и наследует статус; повышает надёжность пайплайна.
# TASK-1234: add e2e test for checkout flow Задача Добавление коммита по определенной задаче (если используется префикс из трекера).

❌ Плохо vs ✅ Хорошо

Чистый заголовок коммита должен быть кратким, на английском языке (в повелительном наклонении) и ясным.

Не ясно (Плохо) Ясно (Хорошо)
# update stuff # fix(payments): correct rounding for FX rates
# fixes bugs # feat(ui): add dark mode toggle
# final commit # chore: update dependencies to latest version

Правила именования веток (Branches)

Ветки должны отражать их назначение и включать тип и/или номер задачи из вашего трекера.

Формат Пример Назначение
<type>/<description> feat/user-profile-page Для новой функциональности.
<type>/<ticket-id> fix/AUTH-404 Для исправления конкретного бага.
<type>/<description>-<ticket-id> refactor/api-response-TASK-1234 Для более сложных веток.
<ticket-id> TASK-1234 Для более простых проектов.
Рекомендуемые типы для веток: feat, fix, refactor, docs, chore, release, test .

Как создать репозиторий на GitHub

Для создания репозитория на GitHub у вас уже должен быть создан профиль на платформе. Пройти процесс регистрации можно на официальном сайте GitHub.

После этого необходимо перейти на свою страницу GitHub и переключиться на вкладку «Repositories».

После нажать на зеленую кнопку «New».

В открывшемся меню необходимо указать имя репозитория, описание (по желанию), выбрать настройки приватности (публичный или закрытый репозиторий) и добавить вспомогательные файлы (README-файл, gitignore и лицензию).

После того как поля страницы будут заполнены, необходимо нажать на зеленую кнопку «Create repository». Новый репозиторий будет создан.

Как клонировать репозиторий с помощью PyCharm

После создания нового пустого репозитория пользователя обычно встречает страница самого репозитория с кратким руководство по работе с ним. В этот момент репозиторий хранится удаленно на серверах GitHub и доступ к нему может получить его владелец и круг его доверенных лиц.

Репозиторий можно клонировать на локальную машину и работать с его содержимым на своем компьютере. Актуальные изменения можно синхронизировать с удаленным репозиторием и всеми его участниками.

Для клонирования репозитория с помощью PyCharm для начала необходимо скопировать ссылку на репозиторий, которую можно получить на начальной странице репозитория.

Далее переходим в PyCharm, переключаемся на вкладку «VCS» и выбираем пункт «Get from Version Control».

Вставляем ссылку в поле URL и нажимаем кнопку «Clone».

Как сделать коммит

После того как мы внесли изменения в проект, их необходимо зафиксировать в нашем репозитории. Для этого на боковой панели слева есть вкладка «Commit». Переходим в нее, выбираем файлы для коммита и указываем осмысленное сообщение к коммиту, такое, чтобы новый человек в проекте мог понять суть и необходимость совершенного коммита.

Как сделать пуш

Коммит и все изменения должны оказаться на удаленном репозитории. Для этого необходимо перейти во вкладку «Git» и выбрать пункт «Push».

Файл README.md

README (от англ. "Read Me" — "Прочти меня") — это текстовый файл, который является первым контактом пользователя или другого разработчика с вашим проектом. Это самый важный файл, который обычно находится в корневой директории любого репозитория (например, на GitHub).

Основное назначение README

  • Лицо проекта: Это "витрина" или "лицо" вашего проекта. Он должен сразу объяснить, что это за проект и зачем он нужен.
  • Быстрый старт: Предоставляет критически важные сведения, чтобы кто-то мог быстро понять, как установить, запустить и использовать код.
  • Документация: Служит краткой, но структурированной документацией по основным аспектам проекта.

Структура README

  1. Название и краткое описание: Заголовок и 1-2 предложения о сути проекта.
  2. Установка (Installation): Пошаговая инструкция, как установить все необходимые зависимости.
  3. Использование (Usage) / Быстрый старт: Примеры кода или команды для запуска проекта.
  4. Функциональность (Features): Что умеет делать проект.
  5. Технологический стек: Какие языки и фреймворки использованы.
  6. Участие (Contributing): Правила для тех, кто хочет внести свой вклад.
  7. Лицензия: Информация о лицензии, под которой распространяется код.

Формат

Чаще всего файл называется README.md, где .md означает, что он написан с использованием синтаксиса Markdown. Это позволяет красиво форматировать текст (заголовки, списки, кодовые блоки) для отображения на веб-платформах, таких как GitHub или GitLab.

Оформление README.md: https://gist.github.com/alinastorm/8a04cdbc36be9c051a66f90ae6d6df35

Виртуальные окружения и зависимости (Python)

Виртуальное окружение (Virtual Environment)

Виртуальное окружение — это локальная, изолированная "копия" интерпретатора Python и набора библиотек для конкретного проекта. Как работает: Инструмент (например, venv) создает каталог (например, .venv/ или env/) с копией интерпретатора и изменяет переменные окружения среды, чтобы все команды (pip, python) работали внутри этого изолированного каталога.

Установка и активация (venv)

Команда Описание
python3 -m venv .venv --upgrade-deps Создать новое окружение в папке .venv и обновить системные пакеты pip/setuptools.
source .venv/bin/activate Активировать виртуальное окружение (для Linux/macOS).
.\.venv\Scripts\activate Активировать виртуальное окружение (для Windows, PowerShell).
deactivate Деактивировать виртуальное окружение.
which python Посмотреть путь к активному интерпретатору (для проверки, что активна именно виртуальная среда).
rm -rf .venv Удалить (снести) виртуальное окружение.

Установка и активация через Pycharm

1. При создании нового проекта При инициализации нового проекта PyCharm автоматически предлагает настроить изолированное окружение.

  1. Запуск PyCharm и выбор "New Project" (Новый проект).
  2. В окне "New Project" найдите раздел "Python Interpreter" (Интерпретатор Python).
  3. Из выпадающего меню выберите тип:
    • "Virtualenv" (Виртуальное окружение).
    • Или "Poetry" / "Conda" (если вы используете эти менеджеры).
  4. Укажите расположение (Location): PyCharm по умолчанию предлагает создать папку окружения (.venv или env) внутри каталога проекта.
  5. Выберите базовый интерпретатор (Base interpreter): Укажите путь к системной установке Python (например, Python 3.11), который будет служить основой для нового окружения.
  6. Нажмите "Create" (Создать).

PyCharm автоматически создаст изолированное окружение и привяжет его к вашему проекту.

2. Для существующего проекта (Через настройки) Если вы клонировали проект без окружения, или вам нужно изменить/добавить интерпретатор:

  1. Откройте проект в PyCharm.
  2. Перейдите в Settings/Preferences (клавиши: Ctrl+Alt+S или ⌘,).
  3. В дереве слева выберите "Project: [Имя проекта]""Python Interpreter".
  4. Нажмите на значок ⚙️ (Шестеренка) справа от поля "Python Interpreter" и выберите "Add..." (Добавить...).
  5. В окне "Add Python Interpreter" выберите "Virtualenv Environment".
    • Выберите "New environment" (Новое окружение).
    • Укажите расположение и базовый интерпретатор.
  6. Нажмите "OK".

PyCharm создаст окружение и автоматически установит его как активный интерпретатор для текущего проекта. После создания виртуального окружения (.venv или env/) обязательно откройте новый терминал или перезапустите текущий. Это гарантирует, что переменные среды корректно подтянутся, и все последующие команды (python, pip) будут использовать правильный изолированный интерпретатор вашего проекта

Управление зависимостями (pip и requirements.txt)

Зависимости в Python можно задавать вручную, но в больших проектах с огромным количеством библиотек это бывает неудобно и долго. Поэтому нужно создать специальный файл, прописать в нем все зависимости и система сама все подключит.

Для это создаем в проекте файл requirements.txt и на каждой новой строке прописываем отдельную зависимость. После заполнения файла PyCharm сам поймет, что мы хотим сделать и предложит установить библиотеки. Для этого следует нажать кнопку «Install requirements».

Важно отметить: В этом случаем система установит последнюю доступную версию. Если необходимо установить специальную версию или ту, у которой не было официально релиза, то это необходимо указать в файле requirements.txt вручную. Для этого необходимо указать имя библиотеки и через знак == версию, которую необходимо установить. К примеру, selene==2.0.0rc7. Также можно указать версию с помощью знака >=. К примеру, selene>=2.0.0rc7, это означает что система установит последнюю версию библиотеки, которая не ниже 2.0.0rc7 включая версию которая указана после равно.

Если зависимостей много и не отображается кнопка «Install requirements», то можно воспользоваться командой pip install -r requirements.txt которую необходимо ввести в терминал проекта. Эта команда установит все зависимости из файла requirements.txt.

Также управлять зависимостями можно через терминал

Команда Описание
pip install -r requirements.txt Установить все зависимости и их версии, перечисленные в файле.
pip list Посмотреть все пакеты, установленные в текущем активном окружении.
pip freeze > requirements.txt Зафиксировать текущие установленные пакеты и их версии в файле requirements.txt.
pip uninstall -y requests Удалить пакет requests (флаг -y подтверждает удаление).
python -m pip install -U pip Обновить сам установщик pip (рекомендуется после создания venv).

Конфигурация зависимостей через Poetry (и аналоги)

Инструменты, такие как Poetry или uv, используются для более надёжной фиксации версий, управления зависимостями проекта и его метаданными. Конфигурация хранится в файле pyproject.toml.

Пример файла pyproject.toml

# Метаданные проекта
[project]
name = "qa-demo"
version = "0.1.0"
# Список зависимостей проекта
dependencies = [
    "pytest>=8", 
    "selenium>=4"
]

# Настройки для инструментов
[tool.pytest.ini_options]
addopts = "-ra -q"
testpaths = ["tests"]

Качество кода: Стандарты, Линтеры и Автоформатирование

Соблюдение стандартов и использование автоматических инструментов критически важно для читабельности, поддерживаемости и стабильности кода в командной разработке.

1. PEP 8: Стандарт стиля кода Python

PEP 8 — это набор рекомендаций о том, "как писать питоновский код читабельно". Это краткий, но исчерпывающий чек-лист по форматированию, именованию и структуре кода.

Полная документация: https://peps.python.org/pep-0008/

2. PEP 20: “The Zen of Python”

PEP 20 — набор из 19 принципов, лежащих в основе языка Python, которые помогают писать понятный и красивый код.

Принцип Краткое описание
Явное лучше неявного. Делай намерения кода очевидными.
Простое лучше сложного. Читаемость важна. Предпочитай простые решения и чистый стиль.
Плоское лучше вложенного. Не злоупотребляй глубокой иерархией и вложенностями.
Разреженное лучше плотного. Не уплотняй код за счёт читаемости.
Особые случаи не настолько особые. Избегай "магии" и исключений из общих правил.
Практичность важнее чистоты. Но не скатывайся в хаос — держи баланс.
Ошибки не должны проходить тихо. Если подавляешь ошибку — делай это явно и осознанно.
При неоднозначности — не угадывай. Требуй ясности интерфейсов и контрактов.
Должен быть один очевидный способ. Консистентность > зоопарк вариантов.
Сейчас лучше, чем никогда. Но иногда "никогда" лучше "прямо сейчас", если решение плохое.
Если сложно объяснить — это плохая идея. Хорошие решения легко описать.
Пространства имён — отличная идея. Активно используй модули, пакеты и квалифицированные имена.

Автоматическая проверка кода (Линтеры и Форматтеры)

Линтеры — это инструменты статического анализа кода. Они ищут ошибки, неочевидные баги, несоблюдение стиля, "пахнущий" код и т.д. https://peps.python.org/pep-0008/

Зачем?

  • Обеспечение единого стиля и читабельности.
  • Раннее обнаружение багов и антипаттернов (до запуска).
  • Более стабильные PR и быстрые ревью.
  • Автоматизация проверок в CI/CD.

Стек инструментов

Инструмент Категория Назначение
ruff Линтер / Форматтер Очень быстрый линтер (заменяет многие плагины flake8/pylint) и умеет авто-фикс.
black Автоформатирование Форматтер, который обеспечивает консистентный стиль, не конфликтуя с линтерами. Не является линтером!
mypy / pyright Проверка типов Инструменты статического анализа для проверки правильности использования типов (строже, чем обычный линтер).
isort Сортировка Автоматическая сортировка импортов по стандарту.
bandit Безопасность Базовая проверка безопасности кода (опционально).
flake8 / pylint Классика Традиционные, но более медленные линтеры для глубокой проверки.

Правила оформления Python-кода

Раздел Правило Пример
Отступы 4 пробела на уровень вложенности if x: do_something()
Длина строки До 79 символов (или до 88 при использовании Black)
Пустые строки Между функциями/классами верхнего уровня — 2 пустые строки
Кодировка Всегда UTF-8 (по умолчанию в Python 3) (доп. шапка обычно не нужна)
Импорты — расположение Сразу после модульного docstring и перед константами """Модуль..."""

import os
import sys

MAX_SIZE = 10
Импорты — порядок Группами с пустой строкой; алфавит внутри группы: stdlib → third-party → local import os
import sys

import requests

from . import utils
Вокруг операторов По одному пробелу с обеих сторон бинарных операторов total = a + b
Аргументы/вызов Без пробелов вокруг = у значений по умолчанию и keyword-аргументов def f(x=1, *, flag=True): ...
f(limit=10)
Скобки Без пробела сразу после ( и перед ) func(x, y)
Срезы/индексы Без пробела перед [; в простых срезах — без пробелов вокруг : a[i], a[i:j]
Точки/запятые Нет пробела перед , ; : print(a, b)
Имена функций/методов lower_snake_case def process_item():
Переменные lower_snake_case user_count = 0
Константы UPPER_SNAKE_CASE DEFAULT_TIMEOUT = 5
Классы/исключения CapWords (PascalCase) class DataError(Exception): ...
Модули/файлы Короткие, строчные имена analytics.py, utils_io.py
Защищённые члены Префикс одного подчёркивания _internal_helper()
«Магические» методы Двойное подчёркивание спереди и сзади __init__, __repr__
Сравнение с None Использовать is / is not if value is None:
Булевы значения Полагаться на истинность/ложность объектов if items:
Цепочки сравнений Компактная запись if 0 < x < 10:
Исключения Всегда конкретный тип исключения except ValueError:
Аннотации типов Использовать PEP 484 для функций и переменных def add(a: int, b: int) -> int: ...
count: int = 0

Плагины pytest для повышения качества

Эти плагины расширяют возможности стандартного запуска тестов pytest:

Плагин Команда / Примечание Назначение
pytest-html / Allure Генерирует отчеты Создание красивых HTML-отчётов о прогоне тестов.
pytest-xdist -n auto Параллельный запуск тестов для ускорения прогона.
pytest-rerunfailures Повторное прогоны нестабильных ("флапающих") тестов.
pytest-check Soft asserts Мягкие проверки (soft asserts) в одном тесте (тест не падает сразу).

Полный список плагинов: https://docs.pytest.org/en/stable/reference/plugin_list.html

Чек-лист перед git push

Перед отправкой изменений в удалённый репозиторий убедитесь, что:

  1. Тесты локально зелёные (pytest -q).
  2. Выполнен прогон линтеров/форматтеров (ruff/black/isort).
  3. Коммиты атомарные, а их сообщения — информативные (см. правила именования коммитов).
  4. Секретов и лишних артефактов в Git нет (.gitignore в порядке).
  5. README (при необходимости) обновлён.

Пишем тесты

Важно: в Pytest есть некоторые правила, которые необходимо соблюдать, чтобы корректно запускались тесты.
Все файлы, в которых написаны тесты, должны начинаться или заканчиваться на слово test. К примеру, test_google.py или google_test.py.
Все функции с тестами должны начинаться с префикса test. К примеру, def test_first().

Простой тест на Pytest, который просто запускается и ничего не делает, выглядит следующим образом:

def test_first():
    pass

Чтобы запустить, тест необходимо нажать на зеленую стрелку рядом с названием функции. В открывшемся окне выбрать Run 'pytest in test_something'.

Если не отображается зеленая стрелка, то нужно перейти в настройки проекта и в разделе Tools выбрать Python Integrated Tools. В открывшемся окне в разделе Testing выбрать Default test runner и в выпадающем списке выбрать pytest. И далее нажать Apply и Ok.

После запуска, результат теста будет отображен в консоли. Если тест не падает, то в консоли будет сообщение Process finished with exit code 0.

Также можно запустить тесты через терминал, для этого необходимо в терминале ввести команду pytest. Команда pytest запустит все тесты в проекте. Если необходимо запустить только один тест, то нужно указать его название через двоеточие. К примеру, pytest test_google.py::test_first. Если его запустить, то в терминале появится подробное сообщение с информацией о запуске теста.

Если мы напишем тест, который будет падать, то система подробно расскажет обо всех ошибках. И выделит конкретные строчки, на которых тест падает.

def test_sum():
    a = 5
    b = 10
    assert a == b

Следующим образом можно выводить в консоль сообщения во время падения теста:

def test_first():
    assert 1 == 1

def test_second():
    assert 1 == 2, "Единица не должна быть равна двойке"

Текст в кавычках будет выведен в консоль вместе с сообщением об ошибке. Это может быть полезно для быстрого понимания, что пошло не так. Текст в кавычках это просто текст который не изменяется в зависимости от того, что произошло в тесте.

Фикстуры

Фикстуры в Pytest — это функции, которые могут вызываться перед тестом или после него. Фикстуры могут быть полезны для подготовки тестовых данных или окружения. Все фикстуры должны быть описаны в файле conftest.py.

Для того чтобы создать фикстуру необходимо создать функцию с декоратором @pytest.fixture(). Внутри функции можно указать необходимые действия, которые будут выполняться при вызове фикстуры. Синтаксис фикстур:

@pytest.fixture()
def before_each():
    print("Called before each test")

def test_first(before_each):
    assert 1 == 1

Для того чтобы увидеть дерево вызовов фикстур можно воспользоваться командой pytest fixtures.py ----setup-plan, где fixtures.py название файла с тестами. В консоли будет выведено дерево вызовов фикстур.

import pytest


@pytest.fixture
def login_page(browser):
    print("Логин пейдж!")


@pytest.fixture
def user():
    print("Юзер!")
    return "username", "password"


def test_login(login_page, user):
    username, password = user
    assert username == "username"
    assert password == "password"


def test_logout(login_page, user):
    username, password = user
    assert username == "username"
    assert password == "password"
    

Teardown

Чтобы реализовать teardown, необходимо использовать ключевое слово yield. Все что будет после yield будет выполняться после теста. Разница между yield и return в том, что yield позволяет выполнить код после теста, а return нет, так как после return выполнение функции прекращается. Return можно использовать, для того чтобы вернуть значение из фикстуры.

import pytest


@pytest.fixture(scope="function")
def browser_settings():
    print("Браузер!")

    yield

    print("Закрываем браузер!")

При запуске теста в консоли видно, что сначала вызывается фикстура browser_settings_, которая печатает Браузер!, затем вызывается тест, и после теста вызывается снова фикстура browser_settings, которая печатает Закрываем браузер!.

В фикстурах используются scope, который позволяет указать, когда будет вызываться фикстура. Возможные значения:

  • function — фикстура будет вызываться перед каждым тестом. Это значение по умолчанию и можно не указывать его явно.
  • class — фикстура будет вызываться перед всеми тестами в классе. И если в классе несколько тестов, то фикстура будет вызываться один раз перед всеми тестами в классе и один раз после всех тестов в классе.
  • module — фикстура будет вызываться перед всеми тестами в модуле. Будет вызываться один раз перед всеми тестами в модуле и один раз после всех тестов в модуле.
  • session — фикстура будет вызываться перед всеми тестами в сессии. Будет вызываться один раз перед всеми тестами в сессии и один раз после всех тестов в сессии.
  • package — фикстура будет вызываться перед всеми тестами в пакете. Будет вызываться один раз перед всеми тестами в пакете и один раз после всех тестов в пакете.
Пример использования scope(нажать, чтобы раскрыть)

Пример для scope="function":

import pytest

@pytest.fixture(scope="function")
def my_fixture():
    # ...

def test_foo(my_fixture):
    # ...

def test_bar(my_fixture):
    # ...

Пример для scope="class":

import pytest

@pytest.fixture(scope="class")
def my_fixture():
    # ...

class TestClass:
    def test_foo(self, my_fixture):
        # ...

    def test_bar(self, my_fixture):
        # ...

Пример для scope="module":

import pytest

@pytest.fixture(scope="module")
def my_fixture():
    # ...

def test_foo(my_fixture):
    # ...

def test_bar(my_fixture):
    # ...

Пример для scope="session":

import pytest

@pytest.fixture(scope="session")
def my_fixture():
    # ...

def test_foo(my_fixture):
    # ...
    
def test_bar(my_fixture):
    # ...

Пример для scope="package":

import pytest

@pytest.fixture(scope="package")
def my_fixture():
    # ...

def test_foo(my_fixture):
    # ...

def test_bar(my_fixture):
    # ...

Подсказка к домашнему заданию

Смотрите только когда не можете понять что делать(нажать, чтобы раскрыть)

Вам нужно написать фикстуру в которой будут заданы размеры экрана браузера и передать ее в тест.

Синтаксис для задания размера окна браузера и закрытия браузера:

browser.config.window_height = 1080  # задает высоту окна браузера
browser.config.window_width = 1920  # задает ширину окна браузера
browser.quit() # закрывает браузер после выполнения теста

Для этого вам нужно создать файл conftest.py и в нем написать фикстуру:

@pytest.fixture()
def setting_browser():
    # задаем размер окна браузера (вместо этого комментария нужно подставить код из примера выше как задать размер окна браузера)
    yield 
    # закрываем браузер после выполнения теста (вместо этого комментария нужно подставить код из примера выше как закрыть браузер)

Дальше вам нужно в тесты передать фикстуру setting_browser. Для этого вам нужно в тестах в качестве параметра указать setting_browser:

def test_first(setting_browser):
    browser.open("https://www.google.com/")

def test_second(setting_browser):
    browser.open("https://www.google.com/")

Если в фикстуре указать autouse=True то фикстура будет запускаться перед каждым тестом автоматически и в тестах не нужно будет указывать setting_browser в качестве параметра:

Пример фикстуры с autouse=True:

@pytest.fixture(autouse=True)
def setting_browser():
    # задаем размер окна браузера (вместо этого комментария нужно подставить код из примера выше как задать размер окна браузера)
    yield 
    # закрываем браузер после выполнения теста (вместо этого комментария нужно подставить код из примера выше как закрыть браузер)

И в тестах тогда будет достаточно указать:

def test_first():
    browser.open("https://www.google.com/")

def test_second():
    browser.open("https://www.google.com/")

Полезные ссылки

⚠️ **GitHub.com Fallback** ⚠️