IT Testing & Quality Assurance

Sepanjang sebagian besar sejarahnya, pengujian perangkat lunak diorganisasi sebagai tindakan pengurangan: bangun sistemnya, lalu singkirkan cacatnya sebelum rilis. Kerangka berpikir itulah alasan tunggal terbesar mengapa organisasi terus terkejut oleh insiden produksi yang sebenarnya sepenuhnya dapat mereka cegah. Kualitas tidak diperiksa masuk ke dalam produk pada akhir sebuah pipeline; kualitas adalah properti dari sistem dan dari proses yang menghasilkannya, hadir atau absen sejak keputusan desain pertama dan seterusnya. Artikel ini memperlakukan pengujian dan penjaminan mutu sebagai disiplin rekayasa alih-alih sebagai gerbang, dengan menggambarkan bagaimana bidang ini bekerja ketika berhasil dan di mana ia gagal ketika gagal.

What Nashua offers herePenugasan yang menjadikan kualitas sebagai properti dari sistem alih-alih ketergesaan di akhir.See the engagements

Kualitas adalah properti, bukan fase

Alasan topik ini penting sekarang, lebih daripada satu dekade lalu, adalah karena struktur biaya perangkat lunak telah terbalik. Irama rilis telah bergeser dari kuartalan menjadi harian atau bahkan per jam bagi banyak organisasi, ketergantungan berlipat ganda, dan sistem semakin banyak dirakit alih-alih ditulis, disusun dari layanan, pustaka, dan platform pihak ketiga yang perilakunya tidak sepenuhnya dikendalikan oleh satu tim mana pun. Dalam lingkungan seperti itu, model pengujian yang memusatkan verifikasi pada satu fase tersendiri di akhir jelas tidak mampu mengimbangi laju. Tidak lagi ada jendela waktu yang nyaman di mana tim mutu terpisah menangkap segala sesuatu sebelum rilis terjadwal, karena tidak ada lagi rilis terjadwal dalam pengertian lama.

Ketika kita mengatakan kualitas adalah properti dari sistem, kita bermaksud sesuatu yang presisi. Sebuah sistem memiliki kualitas sejauh perilaku aktualnya sesuai dengan perilaku yang diniatkan di seluruh kondisi yang akan dihadapinya, dan sejauh kesesuaian ini dapat ditunjukkan secara murah dan berulang. Kedua bagian itu sama pentingnya. Sistem yang kebetulan berperilaku benar tetapi tidak dapat dibuktikan demikian tanpa upaya manual yang luar biasa bukanlah sistem berkualitas tinggi dalam istilah rekayasa; ia adalah sistem yang rapuh yang kebenarannya tidak dapat diverifikasi dan karenanya tidak dapat dipercaya pada perubahan berikutnya.

Pembingkaian ulang ini memiliki konsekuensi praktis yang sering ditolak para pemimpin. Jika kualitas adalah sebuah properti, maka ia dirancang dan dibangun, bukan ditambahkan. Keputusan yang paling menentukan keteruji-an dibuat jauh sebelum satu pun pengujian ditulis: bagaimana komponen dibatasi, bagaimana state dikelola, bagaimana efek samping diisolasi, apakah perilaku diekspos melalui antarmuka yang stabil atau terjalin dengan presentasi. Tim yang memperlakukan pengujian sebagai persoalan pihak lain di kemudian hari menutup pilihan-pilihan tersebut dan kemudian menemukan, terlambat, bahwa sistemnya menolak verifikasi di setiap sudut. Keadaan bidang ini saat ini paling baik dipahami sebagai migrasi yang lambat dan tidak merata dari model fase menuju perlakuan atas kualitas sebagai perhatian intrinsik dan berkelanjutan dari seluruh organisasi pengiriman perangkat lunak.

Prinsip dasar dan bentuk piramida

Strategi pengujian bukanlah daftar pengujian. Ia adalah serangkaian keputusan yang disengaja tentang di mana upaya verifikasi dibelanjakan, pada granularitas apa, dan terhadap risiko yang mana. Titik awalnya adalah membedakan pertanyaan yang dijawab oleh berbagai jenis pengujian. Unit test menjawab apakah sepotong kecil logika berperilaku sebagaimana diniatkan penulisnya secara terisolasi. Integration test menjawab apakah komponen-komponen sepakat atas kontrak di antara mereka. End-to-end test menjawab apakah perjalanan pengguna yang lengkap berfungsi di seluruh sistem yang telah dirakit. Ketiganya tidak dapat saling menggantikan; masing-masing menangkap satu kelas cacat yang secara struktural tidak dapat ditangkap oleh yang lain, dan masing-masing membawa biaya berbeda dalam waktu eksekusi, beban pemeliharaan, dan kejelasan diagnostik ketika gagal.

Piramida pengujian adalah ekspresi klasik tentang bagaimana menyeimbangkannya, dan logikanya bersifat ekonomis alih-alih estetis. Pengujian di dekat dasar berjumlah banyak, cepat, dan presisi: ketika sebuah unit test gagal, biasanya ia menunjuk langsung ke baris yang bermasalah. Pengujian di dekat puncak berjumlah sedikit, lambat, dan luas: ketika sebuah end-to-end test gagal, ia memberi tahu Anda bahwa ada yang salah di suatu tempat pada rantai yang panjang, yang bernilai tetapi mahal untuk didiagnosis. Oleh karena itu strategi yang sehat mendorong verifikasi turun ke tingkat termurah yang benar-benar dapat menjawab pertanyaan. Anda tidak menjalankan perjalanan browser penuh untuk memeriksa aturan pemformatan tanggal yang bisa dipastikan oleh sebuah unit test dalam hitungan milidetik.

Piramida dalam praktiknya lebih sering terbalik daripada yang diakui tim, menjadi kerucut es krim: dasar unit test yang tipis, lapisan end-to-end test lambat yang menggembung, dan pinggiran pemeriksaan manual di atasnya. Bentuk itu adalah sinyal masalah. Biasanya ia berarti kode yang mendasari sulit diuji secara terisolasi, sehingga tim mengompensasi dengan menguji segala sesuatu melalui antarmuka terluar, di mana setiap pemeriksaan lambat, rapuh, dan terkopel dengan detail insidental. Pesan sesungguhnya dari piramida bukanlah rasio tetap yang harus dihafal, melainkan sebuah prinsip: utamakan pengujian terkecil dan tercepat yang secara berarti mengurangi risiko, dan perlakukan puncak yang berat sebagai bukti masalah desain yang harus diperbaiki alih-alih gaya pengujian yang harus diterima.

Exploratory & Manualhuman judgement, few in number, finds the unscriptedEnd-to-Endslow, broad, reserved for critical journeysIntegrationcontracts and agreements between componentsUnitfast, numerous, precise, the foundation
The test pyramid distributes verification effort across levels, with fast and numerous checks forming the foundation.

Ke mana arah bidang ini bergerak

Pergeseran paling berkonsekuensi dalam praktik modern tertangkap oleh istilah shift-left, yang berarti memindahkan verifikasi lebih awal dalam alur kerja, menuju momen ketika sebuah perubahan digagas alih-alih momen ketika ia dikirimkan. Dalam bentuk dangkalnya, ini sekadar menjalankan lebih banyak pengujian dalam pipeline. Dalam bentuk seriusnya, ia menjangkau lebih jauh ke kiri lagi: memperjelas kriteria penerimaan sebelum satu baris pun ditulis, mengekspresikan kriteria tersebut sebagai pemeriksaan yang dapat dieksekusi, dan meninjau desain untuk keteruji-an sebagai perhatian kelas satu. Argumen ekonominya sudah mapan. Cacat yang tertangkap ketika sebuah kebutuhan masih berupa kalimat nyaris tidak berbiaya untuk diperbaiki; cacat yang sama yang ditemukan di produksi berbiaya berlipat-lipat besarnya, dan kadang berbiaya kepercayaan yang tak dapat dipulihkan oleh uang.

Continuous testing memperluas hal ini hingga ke dalam pipeline pengiriman itu sendiri, sehingga setiap perubahan memicu rangkaian verifikasi otomatis yang hasilnya menggerbangi kemajuan. Disiplinnya di sini bukan sekadar memiliki pengujian, melainkan memiliki rangkaian yang cukup cepat dan cukup dapat dipercaya sehingga para pengembang benar-benar menunggunya dan memercayainya. Pipeline yang memakan waktu satu jam dan gagal secara acak seperlima dari waktunya lebih buruk daripada tidak ada pipeline sama sekali, karena ia melatih orang untuk mengabaikan tanda merah. Bersamaan dengan ini, contract testing telah matang sebagai cara memverifikasi kesepakatan antar layanan tanpa harus menegakkan seluruh sistem, memungkinkan setiap pihak memastikan bahwa ia menghormati antarmuka bersama. Ia adalah salah satu gagasan yang benar-benar berguna dalam satu dekade terakhir bagi organisasi yang dibangun di atas banyak layanan kecil.

Dua arus lebih lanjut layak mendapat perlakuan yang jujur. Risk-based testing telah bergerak dari cerita rakyat menjadi metode: alih-alih mengejar cakupan yang seragam, tim dengan sengaja memusatkan upaya di mana hasil kali kemungkinan dan dampak paling tinggi, dan secara sadar menerima verifikasi yang lebih tipis di mana taruhannya rendah. Sementara itu, exploratory testing telah direbut kembali sebagai disiplin yang terampil alih-alih klik-mengklik tanpa arah. Seorang penguji eksploratif yang cakap membentuk hipotesis tentang bagaimana sebuah sistem mungkin gagal dan menyelidikinya secara sistematis, menemukan cacat yang tidak akan pernah tersingkap oleh pengujian berskrip, yang hanya memeriksa apa yang sudah terpikirkan seseorang untuk diperiksa. Kehadiran baru-baru ini dari perkakas generatif yang menyusun rancangan kasus uji dan data adalah nyata dan berguna, tetapi ia memperkuat penilaian-penilaian ini alih-alih menggantikannya; sebuah mesin dapat mengusulkan seribu pemeriksaan, dan hanya penalaran manusia yang memutuskan seribu mana yang layak dijalankan.

Merancang sistem yang benar-benar dapat Anda uji

Otomasi yang membayar kembali dirinya sendiri bukanlah soal menulis lebih banyak pengujian; ia adalah soal merancang sistem dan rangkaian pengujian sedemikian rupa sehingga biaya berkelanjutan dari pengujian tetap di bawah biaya cacat yang mereka cegah. Di sinilah arsitektur dan kualitas bertemu. Keteruji-an adalah properti desain, dan karakteristik yang sama yang membuat kode dapat diuji, batas yang jelas, ketergantungan yang eksplisit, efek samping yang terisolasi, perilaku yang deterministik, cenderung juga membuatnya mudah dipelihara demi setiap alasan lainnya. Ketika pengujian terasa menyakitkan, rasa sakit itu biasanya bersifat diagnostik: ia memberi tahu Anda bahwa desain memiliki kopling tersembunyi atau tanggung jawab yang ambigu, dan perbaikannya berada di dalam kode, bukan pada perancah pengujian yang semakin rumit.

Ekonominya berputar pada dua besaran yang jarang diukur oleh tim: biaya menulis dan memelihara sebuah pengujian sepanjang masa hidupnya, dan nilai dari kegagalan yang ditangkapnya. Sebuah unit test yang cepat dan terfokus yang menjaga logika yang benar-benar rawan galat memberi imbal hasil yang sangat baik. Sebuah end-to-end test yang rapuh yang rusak setiap kali sebuah tombol bergeser, memerlukan perawatan terus-menerus, dan sebagian besar hanya memeriksa ulang logika yang sudah tercakup di bawahnya memberi imbal hasil yang negatif, dan menggerogoti waktu rekayasa secara diam-diam adalah cara sebagian besar upaya otomasi berakhir. Disiplinnya adalah menulis pengujian yang peka terhadap perilaku dan tidak peka terhadap struktur, sehingga mereka gagal ketika sistem melakukan hal yang salah dan tetap diam ketika sistem melakukan hal yang benar dengan cara yang berbeda.

Yang membawa kita ke cakupan, angka paling disalahpahami dalam bidang ini. Code coverage mengukur baris atau cabang mana yang dieksekusi ketika pengujian dijalankan. Hanya itu yang diukurnya. Cakupan yang tinggi memberi tahu Anda bahwa pengujian menyentuh kode; ia tidak mengatakan apa pun tentang apakah mereka menegaskan sesuatu yang berarti tentang apa yang terjadi, apakah kasus yang mereka jalankan adalah kasus yang penting, atau apakah orakel yang memutuskan lulus dan gagal itu benar. Sepenuhnya mungkin mencapai cakupan sembilan puluh persen dengan pengujian yang akan tetap lulus bahkan jika logikanya rusak, karena mereka mengeksekusi kode tanpa memeriksa hasilnya. Cakupan berguna sebagai batas bawah dan sebagai cara menemukan kode yang belum pernah dijalankan oleh pengujian mana pun, yang layak diketahui. Ia berbahaya sebagai target, karena begitu ia menjadi tujuan, orang mengoptimalkan metrik alih-alih risiko, menulis pengujian dangkal yang menaikkan angka tanpa menaikkan keyakinan. Cakupan memberi tahu Anda di mana Anda belum melihat; ia tidak pernah memberi tahu Anda bahwa apa yang Anda lihat sudah benar.

Bagaimana pengujian menjadi keliru

Kegagalan dalam pengujian cenderung berulang di seluruh organisasi dalam bentuk-bentuk yang dapat dikenali, dan menamainya membantu tim melihat situasi mereka sendiri dengan jelas.

Piramida terbalik. Dasar unit test yang tipis dan ketergantungan berat pada end-to-end check yang lambat, biasanya merupakan gejala dari kode yang tidak pernah dirancang untuk diuji secara terisolasi. Rangkaian menjadi lambat dan tidak andal, para pengembang berhenti memercayainya, dan verifikasi secara diam-diam kembali menjadi upaya manual di bawah tekanan tenggat waktu.

Pengujian yang rapuh (flaky). Pengujian yang lulus dan gagal tanpa perubahan apa pun pada kode, paling sering karena asumsi pewaktuan, state yang dibagi, atau ketergantungan tersembunyi pada lingkungan. Kerapuhan bersifat merusak jauh melampaui ukuran tampaknya, karena rangkaian yang berteriak serigala melatih semua orang untuk mengabaikan tanda merah, dan satu kegagalan yang diabaikan adalah cara cacat sungguhan mencapai produksi melalui pipeline yang hijau.

Cakupan sebagai pertunjukan. Memperlakukan persentase cakupan sebagai definisi kualitas, yang menghasilkan pengujian yang ditulis untuk mengeksekusi baris alih-alih untuk menangkap cacat. Angkanya naik, keyakinannya tidak, dan organisasi menjadi lebih buruk karena memercayai sebaliknya.

Pengujian setelah fakta. Verifikasi yang dipasangkan begitu desain dibekukan, ketika peluang murah untuk mencegah cacat sudah berlalu. Yang tersisa adalah deteksi mahal atas masalah yang seluruhnya dapat dicegah oleh kejelasan yang lebih awal.

Silo kualitas. Mendelegasikan seluruh tanggung jawab atas kualitas kepada tim terpisah yang diposisikan di akhir alur. Ini memutus orang-orang yang menciptakan cacat dari umpan balik yang akan membantu mereka berhenti, memperlambat segalanya hingga sebatas keluaran si penghambat, dan mengubah kualitas menjadi negosiasi alih-alih standar bersama. Dalam setiap mode kegagalan ini, obatnya jarang berupa lebih banyak pengujian. Obatnya adalah pengujian yang ditempatkan lebih baik, metrik yang jujur, keterlibatan lebih awal, dan desain yang tidak menolak verifikasi.

Bagaimana Nashua mendekati pengujian dan penjaminan mutu

Nashua mendekati kualitas sebagai properti rekayasa dari keseluruhan sistem pengiriman, bukan sebagai langkah inspeksi yang harus disisipkan sebelum rilis. Pekerjaan kami dengan klien dimulai dengan penilaian yang jernih tentang di mana upaya verifikasi saat ini berada, risiko apa yang sebenarnya ditanganinya, dan di mana letak celah antara perilaku yang diniatkan dan yang telah ditunjukkan. Kami menelaah bentuk rangkaian pengujian yang ada, kecepatan dan keandalan pipeline, titik-titik di mana keputusan kualitas diambil, dan struktur organisasi yang entah menghubungkan pengembang dengan umpan balik atau mengisolasi mereka darinya. Keluarannya bukanlah skor kematangan generik, melainkan gambaran spesifik tentang di mana pendekatan saat ini membelanjakan upaya dengan baik dan di mana ia membelanjakannya terhadap risiko yang keliru.

Dari sana kami bekerja bersama tim klien untuk membangun strategi pengujian yang berlandaskan risiko alih-alih ritual. Itu berarti mendorong verifikasi turun ke tingkat termurah yang dapat menjawab setiap pertanyaan, memulihkan piramida yang sehat di mana ia telah terbalik, dan berlaku sengaja terhadap sejumlah kecil perjalanan end-to-end yang benar-benar pantas mendapat pemeriksaan yang lambat dan luas. Kami memperlakukan keteruji-an sebagai perhatian desain, sehingga keterlibatan kami menjangkau keputusan arsitektur dan antarmuka alih-alih berhenti di rangkaian pengujian. Kami membantu tim mengadopsi praktik shift-left dalam bentuk seriusnya, memperjelas kriteria penerimaan sebelum implementasi dan mengekspresikannya sebagai pemeriksaan yang dapat dieksekusi, dan kami membangun pipeline continuous testing yang cukup cepat dan dapat dipercaya sehingga orang benar-benar mengandalkannya.

Yang terpenting, kami memperlakukan otomasi sebagai investasi yang harus dibenarkan alih-alih tujuan pada dirinya sendiri. Kami membantu tim membedakan pengujian yang layak dipelihara selama satu dekade dari pengujian yang diam-diam menguras waktu rekayasa, dan kami berterus terang soal metrik: cakupan sebagai batas bawah diagnostik, tidak pernah sebagai target, dan pengurangan risiko sebagai ukuran sejati atas nilai sebuah rangkaian. Pengujian eksploratif dan manual tetap memiliki tempatnya sebagai disiplin terampil untuk pertanyaan-pertanyaan yang tidak dapat diajukan oleh otomasi. Hasilnya adalah praktik kualitas yang dimiliki oleh seluruh tim, tertanam dalam cara perangkat lunak dirancang dan dikirimkan, alih-alih sebuah fase yang berdiri di antara pekerjaan yang selesai dan para penggunanya.

Di mana Nashua membuat perbedaan

Perbedaan yang dibawa Nashua bukanlah rangkaian pengujian yang lebih besar, melainkan penilaian yang lebih kuat tentang dari mana kualitas berasal. Banyak organisasi dapat menulis pengujian; jauh lebih sedikit yang dapat memberi tahu pengujian mana yang benar-benar menghasilkan nilainya, risiko mana yang dibiarkan tak tercakup sementara upaya menumpuk di tempat lain, dan keputusan arsitektur mana yang diam-diam membuat keseluruhan sistem lebih sulit diverifikasi. Penilaian itu, yang dibangun dari praktik panjang di berbagai sistem enterprise, adalah yang mengubah pengujian dari pusat biaya menjadi sumber keyakinan yang tahan lama, dan itulah yang kami kerahkan sejak percakapan desain pertama alih-alih tinjauan terakhir sebelum rilis.

Ada pula konsekuensi praktis yang mengubah apa yang boleh diasumsikan oleh pekerjaan ini. Ketika sebuah penugasan menuntut kapabilitas yang belum ada, ia tidak perlu menunggu siklus pengadaan atau peta jalan seorang vendor. enterprise platform dibangun untuk mengakomodasi hampir semua fitur dengan cepat, melalui agentic engineering: apa yang dibutuhkan dijelaskan dalam bahasa yang lugas dan dihasilkan dengan cepat, tetapi selalu di dalam prinsip arsitektur yang kokoh dan di bawah penjaminan mutu yang ketat, sehingga kecepatan tidak pernah mengorbankan koherensi, keamanan, atau kendali. Efeknya bersifat strategis alih-alih sekadar praktis. Ia menggeser garis buat-atau-beli, menjaga optionalitas tetap murah, dan membiarkan arsitektur mengikuti strategi alih-alih strategi tunduk pada apa pun yang kebetulan tersedia di rak.

Yang mengikat semuanya adalah penolakan untuk memperlakukan kualitas sebagai terpisah dari sistem yang memilikinya. Kami menanamkan verifikasi ke dalam desain, pengiriman, dan operasi sehingga kesesuaian antara perilaku yang diniatkan dan yang aktual dapat ditunjukkan secara murah dan berkelanjutan, dan sehingga organisasi tidak lagi terkejut oleh kegagalan yang sebenarnya memiliki segala cara untuk dicegahnya. Bagi perusahaan yang perangkat lunaknya tumbuh lebih cepat daripada kemampuan mereka untuk memercayainya, pergeseran itu, dari memeriksa kualitas masuk di akhir menjadi membangunnya masuk sejak awal, adalah tempat perbedaan yang nyata dan bertahan lama diciptakan.