Налаштування автоматичного запуску тестів при Pull Request
Автоматичний запуск тестів при PR — базовий захист від регресій. Розробник не може об'єднати код, який порушує існуючу функціональність. Це не заміна code review, а його доповнення: рецензент зосереджується на логіці, а не на ловленні явних ошибок.
Структура pipeline
Хорошо структурований pipeline розбивається на паралельні job'и зі стратегією fail-fast:
# .github/workflows/pr.yml
name: PR Tests
on:
pull_request:
branches: [main, develop]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true # Скасувати старі запуски при новому push
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20, cache: npm }
- run: npm ci
- run: npm run lint && npm run type-check
unit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20, cache: npm }
- run: npm ci
- run: npm test -- --coverage
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
integration:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_DB: testdb
POSTGRES_PASSWORD: test
options: >-
--health-cmd pg_isready
--health-interval 5s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20, cache: npm }
- run: npm ci
- run: npm run test:integration
env:
DATABASE_URL: postgresql://postgres:test@localhost:5432/testdb
Кешування залежностей
# Кеш node_modules за package-lock.json
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm # Вбудований кеш в actions/setup-node
# Або явно через actions/cache
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
Без кешу npm ci на холодному раннері — 60–90 секунд. З кешем — 5–10 секунд.
Матриця тестування
Якщо програма повинна працювати на кількох версіях Node.js або PHP:
strategy:
matrix:
node-version: [18, 20, 22]
fail-fast: false # Запустити всі версії навіть якщо одна впала
PHP / Laravel
- name: Run PHPUnit
run: php artisan test --parallel --coverage-clover=coverage.xml
env:
DB_CONNECTION: pgsql
DB_DATABASE: testing
- name: Upload coverage
uses: codecov/codecov-action@v4
with:
files: coverage.xml
--parallel запускає тести паралельно через brianium/paratest. На 200+ тестах прискорює в 3–4 рази.
Статус-перевірки та захист гілки
У GitHub Settings → Branches → Branch protection rules додаємо обов'язкові статус-перевірки: lint, unit, integration. Merge в main без проходження цих перевірок неможливий.
Оптимізація швидкості
- Path filtering — запускати тести тільки при зміні релевантних файлів
- Test splitting — розподілити тести по кількох раннерах (GitHub Actions matrix)
-
Тільки змінені модулі — Jest
--changedSince, pytest--testpaths
Мета: pipeline укладається в 5 хвилин. Повільніше — розробники починають ігнорувати.
Часовий графік
Налаштування базового pipeline з unit та integration тестами для Node.js або PHP проекту — 1–2 дні. Налаштування coverage звітів та badge в README — 0,5 дня.







