Apa yang Sebenarnya Perlu Dicapai oleh Pengujian dalam Pipeline
Setiap kali seorang developer mendorong kode, ada satu pertanyaan yang perlu dijawab: apakah perubahan ini aman digunakan? Pengujian dalam pipeline ada untuk menjawab pertanyaan itu. Bukan sekadar menjalankan tes demi tes. Bukan untuk mengejar coverage 100%. Tapi untuk memberikan keyakinan bahwa perubahan tersebut bisa lanjut ke tahap berikutnya tanpa merusak sesuatu yang sudah berjalan.
Keyakinan itu penting karena pipeline berjalan secara otomatis. Begitu perubahan masuk, pipeline memprosesnya tanpa menunggu persetujuan manual di setiap langkah. Tanpa mekanisme untuk memeriksa apakah perubahan itu aman, risiko kerusakan akan terbawa hingga ke produksi. Pengujian dalam pipeline bertindak sebagai filter: perubahan yang gagal tes berhenti di situ, dan perubahan yang lolos terus melaju.
Namun, tidak semua tes cocok ditempatkan di dalam pipeline. Beberapa tes lebih baik dijalankan di luar pipeline. Eksplorasi manual yang dilakukan QA untuk menemukan skenario yang tidak terpikirkan siapa pun. Pengujian performa skala besar yang memakan waktu berjam-jam dan membutuhkan infrastruktur khusus. Tes-tes itu penting, tetapi tidak cocok berada di jalur cepat pipeline karena akan memperlambat umpan balik ke developer. Pipeline membutuhkan tes yang cepat, deterministik, dan cukup andal untuk mengambil keputusan secara otomatis.
Untuk Apa Sebenarnya Pengujian dalam Pipeline?
Tujuannya bukan untuk menangkap setiap bug. Itu tidak mungkin. Tujuannya adalah menangkap bug yang penting sebelum mencapai pengguna. Rangkaian tes dalam pipeline adalah jaring pengaman, bukan baju besi lengkap. Ia harus dirancang untuk menyaring perubahan yang akan menyebabkan kerusakan nyata di produksi.
Coba pikirkan begini. Seorang developer mengubah logika pembayaran. Jika perubahan itu rusak, pengguna kehilangan uang, tiket dukungan membanjir, dan bisnis terkena dampak. Pipeline harus menangkap itu. Seorang developer memperbaiki typo di halaman error yang jarang dilihat orang. Jika perubahan itu rusak, tidak ada dampak berarti. Pipeline tidak perlu menjalankan rangkaian regresi penuh untuk itu.
Inilah ide inti di balik pengujian berbasis risiko dalam pipeline. Versi sederhananya: bagian mana dari sistem yang paling mungkin rusak, dan jika rusak, apa dampaknya? Bagian yang sering berubah. Bagian yang merupakan jalur bisnis kritis. Bagian yang sulit dideteksi masalahnya secara manual. Bagian-bagian itulah yang perlu mendapat perhatian lebih dari pengujian pipeline.
Cara Memutuskan Tes Mana yang Masuk ke Pipeline
Mulailah dari risiko. Bukan dari tes apa yang sudah ada. Bukan dari apa yang dianggap standar oleh tim pengujian. Mulailah dari apa yang akan terasa sakit jika rusak.
Untuk sistem pembayaran, pipeline membutuhkan tes yang memverifikasi logika pembayaran secara mendalam. Untuk halaman profil pengguna, pemeriksaan yang lebih ringan sudah cukup. Untuk migrasi basis data yang mengubah tipe kolom, pipeline perlu memverifikasi bahwa data yang ada masih berfungsi dan aplikasi menangani tipe baru dengan benar. Untuk perubahan warna tombol UI, pemeriksaan regresi visual mungkin berlebihan kecuali tombol tersebut bagian dari alur kritis.
Pendekatan ini berarti Anda tidak menjalankan setiap tes untuk setiap perubahan. Anda memprioritaskan berdasarkan risiko dari perubahan yang dikirimkan. Itu adalah keputusan praktis, bukan teoretis. Ini menghemat waktu, mengurangi durasi pipeline, dan menjaga umpan balik tetap cepat.
Gerbang Keyakinan: Apa yang Sebenarnya Dihasilkan oleh Tes
Keluaran dari pengujian pipeline adalah bukti. Bukti itu digunakan untuk memutuskan apakah suatu perubahan dapat lanjut ke tahap berikutnya, misalnya dari staging ke produksi. Mekanisme ini sering disebut gerbang keyakinan (confidence gate).
Jika tes di suatu tahap gagal, gerbang tetap tertutup. Perubahan berhenti. Jika tes lolos, gerbang terbuka dan perubahan melaju. Semakin tinggi risiko, semakin ketat gerbang yang diperlukan. Perubahan berisiko rendah mungkin hanya perlu unit test dan smoke test cepat. Perubahan berisiko tinggi mungkin perlu unit test, integration test, pemindaian keamanan, dan langkah verifikasi manual.
Gerbang bukan tentang kesempurnaan. Ini tentang cukup baik untuk menangkap masalah yang penting sebelum mencapai pengguna. Pipeline yang memblokir setiap perubahan untuk setiap kemungkinan masalah akan memblokir semuanya. Tidak ada yang dirilis. Pipeline yang membiarkan semuanya lewat akan terus-menerus merusak produksi. Keseimbangannya ada pada desain gerbang.
Berikut adalah contoh sederhana bagaimana gerbang keyakinan mungkin terlihat dalam konfigurasi CI:
stages:
- test
- deploy
test:
stage: test
script:
- pytest --junitxml=report.xml
artifacts:
reports:
junit: report.xml
deploy:
stage: deploy
script:
- echo "Deploying..."
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual
- when: never
needs: ["test"]
variables:
CONFIDENCE_GATE_MIN_PASS_RATE: 95
before_script:
- |
PASS_RATE=$(grep -oP 'tests=\K[0-9]+' report.xml | head -1)
TOTAL=$(grep -oP 'errors=\K[0-9]+' report.xml | head -1)
RATE=$(echo "scale=2; ($PASS_RATE - $TOTAL) / $PASS_RATE * 100" | bc)
if (( $(echo "$RATE < $CONFIDENCE_GATE_MIN_PASS_RATE" | bc -l) )); then
echo "Confidence gate failed: pass rate $RATE% is below $CONFIDENCE_GATE_MIN_PASS_RATE%"
exit 1
fi
Apa yang Tidak Digantikan oleh Pengujian Pipeline
Pengujian dalam pipeline bukan pengganti tanggung jawab developer. Developer tetap harus memastikan kode mereka berfungsi sebelum mendorongnya. Pipeline menambahkan lapisan verifikasi otomatis yang konsisten dan dapat diulang setiap kali ada perubahan masuk. Ia menangkap apa yang terlewat oleh manusia, terutama saat mereka lelah, terburu-buru, atau mengerjakan sesuatu yang kompleks.
Namun, ia tidak menggantikan pemikiran. Ia tidak menggantikan pengujian manual untuk skenario yang sulit diotomatisasi. Ia tidak menggantikan diskusi tentang apakah perubahan itu adalah hal yang benar untuk dilakukan. Ia adalah alat, bukan proses.
Daftar Periksa Praktis Singkat
Saat Anda menyiapkan atau meninjau pengujian dalam pipeline, berikut adalah daftar singkat untuk diperiksa:
- Apakah setiap tes dalam pipeline memiliki alasan yang jelas untuk berada di sana? Jika tidak, hapus.
- Apakah pipeline cukup cepat sehingga developer mendapatkan umpan balik dalam hitungan menit? Jika tidak, prioritaskan tes yang lebih cepat daripada yang lebih lambat.
- Apakah tes bersifat deterministik? Tes yang flakgy menghancurkan kepercayaan pada pipeline.
- Apakah tes sesuai dengan risiko perubahan? Perbaikan typo seharusnya tidak memicu tes yang sama seperti perubahan logika pembayaran.
- Apakah ada gerbang yang jelas di setiap tahap? Semua orang harus tahu apa artinya lolos dan gagal.
Intisari Konkret
Pengujian dalam pipeline bukan tentang menjalankan tes. Ini tentang membangun keyakinan bahwa suatu perubahan aman untuk dilanjutkan. Keyakinan itu datang dari memilih tes yang tepat berdasarkan risiko, menjaga pipeline cukup cepat untuk memberikan umpan balik yang berguna, dan merancang gerbang yang menghentikan masalah sebelum mencapai pengguna. Mulailah dari apa yang akan terasa sakit jika rusak, dan bangun pengujian pipeline Anda dari sana.