Зачем QA-инженерам Git
Каждый профессиональный проект автоматизации использует контроль версий. Git — отраслевой стандарт. Как QA automation engineer, вы будете:
- Хранить тест-код в репозиториях рядом с кодом приложения
- Создавать ветки для новых наборов тестов
- Отправлять pull requests для code review
- Разрешать конфликты слияния при одновременной работе нескольких человек
- Использовать историю Git для понимания, когда и почему менялись тесты
- Интегрироваться с CI/CD-пайплайнами, срабатывающими по событиям Git
Основные команды Git
Начальная настройка
# Настройка идентификации
git config --global user.name "Ваше Имя"
git config --global user.email "ваш.email@company.com"
# Клонирование репозитория
git clone https://github.com/company/test-automation.git
cd test-automation
# Проверка текущего состояния
git status
Команды ежедневного рабочего процесса
# Получить последние изменения с удалённого репозитория
git pull origin main
# Создать новую ветку для работы
git checkout -b feature/add-login-tests
# Посмотреть изменённые файлы
git status
git diff
# Добавить конкретные файлы в staging
git add tests/login.spec.ts
git add tests/fixtures/users.json
# Коммит с описательным сообщением
git commit -m "Добавить набор тестов страницы логина с позитивными и негативными сценариями"
# Push ветки на удалённый репозиторий
git push origin feature/add-login-tests
Просмотр истории
# Просмотр истории коммитов
git log --oneline -20
# Что изменилось в конкретном коммите
git show abc1234
# Кто последний раз менял каждую строку файла
git blame tests/login.spec.ts
# Найти, когда тест был добавлен или изменён
git log --follow tests/checkout.spec.ts
Стратегия ветвления для тест-кода
Соглашения по именованию веток
Используйте ясные, описательные имена:
feature/add-checkout-tests # Новый набор тестов
feature/POM-login-page # Новый page object
fix/flaky-search-test # Исправление нестабильного теста
refactor/base-test-class # Рефакторинг существующего кода
chore/update-playwright-version # Обновление зависимостей
Процесс работы с feature-ветками
main ─────────────────────────────────────────
\ /
feature/add-login-tests ─────
- Создать ветку от
main - Внести изменения и закоммитить
- Push на удалённый репозиторий и открыть pull request
- Получить code review от коллег
- CI автоматически запускает тесты
- Слияние после утверждения
Поддержание ветки в актуальном состоянии
# Пока вы работаете, в main могут появиться новые коммиты
git checkout main
git pull origin main
git checkout feature/add-login-tests
git rebase main
# Или merge main в вашу ветку
git merge main
Процесс Pull Request
Создание хорошего PR для тест-кода
Хороший pull request включает:
Заголовок: Чёткое описание добавленных/изменённых тестов
Добавить E2E-тесты страницы логина с edge cases
Описание:
## Что сделано
- Добавлены 12 тест-кейсов для страницы логина
- Покрывает позитивный логин, невалидные данные, блокировку аккаунта, SSO
## Покрытие тестами
- Happy path: валидный вход по email/паролю
- Негативные: неверный пароль (3 попытки → блокировка)
- Edge cases: SQL injection в поле email, XSS в пароле
- SSO: OAuth-потоки Google и GitHub
## Добавленные Page Objects
- LoginPage: login(), forgotPassword(), socialLogin()
- DashboardPage: verifyWelcome(), logout()
## Как запустить
npm run test:login
Чеклист code review для тест-кода
При ревью PR с тестами проверяйте:
- Тесты имеют ясные, описательные имена
- Нет захардкоженных данных (используются фикстуры или фабрики)
- Корректное использование page objects (без сырых селекторов в тестах)
- Ассерты конкретные и осмысленные
- Тесты независимы (нет зависимости от порядка)
- Очистка обработана (тестовые данные, состояние браузера)
- Нет ненужных wait или sleep
Разрешение конфликтов слияния
Конфликты возникают, когда два человека редактируют один файл. В автоматизации это часто происходит в:
- Общих page objects
- Файлах конфигурации тестов
- Файлах тестовых данных
Разрешение конфликта
# Когда видите конфликт после merge или rebase
# Git помечает конфликтующие секции:
<<<<<<< HEAD (ваши изменения)
async login(email, password) {
await this.page.fill('#email-v2', email);
}
=======
async login(email, password) {
await this.page.fill('[data-testid="email"]', email);
}
>>>>>>> main (входящие изменения)
# Разрешите, выбрав правильную версию или объединив обе
async login(email, password) {
await this.page.fill('[data-testid="email"]', email);
}
# Затем добавьте и закоммитьте
git add tests/pages/login.page.ts
git commit -m "Разрешить конфликт: использовать data-testid селектор для email"
.gitignore для тестовых проектов
Правильный .gitignore предотвращает попадание ненужных файлов в репозиторий:
# Результаты и отчёты тестов
test-results/
playwright-report/
allure-results/
allure-report/
coverage/
# Скриншоты и видео из запусков
screenshots/
videos/
traces/
# Зависимости
node_modules/
.venv/
# Файлы IDE
.vscode/
.idea/
*.swp
# Файлы окружения с секретами
.env
.env.local
# Файлы ОС
.DS_Store
Thumbs.db
# Билд-артефакты
dist/
build/
Git Hooks для качества тестов
Git hooks автоматически запускают скрипты при определённых событиях Git:
Pre-Commit Hook
Запуск линтинга перед каждым коммитом:
#!/bin/sh
# .git/hooks/pre-commit
npx eslint tests/ --ext .ts,.js
if [ $? -ne 0 ]; then
echo "Линтинг не прошёл. Исправьте проблемы перед коммитом."
exit 1
fi
Pre-Push Hook
Запуск тестов перед push:
#!/bin/sh
# .git/hooks/pre-push
npx playwright test --grep @smoke
if [ $? -ne 0 ]; then
echo "Smoke-тесты упали. Исправьте перед push."
exit 1
fi
Продвинутый Git для QA
Сохранение незавершённой работы через stash
# Временно сохранить незакоммиченные изменения
git stash save "WIP: тесты checkout"
# Переключиться на другую ветку для срочного исправления
git checkout fix/flaky-login-test
# Вернуться и восстановить работу
git checkout feature/checkout-tests
git stash pop
Cherry-pick исправления
# Применить конкретный коммит из другой ветки
git cherry-pick abc1234
Bisect для поиска сломавшего теста коммита
# Найти коммит, внёсший баг
git bisect start
git bisect bad # Текущий коммит сломан
git bisect good abc1234 # Этот старый коммит работал
# Git переключает на промежуточный коммит — запустите тест
npx playwright test tests/login.spec.ts
# Сообщите Git результат
git bisect good # или git bisect bad
# Повторяйте, пока Git не найдёт виновный коммит
git bisect reset # По завершении
Лучшие практики совместной работы
Рекомендации по сообщениям коммитов
# Хорошие сообщения
git commit -m "Добавить E2E-тесты checkout для гостевого и зарегистрированного пользователя"
git commit -m "Исправить нестабильный тест поиска: увеличить таймаут ожидания ответа API"
git commit -m "Рефакторинг LoginPage: вынести методы заполнения форм в BaseFormPage"
# Плохие сообщения
git commit -m "поправить тесты"
git commit -m "обновление"
git commit -m "WIP"
Атомарные коммиты
Каждый коммит должен быть логической единицей:
- Один коммит на функцию или исправление
- Тесты должны проходить после каждого коммита
- Не смешивать несвязанные изменения
Упражнение: Практика рабочего процесса Git
Отработайте следующий процесс:
- Склонируйте тестовый репозиторий (или создайте новый)
- Создайте ветку
feature/add-search-tests - Добавьте файл
tests/search.spec.tsс двумя тест-кейсами - Закоммитьте с описательным сообщением
- Создайте вторую ветку
feature/add-filter-testsот main - Измените один и тот же конфигурационный файл в обеих ветках
- Слейте обе ветки и разрешите конфликты
- Просмотрите историю через
git log --graph --oneline
Ключевые выводы
- Используйте feature-ветки для всех изменений тест-кода
- Пишите описательные сообщения коммитов, объясняя что и почему
- Всегда забирайте последние изменения перед началом новой работы
- Разрешайте конфликты слияния, понимая оба набора изменений
- Используйте .gitignore для исключения результатов и отчётов из репозитория
- Git hooks автоматизируют проверки качества перед коммитом и push