Pest v4.6.0 представляє розподіл шардів за часом — новий режим, який балансує CI-шарди на основі реальної тривалості виконання тестів, а не просто кількості файлів. Якщо ви вже використовуєте --shard у CI, достатньо записати дані про час виконання за допомогою --update-shards та додати отриманий JSON-файл до репозиторію.
- Розподіл шардів за часом через
--update-shards - Збереження даних про таймінг у
tests/.pest/shards.json
# Що нового
# Шардинг на основі часу
Під час паралельного запуску тестів на кількох CI-шардах поділ за кількістю файлів часто створює нерівномірне навантаження: один шард завершує роботу за секунди, тоді як інший працює кілька хвилин. Pest v4.6.0 розв'язує цю проблему завдяки збалансованому за часом шардингу.
Крок 1: Запустіть повний набір тестів із прапорцем --update-shards, щоб зафіксувати час виконання кожного класу:
./vendor/bin/pest --update-shards
Для пришвидшення процесу цей параметр можна комбінувати з --parallel:
./vendor/bin/pest --parallel --update-shards
Це запише тривалість виконання кожного тестового класу у файл tests/.pest/shards.json:
{
"timings": {
"Tests\\Feature\\Payments\\StripeCheckoutTest": 1.608,
"Tests\\Feature\\Reports\\SalesReportTest": 2.105,
"Tests\\Unit\\Models\\UserTest": 0.050
},
"checksum": "...",
"updated_at": "2026-04-14T10:30:00+00:00"
}
Крок 2: Додайте (commit) tests/.pest/shards.json до вашого репозиторію.
Крок 3: Запускайте шардовані CI-завдання як зазвичай. Якщо файл із таймінгами наявний, Pest автоматично застосує збалансований розподіл:
./vendor/bin/pest --shard=1/5
Вивід підтвердить, що активовано режим time-balanced:
Shard: 1 of 5 — 12 files ran, out of 50 (time-balanced).
Якщо після створення файлу з таймінгами ви додасте або перейменуєте тестові файли, Pest виявить розбіжність і виведе попередження:
WARN The [tests/.pest/shards.json] file is out of date...
Тести все одно будуть запущені: нові файли розподіляться рівномірно, а вже відомі — згідно з часом їхнього виконання. Видалення файлів не викликає попереджень, а застарілі записи ігноруватимуться до наступного оновлення JSON-файлу.
Приклад налаштування матриці у GitHub Actions:
strategy:
matrix:
shard: [1, 2, 3, 4, 5]
steps:
- name: Run tests
run: ./vendor/bin/pest --shard=${{ matrix.shard }}/5
PR: #1671, розроблено @nunomaduro