Lompat ke konten
dokumentasi.id
Commit 159d6ac
v1
Star1

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

8

Pengujian dan Alur CI

Paket ini memakai tiga script composer sebagai gerbang pemeriksaan: test, analyse, dan format. Ketiganya hanya membungkus binary di vendor/, sehingga perintah yang sama bisa dijalankan ulang di runner CI tanpa jalur khusus. composer.json:54-61

ScriptPerintahAlatCakupan
composer testvendor/bin/pestPest 4seluruh direktori tests
composer test-coveragevendor/bin/pest --coveragePest 4sama, ditambah laporan coverage
composer analysevendor/bin/phpstan analysePHPStan + Larastansrc dan config
composer formatvendor/bin/pintPintgaya kode

Pest, Larastan, Testbench, dan Pint berada di require-dev, bukan require. Konsumen paket karena itu tidak ikut menginstal perkakas pengujian ini. composer.json:30-42

Rute dari script composer ke test suite

graph LR
    T["composer test"] --> P["vendor/bin/pest"]
    A["composer analyse"] --> S["vendor/bin/phpstan analyse"]
    F["composer format"] --> N["vendor/bin/pint"]
    P --> X["phpunit.xml.dist"]
    X --> PEST["tests/Pest.php"]
    PEST --> TC["Tests\\TestCase"]
    TC --> TB["orchestra/testbench"]
    TC --> SP["UserstampsServiceProvider"]
    S --> PN["phpstan.neon.dist"]
    PN --> SRC["src + config"]
    style T fill:#2d7d46,color:#fff
    style A fill:#2d7d46,color:#fff
    style F fill:#2d7d46,color:#fff
    style X fill:#f59e0b,color:#000
    style PN fill:#f59e0b,color:#000
    style TB fill:#336791,color:#fff
    style SP fill:#336791,color:#fff
    style PEST fill:#8b5cf6,color:#fff
    style TC fill:#8b5cf6,color:#fff
%% fig: Rute perintah composer ke binary dan berkas konfigurasinya
%% desc: Setiap script composer diteruskan ke binary Pest, PHPStan, atau Pint; Pest memuat phpunit.xml.dist lalu TestCase berbasis testbench, PHPStan memuat phpstan.neon.dist.
Fig. 1: Rute perintah composer ke binary dan berkas konfigurasinyaSetiap script composer diteruskan ke binary Pest, PHPStan, atau Pint; Pest memuat phpunit.xml.dist lalu TestCase berbasis testbench, PHPStan memuat phpstan.neon.dist.

Basis test di atas orchestra/testbench

tests/Pest.php mengikat seluruh test di direktori itu ke TestCase milik paket, sehingga tidak ada berkas test yang perlu mendaftarkan base class sendiri. tests/Pest.php:1-5

TestCase memperluas Orchestra\Testbench\TestCase dan mendaftarkan UserstampsServiceProvider lewat getPackageProviders. Artinya boot paket, termasuk registrasi observer dan macro Blueprint, terjadi pada setiap test tanpa memerlukan aplikasi Laravel utuh. tests/TestCase.php:8-19

Hook post-autoload-dump menjalankan script prepare, yang mengeksekusi testbench package:discover --ansi. Langkah ini otomatis terjadi setelah composer install atau composer update, jadi paket sudah ditemukan Testbench sebelum Pest dijalankan. composer.json:55-56

Apa yang diuji

BerkasHelper atau kasusCakupan
tests/Feature/UserstampsBehaviorTest.phptestUserstampsBehavioralur create → delete → restore dan opsi userstamps.with_trashed
tests/Feature/DatabaseMacrcoTest.phptestUserstampsWorkflowmacro userstamps, softUserstamps, dropUserstamps, dropSoftUserstamps
tests/Feature/UserstampsColumnsTest.phpafterEach menghapus tabelkolom yang muncul saat morph aktif dan nonaktif
tests/Feature/TraitHasUserstampsTest.phpsatu ekspektasi not->toThrowpencegahan circular boot saat observer didaftarkan

Helper testUserstampsBehavior memakai actingAs bergantian untuk tiga user, memeriksa createdBy, updatedBy, dan deletedBy setelah delete() dan restore(), lalu mengaktifkan userstamps.with_trashed untuk memastikan relasi tetap terbaca ketika user sudah di-soft delete. tests/Feature/UserstampsBehaviorTest.php:11-48

testUserstampsWorkflow menjalankan empat tahap makro secara berurutan: menambah userstamps, menambah soft userstamps, menghapus keduanya, lalu memastikan kolomnya hilang. Nama kolom diambil dari config userstamps.created_by_column, updated_by_column, dan deleted_by_column, sehingga test yang sama juga menguji kolom kustom. tests/Feature/DatabaseMacrcoTest.php:34-53

Tabel test_products dibersihkan lewat afterEach dengan Schema::dropIfExists, pola yang perlu ditiru ketika menambah test berbasis schema baru. tests/Feature/UserstampsColumnsTest.php:7-9

Test di TraitHasUserstampsTest hanya satu kalimat: membuat new Product tidak boleh melempar LogicException. Ekspektasi ini menjaga agar pendaftaran observer tidak memicu boot model secara melingkar. tests/Feature/TraitHasUserstampsTest.php:5-7

Konfigurasi PHPUnit

phpunit.xml.dist memakai mode ketat: urutan eksekusi acak, serta failOnWarning, failOnRisky, failOnEmptyTestSuite, dan beStrictAboutOutputDuringTests semuanya true. Output cache disimpan di .phpunit.cache. Konsekuensinya, satu deprecation atau satu suite kosong langsung menggagalkan composer test. phpunit.xml.dist:5-17

Satu test suite terdaftar dengan nama VendorName Test Suite yang menunjuk direktori tests, dan hasilnya juga ditulis sebagai JUnit ke build/report.junit.xml. phpunit.xml.dist:18-25

Cakupan sumber untuk laporan coverage dibatasi ke direktori ./src. phpunit.xml.dist:26-30

⚠️ Nama VendorName Test Suite adalah placeholder template yang belum diganti. Nilai ini tidak mempengaruhi hasil test, tetapi muncul apa adanya di laporan JUnit.

PHPStan level 5

PHPStan dijalankan pada level 5 dengan paths src dan config, direktori sementara build/phpstan, serta dua pemeriksaan tambahan yang aktif: checkOctaneCompatibility dan checkModelProperties. phpstan.neon.dist:4-11

Konfigurasi juga menyertakan phpstan-baseline.neon sebagai berkas includes. phpstan.neon.dist:1-2

Tiga pola diabaikan secara eksplisit, semuanya berkaitan dengan paket dan fixture test: trait HasUserstamps yang dianggap tidak dipakai, pemanggilan usingSoftDeletes pada Model, dan App\Models\User yang tidak ada di repository. phpstan.neon.dist:12-15

Workflow GitHub Actions

WorkflowBerkasTriggerJobPerintah penentu
run-tests.github/workflows/run-tests.ymlpush pada **.php, workflow itu sendiri, phpunit.xml.dist, composer.json, composer.locktestvendor/bin/pest --ci
PHPStan.github/workflows/phpstan.ymlpush pada **.php, phpstan.neon.dist, workflow itu sendiriphpstan./vendor/bin/phpstan --error-format=github
Fix PHP code style issues.github/workflows/fix-php-code-style-issues.ymlpush pada **.phpphp-code-stylingaglipanci/[email protected]

Workflow run-tests membatasi eksekusi ganda pada branch yang sama lewat concurrency dengan cancel-in-progress: true, sehingga push baru membatalkan run lama yang belum selesai. .github/workflows/run-tests.yml:12-14

Matriks job test berisi empat dimensi, ditambah pemetaan Testbench per versi Laravel:

DimensiNilai
osubuntu-latest, windows-latest
php8.4, 8.3
laravel12.*, 11.*
stabilityprefer-lowest, prefer-stable
testbench (include)12.* → 10.*, 11.* → 9.*

Kombinasi itu menghasilkan 16 run per push, masing-masing dibatasi timeout-minutes: 5 dengan fail-fast: true sehingga satu kegagalan menghentikan sisa matriks. .github/workflows/run-tests.yml:16-31

Langkah job test berurutan: checkout, setup PHP beserta daftar extension (termasuk pdo_sqlite dan sqlite), problem matcher PHP dan PHPUnit, instalasi dependency, composer show -D, lalu eksekusi test. .github/workflows/run-tests.yml:35-60

Instalasi dependency memakai composer require untuk laravel/framework dan orchestra/testbench sesuai nilai matriks dengan --no-interaction --no-update, baru setelah itu composer update memakai flag stabilitas dari matriks. .github/workflows/run-tests.yml:51-54

Langkah terakhir menuliskan versi dependency terpasang lewat composer show -D, lalu menjalankan vendor/bin/pest --ci. Flag --ci ini tidak dipakai oleh script composer test di lokal. .github/workflows/run-tests.yml:59-60

Workflow PHPStan hanya berjalan di ubuntu-latest dengan timeout-minutes: 5, PHP 8.4, dan coverage: none. .github/workflows/phpstan.yml:10-14

Dependency-nya dipasang lewat ramsey/composer-install@v4, bukan langkah composer update manual, dan analisis dijalankan dengan format error github agar temuan muncul sebagai anotasi. .github/workflows/phpstan.yml:24-28

Trigger kedua workflow juga dibatasi daftar path: perubahan pada **.php serta berkas konfigurasi terkait saja yang memicu run. .github/workflows/phpstan.yml:3-8

gantt
    title Dua job CI di dalam batas timeout-minutes 5
    dateFormat mm:ss
    axisFormat %M:%S
    section run-tests
    Checkout code                 :r1, 00:00, 20s
    Setup PHP dan extensions      :r2, after r1, 40s
    Install dependencies          :r3, after r2, 100s
    Execute tests pest --ci       :crit, r4, after r3, 120s
    section PHPStan
    Install composer dependencies :p1, 00:00, 90s
    Run PHPStan                   :crit, p2, after p1, 90s
    section gate
    Kedua job hijau               :milestone, m1, 00:05, 0s
%% fig: Linimasa job CI setelah push
%% desc: Workflow run-tests dan PHPStan berjalan paralel setelah push, masing-masing dibatasi lima menit, dan pemeriksaan dinyatakan lolos hanya setelah langkah terakhir keduanya hijau. Panjang bar menggambarkan urutan, bukan durasi terukur.
Fig. 2: Linimasa job CI setelah pushWorkflow run-tests dan PHPStan berjalan paralel setelah push, masing-masing dibatasi lima menit, dan pemeriksaan dinyatakan lolos hanya setelah langkah terakhir keduanya hijau. Panjang bar menggambarkan urutan, bukan durasi terukur.

Angka detik pada diagram hanya pembagian ilustratif di dalam batas yang diambil langsung dari kode, yaitu timeout-minutes: 5. .github/workflows/run-tests.yml:16-31

⚠️ Kedua workflow hanya bereaksi pada push; tidak ada trigger pull request. Pemeriksaan karena itu tidak otomatis berjalan pada PR, terutama PR dari fork. .github/workflows/run-tests.yml:3-10 dan .github/workflows/phpstan.yml:3-8

⚠️ Matriks run-tests berhenti di Laravel 11.* dan 12.*, sedangkan require masih mengizinkan illuminate/contracts ^13.0. Kombinasi Laravel 13 belum tercakup matriks. composer.json:25-29 dan .github/workflows/run-tests.yml:16-31

Gaya kode otomatis

composer format menjalankan vendor/bin/pint tanpa argumen, jadi perbaikan gaya kode dilakukan di tempat pada berkas yang berubah. composer.json:54-61

Di CI, pemeriksaan gaya tidak memakai script itu. Workflow Fix PHP code style issues memanggil aglipanci/[email protected], lalu membuat commit otomatis lewat stefanzweifel/git-auto-commit-action@v7 dengan pesan style: 🎨 formatting code. .github/workflows/fix-php-code-style-issues.yml:22-28

⚠️ Workflow ini menulis ke branch, bukan hanya memeriksa. Izin contents: write dan langkah auto-commit membuat hasil Pint langsung menjadi commit baru setiap ada push yang menyentuh **.php. .github/workflows/fix-php-code-style-issues.yml:22-28

Alur kerja yang konsisten: jalankan composer format, composer analyse, dan composer test sebelum push. CI lalu mengulang pemeriksaan yang sama dalam matriks lintas OS, versi PHP, versi Laravel, dan stabilitas dependency.