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() di tearDown().
  • Gunakan Seeder terkontrol 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.php dapat 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:

  1. Smoke test segera setelah build lulus (unit + beberapa integration penting) agar masalah fatal terdeteksi lebih awal.
  2. Regression suite yang lebih lengkap setelah merge atau nightly build, mencakup semua integration dan contract.
  3. 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 contract serta 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 wrapper php 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.