Test Coverage و CI در Laravel — PHPUnit، Pest و GitHub Actions
تست بدون CI روی لپتاپ developer میماند. Coverage هم عدد راهنماست نه هدف — اما در PR نشان میدهد کدام بخش بدون تست merge شده. این مقاله pipeline عملی Laravel + Pest/PHPUnit + GitHub Actions را میچیند.
اجرای coverage محلی
# PCOV سریعتر از Xdebug برای coverage
php -d pcov.enabled=1 ./vendor/bin/pest --coverage
# حداقل درصد
php -d pcov.enabled=1 ./vendor/bin/pest --coverage --min=70
نصب PCOV یا Xdebug در php.ini محیط dev.
phpunit.xml تنظیم coverage
<source>
<include>
<directory>app</directory>
</include>
<exclude>
<directory>app/Providers</directory>
</exclude>
</source>
Provider و route list معمولاً exclude — تمرکز روی domain.
چند درصد کافی است؟
- startup: ۵۰–۶۰٪ با تست بحرانی
- محصول پایدار: ۷۰–۸۰٪ روی app/
- ۱۰۰٪ هدف معمولاً waste — کیفیت تست مهمتر
GitHub Actions — workflow پایه
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: mbstring, pdo_mysql
coverage: pcov
- name: Install dependencies
run: composer install --no-interaction --prefer-dist
- name: Copy env
run: cp .env.example .env
- name: Generate key
run: php artisan key:generate
- name: Run tests
run: php artisan test --parallel --coverage --min=70
php artisan test همان Pest/PHPUnit — Laravel 12.
MySQL در CI
services:
mysql:
image: mysql:8.0
env:
MYSQL_DATABASE: testing
MYSQL_ROOT_PASSWORD: password
ports:
- 3306:3306
.env.testing با DB testing — یا SQLite :memory: برای سرعت.
گزارش coverage در PR
Actionهای third-party مثل codecov یا coveralls — upload بعد از test:
- name: Upload coverage
uses: codecov/codecov-action@v4
with:
files: ./coverage.xml
Pest: --coverage-clover coverage.xml
Pest parallel در CI
php artisan test --parallel --recreate-databases
سریعتر — worker جدا. Pest.
شکست pipeline = شکست merge
branch protection: require status check «Tests» قبل از merge.
چه تستی در CI؟
- Unit + Feature همه
- بدون test skipped بدون دلیل
- lint اختیاری: Pint در job جدا
اشتباهات
- coverage ۱۰۰٪ اجباری — تست بیمعنی
- بدون .env.testing — flaky DB
- secret در workflow log
جمعبندی
CI تضمین regression؛ coverage نقشه blind spot. Mock: Mockery. Doubles: Fakes. Deploy بعدی در DevOps cluster.