2. Погружаемся в инструментарий и библиотеки - qa-guru/knowledge-base GitHub Wiki
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 |
Впервые отправить ветку и запомнить апстрим (установить связь) |
| Команда | Описание |
|---|---|
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 в текущую ветку- Исключаем: сборочные директории (build/, dist/), кеши (pip-cache/, pycache/), логи, артефакты инструментов (.tox, coverage), секреты и конфиги.
- Конфиги IDE (например, .idea/ / .pycharm/) хранить в Git обычно не нужно.
Дополнительно: Генератор gitignore — https://www.toptal.com/developers/gitignore
Наименование коммитов по соглашению 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 |
Ветки должны отражать их назначение и включать тип и/или номер задачи из вашего трекера.
| Формат | Пример | Назначение |
|---|---|---|
<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 и переключиться на вкладку «Repositories».

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

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

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

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

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

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

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

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

README (от англ. "Read Me" — "Прочти меня") — это текстовый файл, который является первым контактом пользователя или другого разработчика с вашим проектом. Это самый важный файл, который обычно находится в корневой директории любого репозитория (например, на GitHub).
- Лицо проекта: Это "витрина" или "лицо" вашего проекта. Он должен сразу объяснить, что это за проект и зачем он нужен.
- Быстрый старт: Предоставляет критически важные сведения, чтобы кто-то мог быстро понять, как установить, запустить и использовать код.
- Документация: Служит краткой, но структурированной документацией по основным аспектам проекта.
- Название и краткое описание: Заголовок и 1-2 предложения о сути проекта.
- Установка (Installation): Пошаговая инструкция, как установить все необходимые зависимости.
- Использование (Usage) / Быстрый старт: Примеры кода или команды для запуска проекта.
- Функциональность (Features): Что умеет делать проект.
- Технологический стек: Какие языки и фреймворки использованы.
- Участие (Contributing): Правила для тех, кто хочет внести свой вклад.
- Лицензия: Информация о лицензии, под которой распространяется код.
Чаще всего файл называется README.md, где .md означает, что он написан с использованием синтаксиса Markdown. Это позволяет красиво форматировать текст (заголовки, списки, кодовые блоки) для отображения на веб-платформах, таких как GitHub или GitLab.
Оформление README.md: https://gist.github.com/alinastorm/8a04cdbc36be9c051a66f90ae6d6df35
Виртуальное окружение — это локальная, изолированная "копия" интерпретатора Python и набора библиотек для конкретного проекта.
Как работает: Инструмент (например, venv) создает каталог (например, .venv/ или env/) с копией интерпретатора и изменяет переменные окружения среды, чтобы все команды (pip, python) работали внутри этого изолированного каталога.
| Команда | Описание |
|---|---|
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 |
Удалить (снести) виртуальное окружение. |
1. При создании нового проекта При инициализации нового проекта PyCharm автоматически предлагает настроить изолированное окружение.
- Запуск PyCharm и выбор "New Project" (Новый проект).
- В окне "New Project" найдите раздел "Python Interpreter" (Интерпретатор Python).
- Из выпадающего меню выберите тип:
- "Virtualenv" (Виртуальное окружение).
- Или "Poetry" / "Conda" (если вы используете эти менеджеры).
-
Укажите расположение (Location): PyCharm по умолчанию предлагает создать папку окружения (
.venvилиenv) внутри каталога проекта. - Выберите базовый интерпретатор (Base interpreter): Укажите путь к системной установке Python (например, Python 3.11), который будет служить основой для нового окружения.
- Нажмите "Create" (Создать).
PyCharm автоматически создаст изолированное окружение и привяжет его к вашему проекту.
2. Для существующего проекта (Через настройки) Если вы клонировали проект без окружения, или вам нужно изменить/добавить интерпретатор:
- Откройте проект в PyCharm.
- Перейдите в Settings/Preferences (клавиши:
Ctrl+Alt+Sили⌘,). - В дереве слева выберите "Project: [Имя проекта]" → "Python Interpreter".
- Нажмите на значок ⚙️ (Шестеренка) справа от поля "Python Interpreter" и выберите "Add..." (Добавить...).
- В окне "Add Python Interpreter" выберите "Virtualenv Environment".
- Выберите "New environment" (Новое окружение).
- Укажите расположение и базовый интерпретатор.
- Нажмите "OK".
PyCharm создаст окружение и автоматически установит его как активный интерпретатор для текущего проекта. После создания виртуального окружения (
.venvилиenv/) обязательно откройте новый терминал или перезапустите текущий. Это гарантирует, что переменные среды корректно подтянутся, и все последующие команды (python,pip) будут использовать правильный изолированный интерпретатор вашего проекта
Зависимости в 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 или 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"]Соблюдение стандартов и использование автоматических инструментов критически важно для читабельности, поддерживаемости и стабильности кода в командной разработке.
PEP 8 — это набор рекомендаций о том, "как писать питоновский код читабельно". Это краткий, но исчерпывающий чек-лист по форматированию, именованию и структуре кода.
Полная документация: https://peps.python.org/pep-0008/
PEP 20 — набор из 19 принципов, лежащих в основе языка Python, которые помогают писать понятный и красивый код.
| Принцип | Краткое описание |
|---|---|
| Явное лучше неявного. | Делай намерения кода очевидными. |
| Простое лучше сложного. | Читаемость важна. Предпочитай простые решения и чистый стиль. |
| Плоское лучше вложенного. | Не злоупотребляй глубокой иерархией и вложенностями. |
| Разреженное лучше плотного. | Не уплотняй код за счёт читаемости. |
| Особые случаи не настолько особые. | Избегай "магии" и исключений из общих правил. |
| Практичность важнее чистоты. | Но не скатывайся в хаос — держи баланс. |
| Ошибки не должны проходить тихо. | Если подавляешь ошибку — делай это явно и осознанно. |
| При неоднозначности — не угадывай. | Требуй ясности интерфейсов и контрактов. |
| Должен быть один очевидный способ. | Консистентность > зоопарк вариантов. |
| Сейчас лучше, чем никогда. | Но иногда "никогда" лучше "прямо сейчас", если решение плохое. |
| Если сложно объяснить — это плохая идея. | Хорошие решения легко описать. |
| Пространства имён — отличная идея. | Активно используй модули, пакеты и квалифицированные имена. |
Линтеры — это инструменты статического анализа кода. Они ищут ошибки, неочевидные баги, несоблюдение стиля, "пахнущий" код и т.д. https://peps.python.org/pep-0008/
- Обеспечение единого стиля и читабельности.
- Раннее обнаружение багов и антипаттернов (до запуска).
- Более стабильные PR и быстрые ревью.
- Автоматизация проверок в CI/CD.
| Инструмент | Категория | Назначение |
|---|---|---|
| ruff | Линтер / Форматтер |
Очень быстрый линтер (заменяет многие плагины flake8/pylint) и умеет авто-фикс. |
| black | Автоформатирование | Форматтер, который обеспечивает консистентный стиль, не конфликтуя с линтерами. Не является линтером! |
| mypy / pyright | Проверка типов | Инструменты статического анализа для проверки правильности использования типов (строже, чем обычный линтер). |
| isort | Сортировка | Автоматическая сортировка импортов по стандарту. |
| bandit | Безопасность | Базовая проверка безопасности кода (опционально). |
| flake8 / pylint | Классика | Традиционные, но более медленные линтеры для глубокой проверки. |
| Раздел | Правило | Пример |
|---|---|---|
| Отступы | 4 пробела на уровень вложенности | if x: do_something() |
| Длина строки | До 79 символов (или до 88 при использовании Black) | — |
| Пустые строки | Между функциями/классами верхнего уровня — 2 пустые строки | — |
| Кодировка | Всегда UTF-8 (по умолчанию в Python 3) | (доп. шапка обычно не нужна) |
| Импорты — расположение | Сразу после модульного docstring и перед константами |
"""Модуль..."""import osimport sysMAX_SIZE = 10
|
| Импорты — порядок | Группами с пустой строкой; алфавит внутри группы: stdlib → third-party → local |
import osimport sysimport requestsfrom . 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-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
Перед отправкой изменений в удалённый репозиторий убедитесь, что:
- Тесты локально зелёные (
pytest -q). - Выполнен прогон линтеров/форматтеров (
ruff/black/isort). - Коммиты атомарные, а их сообщения — информативные (см. правила именования коммитов).
- Секретов и лишних артефактов в Git нет (
.gitignoreв порядке). -
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, необходимо использовать ключевое слово 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/")- Pytest Documentation
- Selenium
- Python Virtual Environments (venv)
- Pip freeze and requirements.txt
- How to Run a Makefile in Windows
- Makefile on MAC OS
- Оформляем README-файл профиля на GitHub
- PEP-8 - Секрет чистого и профессионального кода! [Python - Первый шаг 014]
- Дзен Python — философии программирования от Тима Петерса (PEP20)
- PEP 8 - руководство по написанию кода на Python
- PEP 8 – Style Guide for Python Code
- Ruff Documentation
- Black Documentation
- isort Documentation
- Руководство по makefile для начинающих (Habr)