Smoke Test dan Synthetic Transaction: Memastikan Deployment Benar-Benar Berfungsi

Anda baru saja melihat pipeline berubah menjadi hijau. Unit test lulus, integration test lulus, bahkan end-to-end test pun bersih. Anda menekan tombol deploy, progress bar terisi penuh, dan pipeline melaporkan sukses. Tapi inilah kebenaran yang tidak nyaman: tidak satu pun dari tes tersebut berjalan di lingkungan produksi yang sesungguhnya. Semua tes berjalan di tempat lain — runner CI, server staging, atau mesin lokal. Begitu aplikasi Anda mendarat di infrastruktur nyata, semuanya masih bisa rusak.

Inilah mengapa smoke test dan synthetic transaction ada. Keduanya bukan pengganti rangkaian tes yang sudah Anda miliki. Keduanya adalah lapisan terpisah yang menjawab pertanyaan berbeda: bukan "apakah kode benar?" melainkan "apakah deployment benar-benar berhasil?"

Pemeriksaan Paling Sederhana: Smoke Test

Smoke test adalah hal paling dasar yang bisa Anda lakukan setelah deployment. Ia menjawab satu pertanyaan: apakah aplikasi hidup dan merespons?

Anggap saja seperti menyalakan rak server baru di pusat data. Sebelum menjalankan beban kerja serius, Anda memeriksa lampu daya menyala, kipas berputar, dan Anda bisa melakukan ping ke antarmuka manajemen. Anda tidak menjalankan benchmark penuh. Anda hanya memastikan perangkat menyala.

Untuk aplikasi web, smoke test bisa berupa satu permintaan HTTP ke endpoint health check. Untuk layanan backend, bisa berupa memeriksa apakah proses berjalan dan mendengarkan di port yang diharapkan. Untuk aplikasi seluler, bisa berarti memverifikasi bahwa aplikasi terbuka tanpa crash di perangkat nyata.

Karakteristik utama smoke test yang baik adalah kecepatan dan kesederhanaan. Ia harus selesai dalam hitungan detik, bukan menit. Ia tidak boleh bergantung pada logika bisnis yang kompleks atau sistem eksternal yang mungkin tidak tersedia sementara. Jika smoke test Anda membutuhkan koneksi database, server cache, dan tiga API pihak ketiga, itu bukan lagi smoke test — itu sesuatu yang lain sama sekali.

Berikut adalah contoh praktis smoke test dan synthetic transaction dalam bash:

# Smoke test: pemeriksaan kesehatan cepat
curl -f -s -o /dev/null http://myapp.com/health || exit 1

echo "Smoke test passed"

# Synthetic transaction: simulasi login dan pencarian pengguna
#!/bin/bash
set -e

BASE="http://myapp.com"

# Langkah 1: Muat halaman login
curl -s -o /dev/null -w "%{http_code}" "$BASE/login" | grep -q 200 || exit 1

# Langkah 2: Kirim form login (simulasi)
curl -s -c /tmp/cookies.txt -b /tmp/cookies.txt \
  -d "username=testuser&password=testpass" \
  -o /dev/null -w "%{http_code}" "$BASE/login" | grep -q 302 || exit 1

# Langkah 3: Cari produk
curl -s -b /tmp/cookies.txt "$BASE/search?q=laptop" | grep -q "results" || exit 1

echo "Synthetic transaction passed"

Tempatkan smoke test sebagai langkah pertama setelah deployment, sebelum lalu lintas diarahkan ke versi baru. Jika smoke test gagal, pipeline harus berhenti segera. Jangan lanjutkan ke pemeriksaan yang lebih dalam. Jangan arahkan lalu lintas pengguna. Deployment gagal pada level paling dasar, dan tidak ada hal lain yang penting sampai masalah itu terselesaikan.

Lebih Dalam: Synthetic Transaction

Synthetic transaction membawa verifikasi satu langkah lebih jauh. Alih-alih hanya memeriksa apakah aplikasi hidup, ia mensimulasikan perilaku pengguna nyata. Ia berjalan melalui jalur kritis aplikasi Anda seperti yang dilakukan pengguna sungguhan, tetapi berjalan secara otomatis, dipicu oleh pipeline.

Bayangkan aplikasi e-commerce. Sebuah synthetic transaction mungkin:

  1. Membuka halaman utama
  2. Mencari produk
  3. Menambahkan produk ke keranjang
  4. Melanjutkan ke checkout
  5. Menyelesaikan alur pembelian

Setiap langkah memeriksa bahwa respons benar, halaman dimuat dengan baik, keranjang benar-benar berisi item yang tepat, dan konfirmasi pesanan muncul. Jika ada langkah yang gagal, synthetic transaction gagal.

Synthetic transaction lebih mahal daripada smoke test. Mereka membutuhkan waktu lebih lama untuk berjalan — seringkali beberapa menit, bukan detik. Mereka bergantung pada lebih banyak bagian sistem yang berfungsi dengan benar. Tapi mereka menangkap masalah yang tidak bisa ditangkap oleh smoke test.

Skenario umum: smoke test lulus karena endpoint health check mengembalikan 200 OK. Tapi halaman login mengembalikan error 500 karena file konfigurasi tidak disalin dengan benar selama deployment. Smoke test tidak pernah memeriksa halaman login. Synthetic transaction akan segera menangkapnya.

Di Mana Mereka Cocok dalam Pipeline Anda

Smoke test dan synthetic transaction memiliki tujuan berbeda dan harus muncul di tahap yang berbeda dalam pipeline deployment Anda.

Smoke test ditempatkan pertama, segera setelah deployment selesai. Ia adalah penjaga gerbang Anda. Jika aplikasi bahkan tidak berjalan, tidak ada gunanya menjalankan hal lain. Pipeline harus gagal cepat dan berhenti.

Synthetic transaction berjalan setelah smoke test lulus. Ia adalah verifikasi yang lebih dalam sebelum lalu lintas pengguna tiba. Jika synthetic transaction gagal, Anda masih punya waktu untuk menghentikan deployment sebelum pengguna menemukan masalah.

Dalam praktiknya, Anda tidak perlu banyak synthetic transaction. Dua hingga lima skenario yang mencakup perjalanan pengguna paling kritis biasanya sudah cukup. Tujuannya bukan pengujian menyeluruh — Anda sudah melakukannya sebelum deployment. Tujuannya adalah untuk memastikan bahwa deployment itu sendiri tidak merusak apa pun.

Apa yang Ditangkap Tes Ini yang Tidak Ditangkap Tes Lain

Tes pra-deployment berjalan di lingkungan yang terkontrol. Mereka menggunakan database pengujian, layanan tiruan, dan file konfigurasi yang mungkin berbeda dari produksi. Bahkan dengan lingkungan staging yang mirip dengan produksi, perbedaan tetap ada.

Smoke test dan synthetic transaction berjalan di lingkungan produksi yang sesungguhnya. Mereka menangkap masalah yang hanya muncul di sana:

  • Perbedaan konfigurasi lingkungan antara staging dan produksi
  • Dependensi yang hilang atau versi yang salah di produksi
  • Masalah izin yang hanya ada di akun atau cluster produksi
  • Kebijakan jaringan yang memblokir lalu lintas yang sah
  • Masalah sertifikat SSL
  • Konfigurasi load balancer yang salah
  • Kehabisan koneksi pool database dalam kondisi nyata

Ini bukan masalah teoretis. Mereka terjadi secara teratur di tim dari berbagai ukuran. Nilai konfigurasi yang berfungsi sempurna di staging tetapi memiliki typo di produksi. Secret yang dirotasi di staging tetapi tidak di produksi. Aturan firewall yang memblokir port layanan baru. Masalah-masalah ini tidak akan pernah tertangkap oleh tes pra-deployment karena tes tersebut tidak berjalan di lingkungan nyata.

Daftar Periksa Praktis

Saat mengimplementasikan smoke test dan synthetic transaction untuk pipeline Anda, ingatlah poin-poin ini:

  • Jaga smoke test di bawah 10 detik. Jika lebih lama, sederhanakan.
  • Tempatkan smoke test segera setelah deployment, sebelum routing lalu lintas.
  • Gagalkan pipeline jika smoke test gagal. Jangan lanjutkan.
  • Jalankan synthetic transaction setelah smoke test lulus, sebelum pemindahan lalu lintas penuh.
  • Batasi synthetic transaction hingga 2-5 perjalanan pengguna kritis.
  • Jangan gunakan synthetic transaction untuk pengujian menyeluruh. Itu tugas tes pra-deployment Anda.
  • Pantau hasil synthetic transaction dari waktu ke waktu. Pola kegagalan intermiten dapat mengindikasikan masalah mendasar.
  • Pastikan synthetic transaction berjalan di lingkungan produksi yang sesungguhnya, bukan replika staging.

Intisari Konkret

Tes pra-deployment Anda memverifikasi bahwa kode Anda benar. Smoke test dan synthetic transaction Anda memverifikasi bahwa deployment Anda berhasil. Keduanya bukan hal yang sama, dan satu tidak bisa menggantikan yang lain. Pipeline hijau berarti kode Anda lulus semua pemeriksaan di lingkungan terkontrol. Smoke test yang berhasil berarti aplikasi Anda benar-benar berjalan di produksi. Synthetic transaction yang lulus berarti pengguna Anda dapat menyelesaikan tugas terpenting mereka. Tambahkan keduanya ke pipeline deployment Anda, dan Anda akan menangkap masalah yang hanya muncul saat kode bertemu kenyataan.