Strategi pengujian integrasi API di CodeIgniter 4 harus menutup celah antara unit dan kontrak luar, sekaligus mendeteksi regresi tanpa menghasilkan flaky test. Di artikel ini, kita akan langsung fokus pada struktur suite (unit, integration, contract), isolasi dependensi database, teknik mocking layanan eksternal, serta penerapan CI/CD yang menjamin verifikasi otomatis dan metrik keandalan seperti flaky rate dan MTTR.
1. Memetakan Suite Unit, Integrasi, dan Kontrak
Pengujian API tidak cukup hanya menjalankan satu jenis suite. Pembagian yang jelas membantu menjaga prioritas. Gunakan:
- Unit: untuk logika internal controller/model tanpa hit langsung ke layanan lain.
- Integration: untuk endpoint API yang menyertakan autentikasi, layer layanan, dan database lokal.
- Contract: untuk memastikan API internal/eksternal sesuai spesifikasi (misalnya OpenAPI atau schema) dan kompatibel dengan klien.
Gunakan fitur grup phpunit di CodeIgniter 4 untuk mengelompokkan suite, misalnya @group integration. Pastikan phpunit.xml mendefinisikan suite sehingga pipeline bisa mengeksekusi sesuai level.
<phpunit bootstrap="vendor/autoload.php" colors="true" verbose="true">
<testsuites>
<testsuite name="integration">
<directory suffix="Test.php">./tests/integration</directory>
</testsuite>
</testsuites>
<groups>
<include><group>integration</group></include>
</groups>
</phpunit>
Gunakan CodeIgniter\Test\FeatureTestCase untuk suite integrasi karena helper ini menyiapkan request dan response layaknya HTTP nyata.
2. Isolasi Database untuk Hindari Efek Samping
Flaky test sering muncul karena data yang berubah dari test lain. Sertakan langkah-langkah berikut:
- Aktifkan DatabaseFixtureTrait atau jalankan transaksi per test dengan
$this->db->transStart()lalu$this->db->transRollback()ditearDown(). - Gunakan
Seederterkontrol atau factory untuk data persyaratan, jangan hardcode data yang dapat berubah. - Jika menggunakan migrasi, jalankan sekali di pipeline global untuk memastikan struktur konsisten tanpa mengulang setiap test.
Contoh implementasi transaksi:
protected function setUp(): void
{
parent::setUp();
$this->db->transStart();
}
protected function tearDown(): void
{
$this->db->transRollback();
parent::tearDown();
}
Cara ini menjaga database tetap bersih dan mencegah test tergantung urutan.
3. Mocking dan Stubbing Layanan Eksternal
Integrasi API sering bergantung pada layanan luar (email, pembayaran, queue). Untuk menghindari ketergantungan nyata:
- Gunakan dependency injection untuk service client agar bisa digantikan dengan double.
- Di test integrasi, file
Config/Services.phpdapat di-override untuk mengembalikan stub yang merekam panggilan. - Berikan parameter timeout pendek, lalu pantau log ketika stub memunculkan perilaku tak terduga.
Sebuah helper stub sederhana:
class PaymentStub implements PaymentGatewayInterface
{
public function charge(array $payload)
{
return [
'status' => 'success',
'transaction_id' => 'stubbed-'.uniqid()
];
}
}
Daftarkan stub ini di environment testing agar tidak terhubung ke API nyata. Ini menjaga deterministik dan mempercepat suite.
4. Pipeline CI/CD yang Menjaga Keandalan
Jangan hanya mengandalkan pengujian lokal. Susun pipeline untuk menjalankan:
- Smoke test segera setelah build lulus (unit + beberapa integration penting) agar masalah fatal terdeteksi lebih awal.
- Regression suite yang lebih lengkap setelah merge atau nightly build, mencakup semua integration dan contract.
- Contract verification ketika ada perubahan spesifikasi API internal/eksternal.
Masukkan langkah-langkah ini ke pipeline seperti GitHub Actions atau GitLab CI. Contoh tahap:
- stage: test → jalankan composer install, migrations, lalu
php spark test --group integration. - stage: verify → jalankan contract check dengan
php spark test --group contractserta lint.
Gunakan artifacts untuk menyimpan laporan phpunit dan coverage, sehingga tim bisa menganalisis flaky test.
5. Metrik Keandalan dan Monitoring Flaky
Untuk memastikan strategimu bekerja, pantau metrik berikut:
- Flaky rate: persentase build yang gagal tanpa perubahan kode relevan. Jika tinggi, telusuri test yang gagal berulang serta cari dependensi global.
- MTTR (Mean Time To Recover): waktu rata-rata untuk memperbaiki test rusak. Catat dan tinjau setiap insiden.
Tambahkan badge atau dashboard di repo untuk memperlihatkan tren ini. Jika menunjukkan peningkatan, audit isolation, data setup, dan mocking.
6. Debugging dan Praktik Terbaik
Ketika menemukan flaky test, lakukan:
- Log setiap perubahan state di database dan service stub yang digunakan.
- Jalankan test secara berulang dengan
phpunit --repeat 20(atau wrapperphp spark test) untuk melihat pola. - Pastikan environment CI menggunakan konfigurasi test yang sama seperti lokal (encryption key, environment variables) agar tidak ada gap.
Kerangka kerja CodeIgniter 4 mendukung helper CLI dan spark test; manfaatkan untuk mempercepat debugging.
Kesimpulan
Dengan struktur suite yang tersegmentasi, isolasi database, mocking layanan eksternal, serta pipeline yang menjalankan smoke dan regression secara terjadwal, Anda memperkecil risiko flaky test di pengujian integrasi API CodeIgniter 4. Pantau metrik seperti flaky rate dan MTTR untuk memastikan regresi cepat terdeteksi dan diperbaiki.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!