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-611
| Script | Perintah | Alat | Cakupan |
|---|---|---|---|
composer test | vendor/bin/pest | Pest 4 | seluruh direktori tests |
composer test-coverage | vendor/bin/pest --coverage | Pest 4 | sama, ditambah laporan coverage |
composer analyse | vendor/bin/phpstan analyse | PHPStan + Larastan | src dan config |
composer format | vendor/bin/pint | Pint | gaya 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-422
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.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-53
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-194
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-565
Apa yang diuji
| Berkas | Helper atau kasus | Cakupan |
|---|---|---|
tests/Feature/UserstampsBehaviorTest.php | testUserstampsBehavior | alur create → delete → restore dan opsi userstamps.with_trashed |
tests/Feature/DatabaseMacrcoTest.php | testUserstampsWorkflow | macro userstamps, softUserstamps, dropUserstamps, dropSoftUserstamps |
tests/Feature/UserstampsColumnsTest.php | afterEach menghapus tabel | kolom yang muncul saat morph aktif dan nonaktif |
tests/Feature/TraitHasUserstampsTest.php | satu ekspektasi not->toThrow | pencegahan 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-486
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-537
Tabel test_products dibersihkan lewat afterEach dengan Schema::dropIfExists, pola yang perlu ditiru ketika menambah test berbasis schema baru. tests/Feature/UserstampsColumnsTest.php:7-98
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-79
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-1710
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-2511
Cakupan sumber untuk laporan coverage dibatasi ke direktori ./src. phpunit.xml.dist:26-3012
⚠️ Nama
VendorName Test Suiteadalah 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-1113
Konfigurasi juga menyertakan phpstan-baseline.neon sebagai berkas includes. phpstan.neon.dist:1-214
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-1515
Workflow GitHub Actions
| Workflow | Berkas | Trigger | Job | Perintah penentu |
|---|---|---|---|---|
run-tests | .github/workflows/run-tests.yml | push pada **.php, workflow itu sendiri, phpunit.xml.dist, composer.json, composer.lock | test | vendor/bin/pest --ci |
PHPStan | .github/workflows/phpstan.yml | push pada **.php, phpstan.neon.dist, workflow itu sendiri | phpstan | ./vendor/bin/phpstan --error-format=github |
Fix PHP code style issues | .github/workflows/fix-php-code-style-issues.yml | push pada **.php | php-code-styling | aglipanci/[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-1416
Matriks job test berisi empat dimensi, ditambah pemetaan Testbench per versi Laravel:
| Dimensi | Nilai |
|---|---|
os | ubuntu-latest, windows-latest |
php | 8.4, 8.3 |
laravel | 12.*, 11.* |
stability | prefer-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-3117
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-6018
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-5419
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-6020
Workflow PHPStan hanya berjalan di ubuntu-latest dengan timeout-minutes: 5, PHP 8.4, dan coverage: none. .github/workflows/phpstan.yml:10-1421
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-2822
Trigger kedua workflow juga dibatasi daftar path: perubahan pada **.php serta berkas konfigurasi terkait saja yang memicu run. .github/workflows/phpstan.yml:3-823
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.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-3117
⚠️ Kedua workflow hanya bereaksi pada
push; tidak ada triggerpull request. Pemeriksaan karena itu tidak otomatis berjalan pada PR, terutama PR dari fork. .github/workflows/run-tests.yml:3-1024 dan .github/workflows/phpstan.yml:3-823
⚠️ Matriks
run-testsberhenti di Laravel11.*dan12.*, sedangkanrequiremasih mengizinkanilluminate/contracts^13.0. Kombinasi Laravel 13 belum tercakup matriks. composer.json:25-2925 dan .github/workflows/run-tests.yml:16-3117
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-611
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-2826
⚠️ Workflow ini menulis ke branch, bukan hanya memeriksa. Izin
contents: writedan 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-2826
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.