A. Pengujian Perangkat Lunak
Pengertian Pengujian Perangkat Lunak
Pengujian perangkat lunak (software testing) adalah proses yang sangat penting dalam siklus pengembangan perangkat lunak yang bertujuan untuk mengevaluasi kualitas perangkat lunak dan memastikan bahwa sistem bekerja sesuai dengan kebutuhan dan harapan pengguna. Proses ini melibatkan pelaksanaan program atau aplikasi dengan tujuan menemukan kesalahan (bug) dan memastikan perangkat lunak bebas dari cacat sebelum dirilis.
Menurut Pressman (2014), pengujian perangkat lunak adalah proses eksekusi perangkat lunak untuk mendeteksi kesalahan dan memastikan bahwa perangkat lunak telah memenuhi persyaratan yang telah ditentukan. Pengujian ini tidak hanya berfungsi untuk menemukan kesalahan, tetapi juga sebagai verifikasi dan validasi atas kualitas perangkat lunak.o
ISO/IEC/IEEE mendefinisikan pengujian perangkat lunak sebagai aktivitas yang dirancang untuk mengevaluasi atribut kualitas perangkat lunak dan mengidentifikasi perbedaan antara hasil yang diharapkan dengan hasil aktual dari perangkat lunak yang diuji.
Tujuan utama dari pengujian perangkat lunak adalah:
Menemukan kesalahan dalam perangkat lunak sebelum digunakan oleh pengguna.
Memastikan bahwa perangkat lunak sesuai dengan kebutuhan dan spesifikasi.
Meningkatkan kualitas perangkat lunak secara keseluruhan.
Memberikan keyakinan bahwa perangkat lunak dapat berjalan dengan andal dan stabil dalam berbagai situasi penggunaan.
Jenis-Jenis Umum Pengujian Perangkat Lunak
Dalam pengembangan perangkat lunak, terdapat beberapa jenis pengujian (testing) yang umum digunakan untuk memastikan bahwa setiap bagian dari sistem berfungsi sesuai dengan yang diharapkan. Beberapa jenis pengujian tersebut meliputi:
Unit Testing
Unit testing adalah pengujian terhadap unit terkecil dari perangkat lunak, seperti fungsi, metode, atau prosedur dalam kode program. Tujuannya adalah untuk memastikan bahwa setiap unit kode bekerja sesuai spesifikasinya secara independen. Pengujian ini biasanya dilakukan oleh pengembang (developer).
Integration Testing
Integration testing dilakukan untuk menguji kombinasi dari beberapa unit atau modul yang telah diuji secara individual. Tujuannya adalah untuk memastikan bahwa antar modul dapat bekerja sama dengan benar dan komunikasi antar komponen berjalan sebagaimana mestinya.
System Testing
System testing merupakan pengujian terhadap keseluruhan sistem sebagai satu kesatuan. Pengujian ini mengevaluasi apakah sistem telah memenuhi kebutuhan fungsional dan non-fungsional yang ditentukan dalam dokumen spesifikasi.
Acceptance Testing
Acceptance testing adalah pengujian yang dilakukan dari perspektif pengguna akhir (end user) untuk menentukan apakah sistem telah memenuhi kebutuhan bisnis dan siap untuk digunakan secara operasional. Jenis ini termasuk pengujian alfa (oleh tim internal) dan beta (oleh pengguna eksternal terbatas).
Pengertian Unit Testing Tekayasa Perangkat Lunak
Unit testing merupakan metode pengujian paling dasar yang bertujuan untuk memverifikasi bahwa setiap unit atau komponen perangkat lunak berjalan sesuai dengan fungsinya. Unit di sini dapat berupa satu fungsi, prosedur, metode, atau modul kecil yang independen dalam suatu sistem.
Menurut Akhmad D. dalam Buku Ajar Rekayasa Perangkat Lunak (2021:188), unit testing adalah proses pengujian pada bagian terkecil dari perangkat lunak yang dapat diuji secara mandiri untuk memastikan bahwa bagian tersebut berfungsi dengan benar. Unit testing menjadi langkah awal penting dalam menjamin kualitas sistem karena memungkinkan deteksi dan koreksi kesalahan sejak tahap awal pengembangan.
Sementara itu, Pressman (2010) menekankan bahwa unit testing is essential to validate the internal logic of software components and verify that each module performs its intended function. Pengujian ini biasanya dilakukan oleh pengembang (developer) menggunakan framework tertentu agar bisa dilakukan secara otomatis dan terulang-ulang tanpa perlu intervensi manual.
Tujuan Unit Testing dalam Rekayasa Perangkat Lunak:
Menemukan bug sejak dini: Kesalahan logika atau perhitungan bisa langsung terdeteksi sebelum masuk ke tahap integrasi.
Mengurangi biaya debugging: Semakin awal bug ditemukan, semakin murah biaya perbaikannya.
Memastikan logika unit berjalan sesuai spesifikasi: Dengan menguji fungsi-fungsi secara individu, pengembang dapat lebih yakin bahwa unit yang dikembangkan telah sesuai dengan kebutuhan.
Meningkatkan kepercayaan saat integrasi sistem: Karena masing-masing unit telah diuji, proses integrasi menjadi lebih stabil dan minim gangguan.
Karakteristik Unit Testing Tekayasa Perangkat Lunak
Unit testing memiliki sejumlah karakteristik khas yang membedakannya dari jenis pengujian perangkat lunak lainnya. Sebagai pengujian pada tingkat paling dasar, unit testing berfokus pada bagian terkecil dari perangkat lunak, biasanya berupa fungsi (function), prosedur (procedure), atau metode (method) yang dapat diuji secara terpisah dari komponen lainnya.
Beberapa karakteristik penting dari unit testing antara lain:
Menguji Unit Terkecil dari Perangkat Lunak
Unit testing dilakukan pada komponen terkecil yang dapat diuji secara mandiri. Unit ini biasanya berupa fungsi atau metode individual yang menerima input dan menghasilkan output. Tujuannya adalah memastikan bahwa satuan logika terkecil dalam perangkat lunak dapat berfungsi sebagaimana mestinya.
Independen (Terisolasi dari Komponen Lain)
Salah satu prinsip utama dalam unit testing adalah isolasi. Setiap unit diuji secara independen, tanpa ketergantungan pada modul lain. Jika diperlukan, dependensi eksternal seperti database, API, atau modul lain akan digantikan menggunakan teknik seperti mocking atau stub. Hal ini bertujuan agar pengujian dapat lebih fokus dan hasilnya lebih dapat diandalkan.
Fokus pada Logika Internal
Unit testing menitikberatkan pada validasi logika internal dari unit yang diuji. Pengujian ini tidak melihat interaksi antar komponen atau proses integrasi, melainkan hanya mengevaluasi apakah unit melakukan tugasnya sesuai logika dan spesifikasi yang ditentukan.
Dilakukan oleh Developer
Unit testing umumnya dilakukan langsung oleh pengembang (developer) selama tahap coding. Ini memungkinkan pengembang segera mengetahui jika terdapat kesalahan dalam logika atau perhitungan.
Biasanya Otomatis
Unit testing banyak dilakukan menggunakan framework otomatis, seperti JUnit (Java), PyTest (Python), dan NUnit (.NET). Framework ini memungkinkan pengujian dilakukan secara berulang (regression testing) setiap kali ada perubahan kode.
Langkah-Langkah dalam Unit Testing
Pelaksanaan unit testing melibatkan serangkaian langkah sistematis untuk memastikan bahwa setiap unit perangkat lunak diuji secara efektif. Langkah-langkah ini penting untuk menjamin bahwa fungsi-fungsi dalam program beroperasi sesuai dengan spesifikasinya dan bebas dari kesalahan sebelum diintegrasikan ke dalam sistem yang lebih besar. Adapun langkah-langkah umum dalam unit testing adalah sebagai berikut:
Menentukan Unit yang Akan Diuji
Langkah pertama adalah mengidentifikasi unit atau komponen terkecil dalam perangkat lunak yang akan diuji. Unit ini bisa berupa fungsi, prosedur, metode dalam class, atau modul mandiri. Penentuan ini penting agar pengujian dapat difokuskan dan dilakukan secara terisolasi dari bagian sistem lainnya.
Menyusun Test Case
Setelah unit ditentukan, langkah berikutnya adalah menyusun test case. Test case adalah serangkaian input dan kondisi uji yang dirancang untuk menguji fungsionalitas spesifik dari unit tersebut. Setiap test case mencakup:
Input yang diberikan ke unit
Output yang diharapkan
Langkah-langkah pengujian
Kondisi awal dan asumsi
Teknik penyusunan test case dapat menggunakan metode white-box atau black-box testing.
Menyiapkan Lingkungan Pengujian
Lingkungan pengujian mencakup tools, framework, dan dependensi lain yang diperlukan untuk menjalankan unit test secara efisien. Biasanya, dilakukan isolasi menggunakan mocking atau stubbing untuk menghindari ketergantungan terhadap unit lain yang belum dikembangkan.
Menjalankan Unit Test
Test case yang telah disusun kemudian dijalankan pada unit menggunakan framework testing. Pada tahap ini, pengembang mengamati apakah output aktual sesuai dengan output yang diharapkan. Jika hasil aktual tidak sesuai, maka terdapat indikasi adanya bug dalam unit tersebut yang harus diperbaiki.
Mengevaluasi dan Mendokumentasikan Hasil
Setelah test case dijalankan, hasil pengujian dianalisis dan dicatat. Jika unit berhasil melewati semua test case, maka dianggap berfungsi sesuai spesifikasi. Jika ada kegagalan, dilakukan debugging dan perbaikan kode, lalu dilakukan pengujian ulang. Evaluasi ini juga penting untuk dokumentasi dan pelacakan regresi di masa depan.
Tools yang Digunakan dalam Unit Testing
Dalam praktik pengujian unit, para pengembang perangkat lunak umumnya memanfaatkan berbagai tools otomatisasi untuk mempercepat proses pengujian, meningkatkan konsistensi, serta memudahkan dokumentasi hasil pengujian. Tools ini biasanya disesuaikan dengan bahasa pemrograman atau framework yang digunakan dalam pengembangan perangkat lunak. Beberapa tools populer untuk unit testing antara lain:
JUnit (Java)
JUnit adalah framework testing berbasis Java yang sangat umum digunakan dalam pengujian unit untuk aplikasi Java. JUnit mendukung anotasi khusus seperti @Test, serta integrasi dengan berbagai build tool seperti Maven dan Gradle. JUnit membantu memfasilitasi pengujian fungsi, metode, dan class secara otomatis dan terisolasi.
NUnit (.NET)
NUnit merupakan framework testing untuk .NET yang mendukung bahasa seperti C# dan VB.NET. Tool ini sangat mirip dengan JUnit dalam hal struktur dan pendekatannya terhadap pengujian unit. NUnit memungkinkan pengujian otomatis terhadap berbagai komponen aplikasi berbasis .NET, serta mudah diintegrasikan dengan Visual Studio.
PyTest (Python)
PyTest adalah salah satu framework testing paling populer di komunitas Python. Framework ini mendukung penulisan test case yang sederhana namun ekspresif, serta dapat digunakan untuk pengujian unit, integrasi, dan fungsional. PyTest juga kompatibel dengan plugin tambahan yang memperluas fungsionalitasnya.
PHPUnit (PHP)
PHPUnit adalah framework testing yang umum digunakan dalam proyek berbasis PHP. Dengan struktur dan fitur yang menyerupai JUnit, PHPUnit mendukung pengujian metode dan class, serta integrasi dengan framework PHP seperti Laravel dan Symfony.
Go Testing Package (Go)
Dalam bahasa Go (Golang), terdapat paket testing bawaan yang memungkinkan pengembang menulis unit test tanpa perlu menginstal framework eksternal. Pengujian dilakukan dengan menuliskan fungsi yang diawali dengan kata Test.
TestNG (Java)
TestNG adalah alternatif JUnit untuk Java, dengan fitur tambahan seperti parameterisasi test case, pengelompokan pengujian, dan pengaturan prioritas. TestNG cocok untuk proyek berskala besar yang membutuhkan kontrol lebih dalam pelaksanaan testing.
C. Black Box Testing
Pengertian Black Box Testing
Black box testing adalah suatu metode pengujian software, fungsionalitas blackbox testing tanpa berlandaskan detail implementasi, jalur internal maupun struktur kode. Pengujian pada kasus blackbox testing hanya meninjau baik itu input maupun output aplikasi. Sepenuhnya akan berbasis persyaratan software dan spesifikasi. Pengujian ini dilakukan untuk memvalidasi apakah perangkat lunak dapat menerima input yang benar dan menghasilkan output yang diharapkan sesuai dengan spesifikasi yang telah ditentukan.
Dalam pengujian ini, penguji tidak perlu memiliki pengetahuan teknis tentang bahasa pemrograman yang digunakan dalam pembuatan perangkat lunak. Oleh karena itu, ini sering digunakan oleh tim pengujian yang terdiri dari orang-orang dengan latar belakang non-teknis.
Tipe-Tipe Black Box Testing
Tes Functional
Salah satunya yaitu tes functional, tipe pengujian blackbox ini menitikberatkan kepada sisi fungsionalitas fitur secara spesifik. Misal mengecek performa fungsi login memakai data username/ password user. Pengujian ini berguna juga menjaga keamanan suatu program.
Functional testing fokus kepada aspek-aspek yang penting dalam sistem perangkat lunak berikut dengan integrasinya dengan berbagai komponen utama. Bisa juga pengujian dilakukan secara lebih luas sehingga dapat mencakup keseluruhan sistem yang dites.
Tes Non-Functional
Tipe black box testing selanjutnya yaitu non functional, fokusnya kepada fitur tambahan atau fungsi tambahan perangkat lunak dengan peran non fungsional. Adanya non-functional testing bisa menguji kemampuan suatu aplikasi dalam melakukan run task tertentu. Pihak penguji bisa tahu software tersebut mampu dioperasikan dengan optimal atau masih belum. Pengujian blackbox testing ini bisa mencakup OS, resolusi layar, jenis perangkat, dan bidang lainnya.
Tes Regression
Untuk pengujian regression, proses pengecekan dilakukan sesuai kedua kategori aspek di atas yaitu functional dan juga non-functional. Tes regression bertujuan xmeninjau kemungkinan terjadinya adanya “kemunduran” ketika sudah dilakukan upgrade versi software ke yang terbaru.
Contoh pengujian yang paling sederhana dari sisi functional yaitu pengecekan fungsi fitur tertentu yang masih kurang baik performanya pada versi terbaru. Sementara kalau pengujian dilakukan sesuai aspek non-functional, bisa berupa pengecekan performa secara keseluruhan untuk versi aplikasi yang sudah di-upgrade.
Teknik- Teknik Utama Black Box Testing
All Pair Testing
Tes ini akan menguji keseluruhan data diskrit kombinasi yang memungkinkan. Ada pun data diskrit itu merupakan data dengan nilai terbatas dan pasti, bisa berbentuk bilangan ganjil atau bulat. Metode kombinasi tersebut digunakan untuk uji aplikasi dengan input centang, tombol radio, kotak teks, kotak daftar, dan berbagai input lain sebagainya.
Decision Table
Teknik selanjutnya untuk black box testing adalah decision table. Decision table dilakukan dengan memakai pendekatan sistematis, kombinasi input akan dirangkum dalam tabel. Teknik decision table ideal untuk tes fungsi dengan hubungan logis lebih dari satu input.
Contohnya misal ingin masuk ke Tiktok, sebelumnya diminta input kata sandi dan e-mail yang sudah disimpan Tiktok. Kalau kita menginput data-data ini dengan benar, akan diarahkan ke Beranda. Tapi kalau Andin salah, tetap ada pada halaman masuk/ login.
Equivalence Partitioning
Equivalence partitioning merupakan teknik yang membagi data ke dua bagian (data input), nilai yang valid dan tidak valid atau invalid. Pengujian equivalence partitioning dilakukan secara terpisah. Bagian-bagian tersebut perlu menunjukkan perilaku serupa agar pengujian ini berhasil.
Boundary Value
Selanjutnya ada boundary value, uji error ini dilakukan untuk nilai batas bawah & atas variabel. Contoh variabel nilai ulangan, minimumnya 70 dan 100 sebagai batas atasnya. Teknik seperti ini dipakai karena ada banyak aplikasi dengan masalah nilai batas, tapi yang paling sering adalah permasalahan batas atasnya.
State Transition
Kegunaan state transition pada black box testing adalah mencari tahu fungsi software mampu bekerja kalau mendapatkan input berbeda. Keadaan output pada sistem bisa saja berubah tergantung kondisi terkait. Uji atau teknik state transition dipakai pada aplikasi dengan hasil percobaan tertentu dalam mengakses aplikasi. Contohnya misal kalau pengguna keliru memasukkan PIN berkali-kali, output-nya yaitu pemblokiran PIN secara sendirinya
Cause-Effect
Cause-effect menggunakan grafik dalam penggambaran hubungan efek dan penyebab error.
Error Guessing
Pada cara kerja black box testing satu ini, dilakukan identifikasi error untuk aplikasi yang didasarkan kepada pengetahuan dan pengalaman pihak penguji.
Use Case
Teknik pengujian black box testing selanjutnya yaitu Use Case. Kegunaannya yaitu menguji tiap fungsi software, caranya dengan menjalankan sistem terkait mulai tahap awal sampai yang paling akhir.
Fuzzing
Teknik pengujian perangkat lunak yang digunakan untuk menemukan kesalahan, bug, dan kerentanan dalam aplikasi komputer. Fuzzing melibatkan input data yang tidak valid atau tidak diharapkan ("fuzz") secara sengaja ke dalam program hingga program tersebut mogok atau mengalami kebocoran memori. Pengembang kemudian dapat menentukan bagian mana dari kode sumber aplikasi yang menyebabkan kesalahan ini dan menambalnya.
Cause Effect Graph
Teknik ini menggunakan grafik untuk menggambarkan hubungan antara penyebab dan efek dari error. Grafik ini membantu penguji memvisualisasikan skenario pengujian.
Orthogonal Array Testing
Teknik ini menggunakan grafik untuk menggambarkan hubungan antara penyebab dan efek dari error. Grafik ini membantu penguji memvisualisasikan skenario pengujian.
D. White Box Testing
a. Pengertian WHITE BOX TESTING
White box testing adalah metode pengujian perangkat lunak yang berfokus pada pemeriksaan struktur internal, logika, dan alur program secara langsung. Dalam pengujian ini, penguji memiliki akses penuh terhadap kode sumber dan menggunakan pengetahuannya untuk merancang dan menjalankan pengujian berdasarkan bagaimana sistem bekerja secara internal. Tujuan utama dari white box testing adalah memastikan bahwa seluruh bagian dari kode program, termasuk percabangan logika, perulangan, serta kondisi-kondisi tertentu, telah diuji secara menyeluruh untuk mendeteksi adanya kesalahan logika, kode yang tidak pernah dijalankan (dead code), dan potensi kesalahan lainnya.
Bentuk-Bentuk White Box Testing
White box testing memiliki beberapa bentuk atau teknik utama, yaitu:
Statement Coverage: Menguji setiap baris kode untuk memastikan bahwa semua baris dijalankan minimal satu kali.
Branch Coverage: Menguji semua cabang logika seperti if dan else agar setiap kemungkinan kondisi diuji.
Condition Coverage: Memastikan bahwa setiap kondisi logika, baik true maupun false, diuji.
Path Coverage: Menguji semua jalur eksekusi unik dalam program dari awal hingga akhir.
Loop Testing: Menguji struktur perulangan dengan berbagai jumlah iterasi (tidak masuk loop, satu kali, banyak kali, dan batas maksimum).
Langkah-Langkah White Box Testing
Langkah-langkah pelaksanaan white box testing adalah sebagai berikut:
Menganalisis kode sumber untuk memahami alur logika dan struktur program.
Membuat diagram alur atau flowchart guna mengidentifikasi semua jalur logika.
Menentukan jenis teknik white box testing yang akan digunakan (statement, branch, dll).
Membuat test case berdasarkan jalur, kondisi, dan logika yang telah dipetakan.
Menjalankan test case terhadap program dan mencatat hasil uji.
Melakukan evaluasi terhadap bagian-bagian kode yang belum teruji atau gagal, lalu memperbaikinya dan menguji ulang.