BAB 22 / VERSI SEDERHANA

Cicipi sebelum buka pintu.

Kuka belajar menjaga rasa makanan sebelum restoran menerima tamu. Ia mencicipi bahan, hidangan, dan perjalanan pesanan supaya kesalahan ditemukan di dapur, bukan setelah keluhan datang.

Untuk pemula 9 bagian Versi Teknis

Masalah sehari-hari

Restoran bisa terlihat baik saat dapur sepi. Kesalahan baru muncul ketika pesanan datang berturut-turut. Garam terlalu banyak, pembayaran tidak tercatat, atau pintu pesanan macet.

Tes menjalankan pemeriksaan sebelum kode dipakai tamu. Menangkap rasa asin di dapur lebih murah daripada menunggu keluhan di ruang makan. Tes juga memberi tanda saat resep baru merusak rasa lama.

01
Kuka mencicipi kuah sebelum pintu dibuka. Ia menemukan rasa terlalu asin, memperbaikinya, lalu menyajikan hidangan yang aman.

Analogi Kuka

Kuka menata beberapa mangkuk uji di meja dapur. Setiap mangkuk punya pertanyaan kecil. Gula terasa manis? Kuah terasa pas? Pesanan bisa berjalan dari pintu sampai pembayaran?

Ia tidak menunggu tamu menjadi pemeriksa. Kuka mencicipi bahan sendiri, mencicipi hidangan utuh, lalu sesekali mengikuti seluruh perjalanan seperti tamu biasa.

Peta istilah dapur

Cicipan bahan adalah unit test. Cicipan hidangan utuh adalah integration test. Cicipan dari pintu depan sampai bayar adalah end-to-end test. Dapur adalah kode aplikasi, sedangkan hasil cicip adalah bukti perilakunya.

Ilustrasi

Kuka mencicipi dari sendok kecil di depan banyak mangkuk uji yang tersusun, dengan wajah berpikir.
Kuka menguji rasa.

Banyak cicipan kecil menjaga dapur tetap tenang. Kuka dapat mengulang satu cicipan tanpa memasak seluruh menu. Tes menjadi kebiasaan sebelum hidangan dibawa keluar.

Penjelasan konsep

Tes otomatis adalah pertanyaan yang dijalankan mesin. Kode menyiapkan keadaan, menjalankan perilaku, lalu membandingkan hasil dengan harapan. Jika hasil berbeda, tes gagal dan perubahan perlu diperiksa.

Piramida pengujian menaruh banyak cicipan murah di bawah. Unit test cepat dan jumlahnya banyak. Integration test lebih sedikit karena beberapa bagian bekerja bersama. End-to-end test paling mirip pengalaman tamu, tetapi paling lambat dan mahal.

Tumpukan mangkuk membentuk piramida pengujian, banyak mangkuk di bawah dan satu mangkuk di puncak.
Piramida cicipan.

Anatomi sebuah tes sederhana. Siapkan bahan dan keadaan awal. Jalankan tindakan yang diuji. Cicipi hasilnya. Putuskan lulus atau gagal. Pola ini sering disebut arrange, act, assert.

unit test mencicipi satu bagian kecil secara terpisah. Misalnya, fungsi penghitung total harus menjumlahkan dua harga dengan benar. Cicipan ini cepat karena tidak perlu database atau jaringan.

integrasi berarti integration test yang mencicipi beberapa bagian yang sudah tersambung. Handler menerima request, service mengolahnya, lalu database menyimpan hasilnya. Tes ini menemukan masalah yang tidak terlihat saat tiap bagian dicicipi sendiri.

Test double

Test double adalah bahan pengganti untuk latihan. Mock dapat mengembalikan rasa yang sudah diatur atau mencatat apakah ia dipanggil. Pengganti membuat tes lebih fokus dan tidak menghabiskan stok sungguhan.

Dependency injection

Dependency injection memberi celah untuk memasang bahan atau service yang berbeda. Kode produksi memakai database sungguhan. Tes dapat memasang pengganti tanpa membongkar dapur.

Table-driven testing

Table-driven testing menyimpan banyak kasus dalam satu daftar. Setiap baris berisi bahan, tindakan, dan hasil yang diharapkan. Mesin menjalankan baris itu satu per satu.

Database nyata

Integration test kadang memakai database nyata dalam ruang kecil dan bersih. Cara ini menguji query serta aturan penyimpanan yang tidak dapat ditiru sempurna oleh pengganti.

HTTP handler dan API

HTTP handler adalah pelayan di pintu depan. Tes mengirim request ke API, memeriksa status code, lalu melihat bentuk response. Ia memastikan pesan yang keluar sesuai janji.

Tes end-to-end

End-to-end test menyewa tamu tiruan. Tamu masuk dari pintu depan, memesan, makan, dan membayar. Tes ini lambat, tetapi paling dekat dengan kenyataan.

Test coverage

coverage adalah peta bagian kode yang sudah dilewati tes. Peta luas belum menjamin rasa benar. Tes tetap harus memeriksa perilaku penting, bukan sekadar mengejar angka.

Tes flaky

Flaky test kadang lulus dan kadang gagal tanpa perubahan kode. Cicipan seperti ini tidak dapat dipercaya. Cari ketergantungan pada waktu, urutan, jaringan, atau state yang belum dibersihkan.

Satu mangkuk berubah-ubah isinya, dengan dua wajah cicip berbeda di sisinya dan Kuka menggeleng.
Cicipan berubah-ubah.
Fixture dan factory

Fixture adalah bahan siap pakai yang selalu disiapkan dengan cara sama. Factory membuat variasi bahan sesuai kebutuhan kasus. Keduanya mengurangi persiapan yang berulang.

TDD: red, green, refactor

TDD dimulai dari tes yang gagal. Kuka menulis rasa yang diharapkan, memastikan cicipan gagal, lalu memasak sampai lulus. Setelah itu ia merapikan resep tanpa mengubah rasa.

Mocking waktu dan keacakan

Jam dan dadu palsu membuat hasil tes dapat diulang. Tes dapat menetapkan waktu tertentu atau urutan acak tertentu, lalu memeriksa perilaku dengan kondisi yang sama.

Performance dan load testing

Load testing meniru jam sibuk. Banyak tamu datang bersamaan dan sistem harus tetap merespons. Tes ini mencari batas dapur sebelum batas itu dicapai tamu nyata.

Tes di CI/CD

CI/CD menjalankan tes setiap resep baru dikirim. Perubahan yang gagal berhenti di cabang dan belum boleh disajikan. Dapur mendapat pemeriksaan yang konsisten.

Diagram alur

Alur cicipan saat resep berubah Cicipan yang gagal dimasak sampai lulus, resep dirapikan, lalu semua cicipan diulang saat resep berubah. cicipan gagal temukan rasa salah masak sampai lulus perbaiki resep rapikan kode lebih jelas resep berubah? jalankan lagi cicip ulang semua aman dibuka ulang sampai rasa tetap benar

Cicipan yang gagal memberi petunjuk. Kuka memperbaiki resep sampai lulus, lalu merapikan kode. Saat resep berubah, ia mencicipi ulang semua bagian yang perlu dijaga.

Contoh mini

06
Cicip gula: manis, lulus
Cicip kuah: asin, gagal
Dapur: perbaiki rasa
Cicip kuah lagi: lulus

Kartu pos ini mencatat satu putaran pendek. Tes menunjukkan masalah sebelum kuah diberikan kepada tamu. Kuka bisa memperbaiki dapur dengan bukti yang jelas.

Ringkasan

  • Tes menemukan kesalahan di dapur sebelum tamu menemukan masalahnya.
  • Piramida punya banyak unit test, lebih sedikit integration test, dan sangat sedikit end-to-end test.
  • Anatomi tes menyiapkan keadaan, menjalankan tindakan, lalu membandingkan hasil.
  • Unit test cepat karena mencicipi satu bagian kecil secara terpisah.
  • Integration test memeriksa beberapa bagian yang bekerja bersama.
  • Test double, fixture, factory, dan dependency injection membantu membuat cicipan terarah.
  • Flaky test harus dicari penyebabnya karena hasilnya tidak konsisten.
  • Tes di CI/CD menjaga resep baru melewati pemeriksaan sebelum disajikan.

Pertanyaan pemahaman

  1. Kenapa menangkap rasa asin di dapur lebih baik daripada dari keluhan tamu?
  2. Apa beda mencicip bahan (unit) dan mencicip hidangan utuh (integrasi)?
  3. Kenapa piramida: banyak cicipan murah, sedikit cicipan mahal?

Mau lebih dalam

Versi teknis membahas pola tes, contoh kode, dan cara menjalankan pemeriksaan di proyek backend.

Disinggung sekilas

Belum dibahas di sini

Crib-sheet dan daftar perintah lengkap ada di versi teknis.