White box, Black box, Gray box, itu semua apaan sih?
Ketika kamu menggunakan aplikasi, pernah menekan tombol? lalu tombol tersebut bereaksi dan memberikan suatu output, benar bukan? atau ketika melakukan hit kepada api, akan ada output yang diberikan (walau hanya “200 OK” atau “404 Not Found”). Hal semacam itu, disebut sebagai fungsi.
Pengujian aplikasi itu ada yang berfokus pada hal semacam itu, lebih tepatnya adalah fungsionalitas aplikasi, disebut sebagai functional testing. Untuk mengimplementasikannya, ada tiga pendekatan yang bisa digunakan, diantaranya adalah
- White Box testing
- Black Box testing
- Gray Box testing
Kenapa ada kata “box” disitu? hal itu menyimbolkan outer shell dari aplikasi yang diuji, berkaitan dengan apakah penguji dapat melihat isi (apa yang bekerja) dibalik aplikasi itu atau tidak. Jadi, Mari kita bedah satu persatu dari pendekatan pengujian tersebut ya.
White Box Testing
White Box testing itu adalah suatu pendekatan atau teknik pengujian dengan menguji struktur, desain, dan kode internal dari suatu perangkat lunak untuk memverifikasi input dan output dari suatu flow dalam kode.
Pendekatan white box testing juga biasa dikenal dengan clear box testing, open box testing, transparent box testing, code-based testing, dan glass box testing.
Apa sih yang diverfikasi dalam white box testing?
- Celah security di internal code
- Struktur path dan proses kode yang jelek
- Flow untuk input yang spesifik di dalam code
- Expected output
- Fungsionalitas dari setiap kondisi (conditional loops)
- Menguji setiap statement, object, dan fungsi secara individu.
Pengujian ini dilakukan di level system, integration, dan unit level dari sebuah software. Tujuan mendasar dari white box testing itu adala memverifikasi flow dari aplikasi. Jadi ada sebuah input yang sudah didefinisikan, kemudian diberikan kepada suatu fungsi, outputnya sesuai ga. Di sini akan kelihatan fungsi mana yang ngasih output yang ga sesuai. Jadi jelas bugnya ada di mana
Lalu gimana caranya untuk melakukan white box testing?
- Pahami source code-nya — Alasan kenapa white box testing itu harusnya dev itu sendiri atau orang yang memang dekat secara pengetahuan dengan developer ya karena ini, testernya harus paham internal codenya. Mulai dari bahasa, algoritma, struktur data, itu harus terbiasa dan paham dengan kode yang diujinya. Testernya juga harus aware dengan security issue dan tau pencegahan yang perlu dilakukan dari hacker dan user yang jahil yang suka meng-inject kode-kode berbahaya, baik sadar maupun tidak.
- Buat test case dan eksekusi — Namanya juga menguji, maka harus ada pengujian yang dijalankan. Tester membuat test casenya, lalu mulai menguji kode untuk mengetahui alur dan struktur kodenya sudah tepat. Salah satu caranya adalah dengan menulis lebih banyak kode untuk menguji kode. NANIIII!???!? Ya, di sini, testernya juga ngoding. Selain itu, bisa juga metode manual testing dilakukan, melalui trial and error testing. Jadi input dan outputnya secara manual diberikan dan diverifikasi oleh tester.
Teknik yang bisa diterapkan dalam white box testing:
- Code Coverage
- Statement Coverage
- Decision Coverage
- Branch Coverage
- Condition Coverage
- Multiple Condition Coverage
- Finite State Machine Coverage
- Path Coverage
- Control flow testing
- Data flow testing
Teknik pengujian yang utama di dalam white box testing itu sebenarnya adalah Code Coverage analysis. Tujuannya adalah untuk mengeliminasi gap di dalam test case. Code Coverage Analysis mengidentifikasi area program mana yang belum diuji, ketika gap tersebut ditemukan, maka penguji perlu menambahkan test case atau step baru untuk menguji bagian kode yang belum diuji tersebut.
Walaupun demikian, menggunakan Statement dan Branch coverage analysis secara bersamaan dapat secara umum untuk meraih 80–90% code coverage yang cukup.
Mari pahami sedikit lebih mendalam beberapa teknik di atas.
⭐ Statement Coverage
Ingat ya, di dalam sebuah program statement itu hanyalah sebuah line kode atau intruksi untuk komputer memahami dan berperilaku. Statement tersebut hanya dijalankan ketika kode dicompile lalu program dijalankan.
Karenanya, “Statement Coverage” di sini artinya adalah menguji apakah setiap baris kode dieksekusi setidaknya satu kali.
Kalau baris kode tersebut tidak pernah dieksekusi, kenapa dia harus ada di situ?
⭐ Branch Coverage
Kalau branch, di programming language itu selayaknya “IF”. Ada dua branch yang dia punya, true dan false. Jadi, yang divalidasi adalah pernyataan bahwa setiap branch dieksekusi setidaknya satu kali.
Akan ada dua kondisi,
- Melakukan validasi pada branch “true”
- dan melakukan validasi pada branch “false”
⭐ Path Coverage
Path coverage akan menguji semua jalur program yang ada. Teknik ini memastikan bahwa semua path pada program dilalui setidaknya satu kali. Teknik ini lebih berguna untuk menguji program yang kompleks.
Contoh white box testing
function sum(x,y){
z = x+y
if(z >100)
console.log("Its done")
}
Jika dilihat dari sisi statement coverage, kita hanya butuh sebuah test case untuk menguji semua line dari kode tersebut.
TC01 akan terlihat seperti: X = 40 dan Y = 70, maka seluru baris kode akan dieksekusi.
Tapiiiii, Apakah cukup? Gimana kalau X=40 dan Y=20?
yap, karena statement coverage hanya mengocever “true” side saja, dengan jenis kode berupa decision yang punya branch, maka satu test case saja tidak cukup. Karenanya untuk mendapatkan coverage yang maksimum, kita perlu mempertimbangakn penggunaan Branch Coverage yang akan mengevaluasi kondisi “false”.
dengan menggunakan branch coverage, tester akan mempertanyakan “kalau false, lalu apa yang akan diberikan?”. Untuk meningkatkan user experience, kita bisa menambahkan statement yang sesuai untuk kondisinya adalah “false”.
Jadi sekarang kodenya akan menjadi:
function sum(x,y){
z = x+y
if(z >100)
console.log("Its done")
else
console.log("Its pending")
}
Karena statement coverage sebelumnya tidak cukup, jadi kita butuh branch coverage untuk mendapatkan coverage maksimal. Jadi sekarang kita akan butuh dua test case untuk menyelesaikan pengujian pada kode tersebut.
TC01 — input X=50, Y=55. expected output “Its done”
TC02 — input X=30, Y=20. expected output “Its pending”
Sebagaimana disebutkan sebelumnya, Path coverage bisa digunakan untuk kode yang lebih kompleks, yang secara mendasar melibatkan loop statement, atau kombinasi dari loop dan decision statement.
Mari kita lihat apabila kode yang kita punya menjadi seperti berikut ini
function sum(x,y){
z = x+y
if(z >100)
console.log("Its done")
if(x>50)
console.log("Its pending")
}
Di atas kita memiliki dua buah decision statement, jadi untuk setiap decision statement, kita perlu dua branch yang dites. Jadi akan ada total 4 test case yang akan kita miliki.
Untuk menyederhanakannya, mari lihat flowchart di bawah ini:
Untuk mendapatkan coverage yang lengkap, maka berikut ini adala test case yang kita butuhkan:
TC01 — input X=60, Y=75. expected output “Its done”, “Its pending”
TC02 — input X=30, Y=75. expected output “Its done”
TC03 — input X=60, Y=20. expected output “Its pending”
TC04 — input X=10, Y=20. expected: output tidak ada apapun.
Dengan demikian, path coverage-nya akan terlihat seperti:
Biru — TC01 — input X=60, Y=75
Orange — TC02 — input X=30, Y=75
Red — TC03 — input X=60, Y=20
Green — TC04 — input X=10, Y=20
Tipe-tipe white box testing
- Unit testing
pengujian yang berjalan secara spesifik pada suatu fungsi atau unit kode. - Memory leak testing
pengujian dengan tujuan untuk menguji apa yang menyebabkan aplikasi berjalan lambat dan mencari apakah ada memory leak yang disebabkan oleh kode tertentu. - Penetration testing (white box penetration test)
pengujian berbasis security dengan tujuan utamanya adalah untuk menyerang kode dari beberapa sudut untuk mengekspos ancaman keamanan. - Mutation testing
sering digunakan untuk menemukan teknik pengkodean terbaik yang dapat digunakan untuk mengembangkan solusi perangkat lunak.
Alat untuk melakukan white box testing
Karena basis dari white box sendiri adalah membuat kode, hal tersebut memungkinkan untuk berkembangnya beberapa alat untuk memudahkan tester dalam melakukan pekerjaannya. berikut ini ada beberapa alat yang bisa digunakan untuk mengautomasi white box testing ini:
- EclEmma
- NUnit
- PyUnit
- HTMLUnit
- CppUnit
- JUnit5
- JSUnit.net
- Veracode
Keuntungan white box testing
- Kode dapat dioptimisasi dengan menemukan error tersembunyi ataupun kode yang tidak berguna
- Dapat dengan mudah diautomasi
- Pengujian dapat berjalan lebih menyeluruh karena semua path pada kode biasanya akan tercakup
- Pengujian bisa dijalankan lebih dini dalam SDLC bahkan ketika GUInya belum jadi.
Kekurangan menggunakan white box testing
- Bisa jadi cukup kompleks dan mahal (memakan banyak resource)
- Developer yang melakukan white box test bisa jadi membenci pendekatan ini. Karenanya bisa membawa pada tidak mendetailnya apa yang dibuat sehingga dapat terjadi eror di production.
- Memerlukan sumber daya profesional yang mengerti secara mendetail implementasi dan programming yang diuji
- Bisa memakan waktu, semakin besar aplikasinya, waktu yang dibutuhkan untuk menjalankan pengujian bisa lebih besar pula
Black Box Testing
Sekarang kita masuk ke Black box testing ya! Pendekatan ini adalah pendekatan yang berseberangan dengan White box testing. Kenapa demikian? Karenaaa….
Black box testing adalah sebuah pendekatan testing yang menguji fungsionalitas dari sebua software tanpa mengetahui struktur kode internalnya. Blackbox testing berfokus pada input dan output dari software dan seluruhnya berdasar pada requirement dan spesifikasi software tersebut. Black box testing juga dikenal dengan Behavioral Testing.
Black box testing juga dikenal dengan behavioral, opaque-box, closed — box, specification-based atau juga eye-to-eye testing. Hal ini mengacu karena tester tidak mengetahui isi (kode dan cara kerja kode) dari apa yang diujinya.
Teknik pada Black box testing
Ada beberapa teknik yang bisa digunakan dalam melakukan Black box testing, diantaranya adalah:
- Equivalence Class Testing
digunakan untuk meminimalisir jumlah dari test case yang mungkin ada hingga ke level optimum sambil mempertahankan test coverage yang masuk akal (wajar). - Boundary Value Testing
Berfokus terhadap value pada batas-batasnya (boundaries). Teknik ini memungkinkan kita untuk tahu cakupan nilai yang dapat diterima oleh sistem. paling cocok untuk sistem yang memiliki input dalam rentang tertentu. - Decision Table Testing
Tabel keputusan menempatkan penyebab dan efeknya dalam sebuah matriks. Ada kombinasi unik di setiap kolom.
Tipe-tipe Blackbox Testing
Black box testing juga punya beberapa tipe pengujian yang cukup banyak dibahas, diantaranya adalah:
- Functional Testing
black-box testing jenis ini melakukan pengujian yang mencakup pada functional requirement dari sebuah sistem, dilakukan oleh software tester. - Non-Functional Testing
Pengujian black box ini tidak tidak terkait dengan pengujian fungsionalitas tertentu, tetapi persyaratan non-fungsional seperti kinerja, skalabilitas, kegunaan. - Regression Testing
Dilakukan ketika ada pengembangan selanjutnya, seperti ada upgrade atau ada pengecekan ketika maintenance untuk mengetahui bahwa kode yang baru ditambahkan tidak mempengeruhi kode yang sudah ada.
Gimana caranya melakukan black box testing di Software engineering?
Berikut ini tahapan-tahapan yang bisa kamu lakukan untuk melakukan black box testing.
- Pertama tentukan requirement dan specification dari sistem yang dikembangkan.
- Tester membangun test case
- Tester memilih input yang valid (positive test scenario) untuk mengetahui apakah siste yang sedang diuji (System Under Test — SUT) memprosesnya dengan benar. Selain itu, beberapa input invalid (negative test scenario) juga dipilih untuk memastikan apakah SUT dapat mendeteksi dan menangani hal tersebut.
- Tester menentukan output yang diharapkan untuk semua input tersebut.
- Tester menyusun test case dengan menyesuaikan input yang dipilih dan output yang diharapkan
- Test case dieksekusi
- Tester membandingkan antara output yang sebenarnya dengan output yang diharapkan
- Apabila ada defect yang telah diselesaikan, maka perlu test case dan defect yang bersangkutan diuji kembali.
Alat untuk melakukan black box testing
Black box testing itu sebenarnya tidak memerlukan banyak alat yang begitu ribet. Bermodal dengan recorder, itu dah cukup. Tinggal sesuaikan dengan kebutuhannya. Nah ada beberapa yang biasa aku gunakan dan lainnya yang bisa jadi membantu mempermudah
- OBS — untuk record. dilipih karena gratis dan punya fitur pengaturan yang advance. Oh ya, bisa disesuaikan juga ekstensi keluarannya nanti apa, jadi fleksibel untuk kebutuhan dokumentasinya.
- Google drive — untuk sync evidence berupa screenshoot maupun video yang diasilkan obs. dipilih karena gratis dan bisa auto sync dari local ke cloud
- snipping tool (bawaan windows) — untuk screenshoot, dipilih karena gratis, mudah digunakan, dan autosave di local
- Bug magnet (ekstensi browser) — untuk kebutuhan isi inputan dengan format tertentu
- Fake filler (ekstensi browser) — kadang males ngetik sendiri, jadi ya minta diisiin otomatis aja lebih gampang. gratis pula.
- etc. masih banyak banget, request aja ya kalau mau dibuat bagian tersendiri 😁
Apa bedanya antara Black box dan White Box testing?
Keunggulan Black box testing
- Penguji tidak perlu memiliki latar belakang teknis. Penting untuk menguji dengan berada di posisi pengguna dan berpikir dari sudut pandang pengguna.
- Pengujian dapat dimulai setelah pengembangan proyek/aplikasi selesai. Baik penguji maupun pengembang bekerja secara independen tanpa saling mengganggu satu sama lain.
- Ini lebih efektif untuk aplikasi yang besar dan kompleks.
- Cacat dan ketidakkonsistenan dapat diidentifikasi pada tahap awal pengujian.
Kelemahan menggunakan Black box testing
- Tanpa pengetahuan teknis atau pemrograman, ada kemungkinan pengabaian kondisi yang mungkin terjadi pada skenario yang akan diuji.
- Dalam suatu waktu, ada kemungkinan pengujian melewatkan input dan hasil testingnya.
- Cakupan Pengujian yang lengkap tidak memungkinkan untuk proyek-proyek yang besar dan kompleks.
Gray Box Testing
Jadi gray box testing itu adalah teknik pengujian untuk menguji perangkat lunak atau aplikasi dengan memiliki sebagian pengetahuan tentang struktur internal dari aplikasi. Tujuan dari gray box testing itus endiri adalah untuk mencari dan mengidentifikasi defect yang diakibatkan karena struktur kode atau penggunaan aplikasi yang tidak tepat.
Black box testing + White box testing = Gray box testing
Dalam pengembangan software, gray box testing ini memungkinkan untuk menguji baik sisi aplikasi maupun presentation layer sebagai bagian dari kode. Utamanya digunakan dalam masa Integration testing dan Penetration Testing.
Contohnya gini: ada website, punya navbar yang apabila logo companynya diclick, maka dia harus mengarahkan user ke halaman home. Nah apabila tester mengalami kendala dengan hal tersebut maka perlu dicek, yang jadi masalah itu linknya gaada, atau linknya typo. saat melakukan inspect dan mencoba mengubah link tersebut, ini termasuk ke dalam aktivitas gray box testing.
Kenapa sih perlu gray box testing?
Menjalankan gray box testing itu memiliki beberapa alasan, diantaranya adalah:
- Secara bersamaan memberikan manfaat gabungan dari black box testing dan White box testing
- Menggabungkan input dari developer dan tester dan meningkatkan keseluruhan kualitas produk
- Pengujian diselesaikan dari point of view user, bukan dari sudut pandang designer maupun developer. jadi bisa tau apa yang user hadapi sekaligus tau apa yang harusnya diperbaiki dengan lebih jelas.
Strategi gray box testing
Untuk menjalankan gray box testing, gaperlu untuk tahu keseluruhan struktur internal kode. Pengujiannya lebih ke arah pada pengetahuan dari algoritma, arsitektur, atau beavior yang ada di high-level (yang lebih umum dan biasanya terdapat di functional requirement document)
Untuk melakukan gray box testing,
- Secara langsung menerapkan teknik black box testing
- Apabila ada defect, maka tester perlu memakai developer hat dan menjadi serlock holmes selagi melihat beberapa struktur kode yang ada untuk menemukan ada di mana masalanya
step-step dalam melakukan gray box testing
- Identifikasi input yang akan digunakan
- Identifikasi output yang diharapkan
- Identifikasi path utama yang akan dijalankan
- Identifikasi fungsi turunannya
- Develop input untuk fungsi turunannya
- Develop output yang diharapkan untuk fungsi turunannya
- Execute test case untuk subfunction tersebut
- Verifikasi bahwa output yang dikeluarkan subfungsi tersebut benar
- Ulang step 4 sampai 6 untuk setiap subfunction
- Ulangi step 7 dan 8 sampai semua fungsi dan subfungsinya telah diuji
Teknik yang digunakan untuk melakukan gray box testing adalah
- Matrix testing
Teknik pengujian ini melibatkan pendefinisian semua variabel yang ada di dalam program mereka. - Regression testing
Untuk memeriksa apakah perubahan pada versi sebelumnya telah membuat aspek-aspek lain dari program mengalami kemunduran pada versi yang baru. Hal ini akan dilakukan dengan strategi pengujian seperti menguji ulang semua, menguji ulang kasus penggunaan yang berisiko, menguji ulang di dalam firewall. - Pattern Testing
Pengujian ini dilakukan pada data historis dari kerusakan sistem sebelumnya. Tidak seperti pengujian kotak hitam, pengujian kotak abu-abu menggali kode dan menentukan mengapa kegagalan terjadi
Makasih telah membaca!
Jika kamu merasa ada sesuatu yang salah atau punya pertanyaan, jangan ragu untuk memberi aku tanggapan ya!
Kamu bisa baca topik lainnya lho, yang sudah pernah aku post adalah: