Flaky test di pipeline CI merusak kepercayaan terhadap pengujian otomatis dan menyulitkan tim mendeteksi regresi. Artikel ini langsung menjelaskan langkah konkret untuk membangun strategi test Laravel yang menangani flaky behavior, menyediakan subset regression suite selektif, dan menyiapkan verifikasi pasca-rollback agar regresi cepat terisolasi.
Memahami flaky test dan dampaknya
Flaky test biasanya muncul karena ketergantungan terhadap waktu, state global, atau layanan eksternal yang tidak stabil. Di pipeline CI, flaky test menyebabkan build gagal tanpa korelasi perubahan kode terbaru. Untuk mencegahnya, mulai dengan kategorisasi kegagalan: apakah error berasal dari timeout, race condition, atau environment non-deterministic?
Mengidentifikasi karakteristik flaky memungkinkan kita menentukan mitigasi nyata seperti memperketat batas waktu, mengisolasi state, atau menggunakan stub untuk dependency. Tanpa pemahaman ini, perbaikan hanya akan menutupi gejala dan bukan akar masalah.
Menyiapkan lingkungan data deterministik
Database dan state yang stabil
Gunakan transaksi database per pengujian agar setiap test rollback otomatis setelah selesai. Dalam Laravel, trait RefreshDatabase sudah menangani ini. Namun dalam pipeline paralel perlu menyiapkan connection string unik per worker, misalnya:
DB_CONNECTION=mysql_testing_1; php artisan test --parallel --processes=4
Pastikan migrasi dijalankan sekali sebelum suite utama dan fixture data dimuat dengan seeder deterministik. Hindari data random dengan timestamp dinamis; gunakan factory dengan nilai tetap bila perlu.
Menjadi deterministik terhadap external service
Stub service eksternal dengan HTTP fake (misalnya Http::fake()) atau queue fake agar tidak ada request keluar. Jika test perlu memverifikasi header request, gunakan spy data 3rd-party sehingga hasilnya dapat diulang tanpa bergantung pada network.
Orkestrasi test dengan Pest atau PHPUnit dalam CI
Tentukan command test yang spesifik untuk pipeline CI. Misalnya, gunakan Pest untuk readability dan tagging:
// tests/Feature/OrderFlowTest.php
it('memproses order sukses', function () {
$order = Order::factory()->create();
// Arrange: stub payment gateway
Http::fake(['payment.example.com' => Http::response(['status' => 'ok'], 200)]);
// Act
$response = $this->postJson('/orders', ['id' => $order->id]);
// Assert
$response->assertOk();
});
Di CI, jalankan command yang memfilter test stabil dan relevan:
vendor/bin/pest --group=ci --min=5
Sertakan opsi seperti --min untuk memastikan observability threshold dan --group agar hanya test yang ditandai sebagai cocok dijalankan di pipeline utama.
Untuk PHPUnit, buat phpunit.ci.xml dengan test suite terbatas yang hanya memuat test kritikal perubahan backend dan API. Pastikan file konfigurasi mematikan listener resource-intensive yang bisa menambah flaky behavior.
Strategi subset regression suite dan parallel execution
Regression suite tidak harus dijalankan penuh setiap perubahan. Gunakan tagging dan metadata test untuk menentukan subset berdasarkan area yang terdampak. Misalnya:
- Regression cortical: Tes end-to-end untuk critical checkout flow.
- Regression fast: Tes unit dan integration paling cepat.
CI dapat memicu running subset berdasarkan path yang diubah. Contoh pipeline detail:
- Identifikasi module dari diff (misalnya
app/Services/Payment). - Jika module termasuk payment, jalankan suite
regression:payment. - Lainnya hanya menjalankan
regression:fast.
Parallel execution membantu menekan waktu, namun pastikan observability saat kegagalan: simpan artifact log per worker, dan tetapkan ID run yang sama pada log aplikasi dan pipeline. Gunakan Laravel Telescope atau logging custom untuk melampirkan CI_RUN_ID.
Meningkatkan observability dan debugging regresi
Flaky test bisa sulit di-debug tanpa konteks tambahan. Tambahkan state dump, event listener, dan snapshot database ketika test gagal. Contoh pendekatan:
- Aktifkan logging khusus dalam
setUp()untuk menandai waktu request dan queue job. - Jika pipeline memisahkan job queue, jalankan worker lokal dalam mode
--onceagar outputnya tersedia langsung. - Unggah artifact like log/Telescope snapshot tiap kegagalan ke CI agar tidak hilang.
Gunakan tool observability seperti Sentry untuk mengaitkan exception dengan test case. Pastikan konfigurasi environment test memposting data yang cukup tanpa membocorkan credential.
Verifikasi pasca-rollback dan continuous feedback
Ketika rollback dikenakan akibat regresi, otomatis jalankan regression suite terbatas yang menyasar area yang bermasalah sebelumnya. Papan tugas CI dapat mencatat versi release terakhir yang gagal untuk memicu perbandingan.
Misalnya, setelah rollback checkout, jalankan test yang mencakup:
- Integrasi order-payment queue.
- Validasi response API eksternal.
- Konfirmasi event dispatch ke listener.
Jika regression terdeteksi lagi, segera kirim laporan dengan log artifact dan hasil test ke tim. Dengan observability memadai, waktu untuk mengunci penyebab regresi bisa berkurang drastis.
Kesimpulan
Strategi test Laravel untuk flaky CI hanya efektif jika lingkungan data stabil, orchestrasi test jelas, regression suite selektif, dan observability mendalam. Lengkapi dengan verifikasi pasca-rollback untuk memastikan regresi tak terulang. Pendekatan ini membantu tim menjaga kepercayaan terhadap pipeline sambil menjaga cakupan dan kecepatan deliver.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!