مقاله

Xdebug coverage، حداقل درصد معقول، گزارش در CI و pipeline تست خودکار با GitHub Actions.

Test Coverage و CI در Laravel — PHPUnit، Pest و GitHub Actions

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؟

  1. Unit + Feature همه
  2. بدون test skipped بدون دلیل
  3. lint اختیاری: Pint در job جدا

اشتباهات

  • coverage ۱۰۰٪ اجباری — تست بی‌معنی
  • بدون .env.testing — flaky DB
  • secret در workflow log

جمع‌بندی

CI تضمین regression؛ coverage نقشه blind spot. Mock: Mockery. Doubles: Fakes. Deploy بعدی در DevOps cluster.

CI/CD برای پروژه Laravel