Recraftory

Integration Test

Menguji interaksi antar komponen dalam aplikasi

Apa itu Integration Test

  • Menguji bagaimana beberapa modul bekerja sama
  • Memverifikasi integrasi antar komponen berjalan benar
  • Melibatkan database, API, atau service eksternal secara terbatas

Perbedaan Unit Test dan Integration Test

Unit Test

  • Mengisolasi satu unit kode
  • Semua dependensi di-mock
  • Sangat cepat dan deterministik

Integration Test

  • Menguji alur lengkap antar modul
  • Menggunakan dependensi nyata atau test database
  • Lebih lambat karena melibatkan I/O

Jenis Integration Test

Database Integration

  • Menguji repository atau DAO dengan database nyata
  • Menggunakan test database atau in-memory database
  • Memastikan query berjalan benar dan data tersimpan dengan benar

API Integration

  • Menguji endpoint dengan request dan response nyata
  • Memverifikasi routing, middleware, dan response format
  • Bisa menggunakan supertest untuk HTTP request

Service Integration

  • Menguji komunikasi antar service atau modul
  • Memastikan kontrak antar service dipenuhi
  • Contoh: service A mengirim data ke service B dengan format yang benar

Contoh Integration Test API

it('harus membuat user baru dan mengembalikan 201', async () => {
  const response = await request(app)
    .post('/api/users')
    .send({ nama: 'Andi', email: 'andi@email.com' });

  expect(response.status).toBe(201);
  expect(response.body).toHaveProperty('id');
  expect(response.body.nama).toBe('Andi');
});

Test Database

  • Gunakan database terpisah untuk test
  • Reset data sebelum setiap test
  • Gunakan transaksi dan rollback untuk menjaga isolasi
  • In-memory database seperti SQLite bisa digunakan untuk kecepatan

Setup dan Teardown

  • beforeAll — dijalankan sekali sebelum semua test
  • beforeEach — dijalankan sebelum setiap test
  • afterEach — dijalankan setelah setiap test
  • afterAll — dijalankan sekali setelah semua test selesai

Praktik Terbaik

  • Integration test lebih sedikit dari unit test
  • Fokus pada alur kritis yang melibatkan banyak komponen
  • Gunakan test database, jangan test di database production
  • Bersihkan data setelah test selesai
  • Isolasi antar test untuk menghindari side effect