Fundamentals of Software Testing
๐ Fundamentals of Software Testing
Modul Ajar Software Engineering Materi komprehensif tentang dasar-dasar software testing โ dari konsep, prinsip, teknik, hingga praktik defect identification dan tracking.
๐ Table of Contents
- Software Quality
- Objectives and Importance of Software Testing
- Levels of Testing
- Types of Testing
- Testing Techniques
- Test Planning and Design
- Test Case Development and Execution
- Defect Identification
- Defect Reporting and Tracking
- Glossary
- Referensi & Bacaan Lanjutan
1. Software Quality
Software quality bukan sekadar "tidak ada bug." Ia adalah konsep multidimensi yang mencakup berbagai aspek mulai dari kualitas kode di dalam hingga pengalaman pengguna di luar.
1.1 Internal vs External Quality
Software quality dibagi menjadi dua dimensi utama:
๐ง Internal Quality
Kualitas yang dilihat dari perspektif developer โ sesuatu yang tidak langsung dirasakan oleh user, tapi sangat menentukan kesehatan jangka panjang software.
Pertanyaan kuncinya:
- Apakah kode terstruktur dengan baik?
- Apakah kode mudah dipahami developer lain?
- Apakah dokumentasinya memadai?
๐ก Analogi: Internal quality seperti pondasi rumah. Penghuni mungkin tidak melihatnya, tapi pondasi yang buruk akan menjadi masalah besar di masa depan.
๐ค External Quality
Kualitas yang dirasakan langsung oleh user saat menggunakan software.
Pertanyaan kuncinya:
- Apakah software stabil dan tidak crash?
- Apakah fitur yang ada sesuai kebutuhan user?
- Apakah antarmukanya nyaman digunakan?
Perbandingan Singkat
Internal quality dilihat oleh developer dan fokus pada kode dan struktur. Dideteksi via code review dan static analysis.
External quality dilihat oleh end user dan fokus pada perilaku serta fungsi. Dideteksi via testing dan user feedback.
Keduanya sama pentingnya โ software bisa terlihat bagus di luar tapi rapuh di dalam, atau sebaliknya.
1.2 Peran Testing
Testing utamanya berfungsi untuk memastikan external quality โ memverifikasi bahwa software berperilaku benar dari sudut pandang pengguna. Tanpa testing yang proper, "fix" bisa saja hanya menyembunyikan masalah, bukan menyelesaikannya.
๐ Worksheet: Software Quality Assessment
Untuk software/aplikasi yang sedang kamu kembangkan atau yang familiar bagimu, isi assessment berikut:
Nama Software: _________________
Internal Quality Assessment:
- Code structure (1-5): ___ โ Alasan: _________________
- Code readability (1-5): ___ โ Alasan: _________________
- Documentation quality (1-5): ___ โ Alasan: _________________
External Quality Assessment:
- Stability/no crashes (1-5): ___ โ Alasan: _________________
- Meets user requirements (1-5): ___ โ Alasan: _________________
- UI/UX quality (1-5): ___ โ Alasan: _________________
Refleksi:
- Aspek mana yang paling perlu ditingkatkan? _________________
- Apa langkah konkret untuk meningkatkannya? _________________
2. Objectives and Importance of Software Testing
2.1 Terminologi Dasar
Tiga istilah ini sering tertukar di percakapan sehari-hari, tapi memiliki makna yang berbeda dalam konteks software engineering formal.
โ ๏ธ Failure
Kondisi yang terlihat dari luar โ ketika sistem tidak berperilaku sesuai ekspektasi.
๐ก Contoh: Aplikasi banking menampilkan error saat user mencoba transfer.
๐ Fault / Defect
Penyebab di dalam kode yang berpotensi menyebabkan failure. Belum tentu langsung terlihat โ baru muncul ketika kondisi tertentu terpenuhi saat eksekusi.
๐ก Contoh: Logika perhitungan bunga yang salah di dalam kode.
๐ค Error / Mistake
Tindakan manusia yang menjadi akar masalah โ yang pada akhirnya menciptakan fault.
๐ก Contoh: Developer salah membaca spesifikasi dan menulis rumus yang keliru.
Hubungan Ketiganya
Error (manusia salah)
โ menghasilkan
Fault/Defect (cacat di kode)
โ jika terpicu saat eksekusi
Failure (sistem gagal berfungsi)
Ketiganya dikelompokkan dalam istilah populer: "Bug"
๐ Testing vs Debugging
Testing = aktivitas mencoba memicu failure. Dilakukan oleh tester/QA, menghasilkan laporan failure.
Debugging = aktivitas mencari penyebab (fault) dari failure. Dilakukan oleh developer, menghasilkan lokasi dan perbaikan fault.
๐ก Analogi: Testing = mendeteksi ada asap. Debugging = mencari sumber apinya.
Contoh Real: Error โ Fault โ Failure
Kasus: Bug di Aplikasi Transfer Bank
Error: Developer salah menginterpretasikan requirement "biaya admin = 1% dari nominal", dan menulis:
admin_fee = transfer_amount // 100 # integer division โ salah!
Fault: Baris kode dengan integer division salah tersimpan di sistem. Untuk transfer Rp 100.000, hasilnya benar (Rp 1.000), tapi untuk Rp 150.500 hasilnya Rp 1.500 (seharusnya Rp 1.505).
Failure: User transfer Rp 550.750. Sistem mendebit biaya admin Rp 5.507 โ bank rugi Rp 0,5 per transaksi. Dikalikan jutaan transaksi per hari, ini kerugian besar.
2.2 Seven Principles of Testing
Principle #1: Testing Shows Presence of Defects
Testing yang berhasil menemukan bug membuktikan ada masalah. Tapi testing yang tidak menemukan bug TIDAK BERARTI software bebas bug.
"Program testing can be used to show the presence of bugs, but never to show their absence." โ Edsger W. Dijkstra
Mengapa testing tidak bisa membuktikan bebas bug?
- Kombinasi input tak terbatas
- Kompleksitas sistem yang tinggi
- Keterbatasan waktu dan biaya
- Lingkungan eksekusi yang berbeda-beda
Principle #2: Exhaustive Testing is Impossible
Menguji semua kemungkinan input secara matematis tidak feasible.
Bukti matematis sederhana:
Bayangkan fungsi sederhana dengan 1 input string maksimal 26 karakter lowercase + simbol. Jumlah kombinasi inputnya astronomis. Bahkan dengan komputer berkecepatan 1 zettaFLOPS (10ยฒยน operasi/detik), testing exhaustive butuh sekitar 8 miliar tahun untuk selesai.
Sebagai pembanding, supercomputer tercepat saat ini (El Capitan) "hanya" mampu 1,8 ExaFLOPS (10ยนโธ operasi/detik) โ masih 1.000x lebih lambat dari kecepatan yang diasumsikan di atas.
Solusinya: gunakan strategi cerdas seperti equivalence partitioning, boundary value analysis, dan risk-based testing.
Principle #3: Start Testing Early
Testing bukan tahap akhir dalam SDLC, melainkan harus dimulai sedini mungkin.
Manfaatnya:
- Tests bisa memandu desain (Test-Driven Development)
- Feedback diperoleh secepat mungkin
- Bug ditemukan saat paling murah diperbaiki
- Bug ditemukan saat belum menyebabkan kerusakan luas
Biaya memperbaiki bug meningkat eksponensial:
Bug ditemukan saat requirements โ biaya sangat murah, cukup ubah dokumen. Bug ditemukan saat coding โ perlu refactor kode. Bug ditemukan saat testing โ perlu fix + retest. Bug ditemukan saat production โ biaya paling mahal, melibatkan hotfix, reputasi, dan potensi kerugian bisnis.
Principle #4: Defects Are Usually Clustered
Bug cenderung mengelompok di area-area tertentu โ sekitar 80% bug datang dari 20% modul (Pareto Principle).
"Hot" components yang rawan defect:
- Modul yang sering diubah (frequent change)
- Modul dengan logika kompleks (tricky logic)
- Modul yang dikerjakan developer kurang berpengalaman
- Modul dengan requirement yang tidak jelas
- Modul besar (banyak baris kode)
- Fitur baru/inovatif
Implikasinya: alokasikan effort testing lebih banyak ke area "hot" tersebut.
๐ก Analogi: Polisi menempatkan lebih banyak personel di area rawan kejahatan, bukan menyebar merata di seluruh kota.
Principle #5: The Pesticide Paradox
"Every method you use to prevent or find bugs leaves a residue of subtler bugs against which those methods are ineffectual." โ Boris Beizer
Test suite yang terus dijalankan tanpa diubah akan kehilangan efektivitasnya. Bug-bug yang lolos dari testing rutin adalah bug yang sudah "resisten" terhadap metode tersebut.
Solusi โ Variation in Testing:
- Update test cases secara berkala
- Gunakan teknik testing yang berbeda-beda
- Libatkan tester yang berbeda
- Tambahkan input data baru
- Lakukan exploratory testing
- Adopsi pendekatan baru (fuzzing, mutation testing, dll)
Principle #6: Testing is Context-Dependent
Strategi testing harus disesuaikan dengan karakteristik aplikasi:
- Aplikasi life-critical (sistem medis, avionik) โ testing sangat menyeluruh
- Aplikasi e-commerce โ fokus performance dan usability
- Game mobile โ device compatibility dan crash handling
- Prototype/MVP โ testing dasar untuk validasi konsep
Faktor yang memengaruhi: jenis aplikasi, tingkat kekritisan, regulasi industri, target user, teknologi, anggaran, dan tahap proyek.
Principle #7: Verification is Not Validation
Verification = "Are we building the software RIGHT?" โ cek terhadap dokumen/spesifikasi.
Validation = "Are we building the RIGHT software?" โ cek terhadap kebutuhan user.
๐ก Contoh: Software yang lulus verification (sesuai dokumen) tapi gagal validation (tidak memenuhi kebutuhan user) = produk salah yang dibangun dengan cara benar. Sering terjadi karena requirement awalnya tidak menggambarkan kebutuhan sebenarnya.
2.3 Primary Objectives of Testing
Empat tujuan utama yang saling berkaitan:
- Defect Identification โ mendeteksi dan mengeliminasi error untuk reliability
- Quality Assurance โ memastikan software memenuhi requirements & ekspektasi
- Verification & Validation โ produk dibangun benar (verification) dan memenuhi kebutuhan user (validation)
- Risk Mitigation โ mengurangi risiko teknis, bisnis, reputasi, dan keselamatan
๐ Worksheet: 7 Principles Reflection
Untuk setiap prinsip, identifikasi bagaimana ia berlaku di proyekmu:
Project: _________________
-
Testing shows presence of defects: Bagaimana cara tim memastikan tidak terjebak fallacy "tidak ada bug ditemukan = software bebas bug"? _________________
-
Exhaustive testing is impossible: Strategi heuristic apa yang digunakan untuk memilih test case? _________________
-
Start testing early: Pada fase apa testing pertama kali dilakukan di proyekmu? _________________
-
Defects are clustered: Modul mana yang paling "hot" (rawan bug) di proyekmu? _________________
-
Pesticide paradox: Kapan terakhir kali test suite di-refresh atau ditambah? _________________
-
Testing is context-dependent: Apa konteks unik proyekmu yang mempengaruhi strategi testing? _________________
-
Verification is not validation: Bagaimana cara tim memvalidasi bahwa produk memenuhi kebutuhan user nyata? _________________
3. Levels of Testing
Software testing dilakukan di berbagai level โ dari komponen terkecil hingga sistem secara utuh.
3.1 Unit Testing
Fokus: komponen individual (fungsi, method, kelas) dalam isolasi.
Yang diuji adalah unit terkecil dari kode. Dependensi (database, API eksternal, service lain) biasanya di-mock atau di-stub.
Siapa yang melakukan: developer sendiri.
Tools populer:
- Java โ JUnit, TestNG
- JavaScript โ Jest, Mocha, Vitest
- Python โ pytest, unittest
- C# โ NUnit, xUnit
- PHP โ PHPUnit
Contoh test case untuk fungsi login(username, password):
def test_login_valid_credentials():
result = login("user@test.com", "ValidPassword123")
assert result.success == True
assert result.token is not None
def test_login_wrong_password():
result = login("user@test.com", "WrongPassword")
assert result.success == False
assert result.error == "Invalid credentials"
Karakteristik unit test yang baik (F.I.R.S.T):
- Fast โ cepat (milidetik per test)
- Independent โ tidak bergantung pada test lain
- Repeatable โ hasilnya konsisten
- Self-validating โ pass/fail jelas
- Timely โ ditulis bersamaan kode produksi
๐ก Tip: Unit testing tidak selalu wajib โ untuk prototype yang akan dibuang, ini overkill. Tapi untuk produk production jangka panjang, ini investasi yang wajib.
3.2 Integration Testing
Fokus: interaksi antar komponen yang sudah terintegrasi.
Yang diuji bukan komponen individual, tapi bagaimana mereka berkomunikasi dan bekerja sama.
Contoh masalah yang ditemukan integration testing:
- Format data tidak cocok (komponen A kirim JSON, komponen B harapkan XML)
- Asumsi yang salah antar komponen
- Timing/concurrency issues
- Versi library yang berbeda
- Network/IO problems
Pendekatan integration testing:
- Big Bang โ semua modul digabung sekaligus
- Top-Down โ mulai dari level atas, modul bawah pakai stubs
- Bottom-Up โ mulai dari level bawah, modul atas pakai drivers
- Sandwich/Hybrid โ kombinasi top-down dan bottom-up
- Incremental โ modul ditambahkan satu per satu
Tools populer:
- Postman/Insomnia (API testing)
- REST Assured (Java)
- Supertest (Node.js)
- TestContainers (spawn database/service di Docker)
- WireMock (simulate API eksternal)
3.3 System Testing
Fokus: seluruh sistem yang sudah terintegrasi penuh, diuji end-to-end.
Contoh: menguji seluruh alur e-commerce dari user buka aplikasi โ search produk โ add to cart โ checkout โ payment โ konfirmasi.
System testing mencakup:
- Functional testing โ apakah semua fitur bekerja sesuai requirement?
- Performance testing โ apakah cukup cepat di bawah beban?
- Security testing โ apakah aman dari serangan?
- Usability testing โ apakah mudah digunakan?
- Compatibility testing โ apakah berjalan di berbagai browser/device/OS?
Siapa yang melakukan: tim QA independen, bukan developer yang menulis kodenya, untuk menghindari bias.
3.4 Acceptance Testing
Fokus: validasi dari perspektif end user โ apakah software layak diterima?
Alpha Testing
Dilakukan internal oleh tim non-development (sales, operasional, stakeholder). Lingkungan masih controlled.
Beta Testing
Dilakukan eksternal oleh sekelompok user nyata. Software sudah cukup stabil untuk production-like environment.
๐ก Contoh: Google Chrome Beta, game "Open Beta" sebelum launch resmi.
Jenis acceptance testing:
- User Acceptance Testing (UAT) โ paling umum
- Business Acceptance Testing (BAT) โ fokus kebutuhan bisnis
- Regulatory Acceptance Testing โ untuk industri yang diatur ketat
- Contract Acceptance Testing โ berdasarkan kontrak
๐ก Analogi level testing: Unit = chef cek setiap bahan. Integration = chef cek bahan-bahan dimasak bersama. System = chef cicipi hidangan jadi. Acceptance = tamu yang menentukan apakah hidangan layak disajikan.
๐ Worksheet: Map Test Levels to Your Project
Untuk satu fitur di proyekmu, identifikasi test di setiap level:
Fitur: _________________ (contoh: "Login dengan Google OAuth")
Unit Test:
- Komponen yang diuji: _________________
- Test case: _________________
- Tool yang digunakan: _________________
Integration Test:
- Komponen yang berinteraksi: _________________
- Skenario interaksi: _________________
- Tool yang digunakan: _________________
System Test:
- End-to-end scenario: _________________
- Aspek yang diuji (functional/performance/dll): _________________
Acceptance Test:
- Siapa yang melakukan testing: _________________
- Acceptance criteria: _________________
4. Types of Testing
Kalau levels of testing membahas seberapa besar cakupan, types of testing membahas apa yang diuji dan bagaimana.
4.1 Functional Testing
Memvalidasi bahwa software berfungsi sesuai requirements.
Fokusnya pada output:
- Output correctness โ apakah hasilnya benar?
- Feature interactions โ apakah fitur bekerja saat digunakan bersama?
- User workflows โ apakah alur penggunaan benar?
Contoh: memastikan tombol "Submit" di form pendaftaran mengarahkan user ke halaman konfirmasi setelah validasi sukses.
๐ก Pertanyaan kunci: "Apakah software melakukan apa yang seharusnya dilakukan?"
4.2 Non-Functional Testing
Menguji atribut kualitas dari software โ bukan fitur, tapi karakteristik bagaimana sistem beroperasi.
Yang dinilai antara lain:
- Performance โ seberapa cepat?
- Security โ seberapa aman?
- Usability โ seberapa mudah digunakan?
- Reliability โ seberapa andal?
- Scalability โ apakah bisa tumbuh?
Contoh: mengukur seberapa cepat halaman web dimuat saat traffic tinggi.
๐ก Pertanyaan kunci: "Seberapa baik software melakukan apa yang seharusnya dilakukan?"
4.3 Regression Testing
Memastikan perubahan kode baru tidak merusak fungsionalitas yang sudah ada.
Dilakukan setiap kali ada perubahan: bug fix, fitur baru, refactoring, update dependency.
Contoh: setelah update fitur login (tambah login Google OAuth), semua workflow terkait login harus ditest ulang:
- Login biasa masih berfungsi
- Reset password masih berfungsi
- Remember me masih berfungsi
- Logout masih berfungsi
๐ก Tip: Regression testing sangat ideal untuk diotomasi karena repetitif dan perlu dijalankan berulang kali.
4.4 Performance Testing
Mengevaluasi kecepatan, stabilitas, dan responsivitas sistem.
Sub-jenis performance testing:
- Load testing โ sistem di bawah beban normal
- Stress testing โ beban yang melebihi kapasitas normal, cari titik batas
- Spike testing โ reaksi terhadap lonjakan traffic tiba-tiba
- Soak/Endurance testing โ sistem dalam jangka panjang, deteksi memory leak
Yang diukur: response time, throughput, resource utilization, stability.
๐ก Hubungan: Performance testing adalah bagian dari non-functional testing, bukan kategori terpisah. Non-functional adalah payungnya, performance adalah salah satu jenisnya.
4.5 Usability Testing
Mengukur seberapa efektif, efisien, dan memuaskan pengalaman user.
Satu-satunya jenis testing yang wajib partisipasi user nyata.
Yang dievaluasi:
- Navigasi โ mudah ditemukan?
- Keterbacaan โ teks dan layout mudah dipahami?
- Alur kerja โ natural?
- Error handling โ pesan error membantu?
- Aksesibilitas โ bisa digunakan semua orang?
Cara melakukan:
- User nyata diminta menyelesaikan tugas tertentu
- Observasi dan rekam interaksi mereka
- Ukur waktu, jumlah klik, frekuensi error
- Tanyakan tingkat kepuasan
๐ Worksheet: Test Types Coverage Plan
Untuk proyek/fitur:
Project: _________________
Functional Testing Plan:
- Fitur yang akan ditest: _________________
- Acceptance criteria: _________________
Non-Functional Testing Plan:
- Aspek yang akan ditest (pilih yang relevan): _________________
- Performance: target response time _________________
- Security: ancaman yang dipertimbangkan _________________
- Usability: target user _________________
- Lainnya: _________________
Regression Testing Plan:
- Frekuensi: _________________
- Otomasi: ya/tidak
- Tools: _________________
Performance Testing Plan:
- Load test: berapa concurrent user? _________________
- Stress test: apa yang dicari? _________________
Usability Testing Plan:
- Jumlah user yang akan dilibatkan: _________________
- Skenario yang akan diuji: _________________
5. Testing Techniques
Teknik testing menjelaskan bagaimana cara tester mendekati dan merancang test case.
5.1 Black-Box Testing
Tester tidak perlu tahu kode internal. Sistem diperlakukan sebagai "kotak hitam" โ hanya input dan output yang diperhatikan.
Cocok untuk:
- Functional testing
- Usability testing
- Acceptance testing
Contoh: menguji form validation tanpa melihat kode. Tester mencoba berbagai input (email tanpa @, password terlalu pendek, field kosong) dan melihat respons.
Keunggulan:
- Bisa dilakukan non-programmer
- Menguji dari sudut pandang user
- Tidak bias terhadap implementasi
Kelemahan:
- Tidak menjamin semua jalur kode ditest
- Sulit comprehensive tanpa tahu struktur internal
5.2 White-Box Testing
Tester harus memahami kode secara mendalam โ struktur, logika, kondisi percabangan, alur data.
Cocok untuk:
- Unit testing
- Integration testing
- Security testing
Contoh: menguji fungsi login dengan memastikan setiap branch kondisi dieksekusi, semua edge case tertangani, tidak ada dead code.
Keunggulan:
- Coverage lebih mendalam
- Efektif untuk bug logika tersembunyi
- Mendeteksi dead code
Kelemahan:
- Butuh skill programming
- Time-consuming untuk sistem besar
- Tester bisa bias
5.3 Grey-Box Testing
Pendekatan hybrid โ tester punya pengetahuan parsial tentang internal sistem.
Cocok untuk:
- Integration testing
- API testing
- Security testing
Contoh: menguji REST API โ tester tahu endpoint dan struktur request/response, tapi tidak tahu detail implementasi server-side.
๐ก Analogi:
- Black-box = menilai rasa makanan tanpa masuk dapur
- White-box = chef yang cek setiap langkah resep dan suhu masakan
- Grey-box = food critic yang tahu cara memasak tapi tetap menilai dari posisi tamu restoran
๐ Worksheet: Choose the Right Technique
Untuk setiap skenario, pilih teknik yang paling cocok dan jelaskan alasannya:
Skenario 1: Tester non-developer akan menguji aplikasi mobile e-commerce baru
- Teknik: _________________
- Alasan: _________________
Skenario 2: Developer ingin memastikan setiap branch di fungsi pembayaran sudah ditest
- Teknik: _________________
- Alasan: _________________
Skenario 3: Tim QA menguji integrasi antara aplikasi mobile dan backend API
- Teknik: _________________
- Alasan: _________________
Skenario 4: Security tester akan melakukan penetration testing
- Teknik: _________________
- Alasan: _________________
6. Test Planning and Design
6.1 What is Test Planning?
Test planning adalah proses mendefinisikan secara terstruktur semua hal yang dibutuhkan sebelum testing dimulai โ scope, tujuan, sumber daya, jadwal, deliverables.
Test planning menjawab:
- Apa yang akan ditest?
- Bagaimana cara mengetesnya?
- Siapa yang akan melakukan?
- Kapan testing dilakukan?
- Berapa banyak resource dibutuhkan?
Steps in Test Planning
1. Define testing scope and objectives
- Fitur apa yang akan ditest?
- Apa yang out of scope dan mengapa?
- Apa tujuan utama testing?
2. Develop test criteria for pass/fail conditions
- Entry criteria โ kondisi sebelum testing dimulai
- Exit criteria โ kondisi yang menandakan testing selesai
- Pass/fail criteria โ kapan test pass dan fail
3. Allocate resources and schedule
- Berapa tester yang dibutuhkan?
- Tools apa yang diperlukan?
- Environment apa yang dibutuhkan?
- Berapa lama waktu untuk tiap fase?
4. Identify potential risks and mitigation strategies
- Risiko umum: fitur belum selesai, environment tidak stabil, tester sakit, requirements berubah, deadline maju
- Setiap risiko harus punya mitigation strategy
6.2 Designing Effective Tests
Use structured test cases dengan komponen lengkap (akan dibahas di section 7).
Incorporate edge cases โ tidak hanya happy path, tapi juga skenario tepi yang jarang terjadi.
6.3 Exhaustive Testing Issue
Mari lihat realita lewat contoh fungsi bus_ticket_price:
def bus_ticket_price(age, ride_datetime, ride_duration, is_public_holiday):
"""
Compute bus ride price:
- Children under 2 ride for free
- Children under 18 and seniors over 65 pay half fare
- All others pay full fare of $3
- Weekday peak (7-9am, 4-6pm): +$1.5 surcharge
- Weekends: flat rate $2 (except children under 2)
- Short trips < 5 min during off-peak weekday: free
- Public holiday: +$2 surcharge (overrides other surcharges)
"""
Untuk exhaustive testing:
- age: 116 nilai (2-117)
- datetime: 1.440 menit/hari ร 1.826 hari (5 tahun)
- ride_duration: 120 nilai
- is_public_holiday: 2 nilai
Total = ~72 miliar test cases.
Bahkan dengan automasi 1.000 test/detik, butuh 2,3 tahun hanya untuk satu fungsi ini.
Kesimpulan: Exhaustive testing tidak feasible. Kita butuh heuristics untuk memilih test case yang paling bernilai.
6.4 Test Design Techniques
Opportunistic / Exploratory Testing
Tester mengeksplorasi sistem secara bebas mengikuti intuisi. Tidak ada script formal.
Cocok untuk:
- Fitur baru tanpa test case
- Waktu sangat terbatas
- Komplemen testing terstruktur
Kelemahan: tidak repeatable dan sulit diukur.
Specification-Based ("Black-box")
A. Equivalence Partitioning
Bagi semua input ke kelompok-kelompok yang diperlakukan sama, lalu test satu nilai dari setiap partisi.
Contoh untuk parameter age di bus ticket:
- Partisi 1: age < 0 โ invalid
- Partisi 2: 0 โค age < 2 โ gratis
- Partisi 3: 2 โค age < 18 โ setengah harga
- Partisi 4: 18 โค age โค 65 โ harga penuh
- Partisi 5: age > 65 โ setengah harga
- Partisi 6: age > 130 โ invalid
B. Boundary Value Analysis (BVA)
Test nilai-nilai di batas partisi karena bug paling sering muncul di sana.
Untuk setiap range, test:
- minimum
- min+1
- medium
- max-1
- maximum
- min-1 (invalid)
- max+1 (invalid)
Contoh untuk batas age=2 (gratis vs setengah harga):
- age = 1 โ gratis (max partisi gratis)
- age = 2 โ setengah harga (min partisi anak)
- age = 3 โ setengah harga (min+1)
๐ก Why it works: Bug klasik = developer salah tulis
<=saat seharusnya<. Bug ini hanya muncul tepat di nilai batas.
C. Category-Partition Method
Formalisasi equivalence partitioning dengan langkah terstruktur:
- Identify parameters
- Determine domains (from spec + not from spec)
- Add constraints to minimize
- Remove invalid combinations
- Reduce exceptional behaviors
- Generate combinations
Contoh tabel untuk bus_ticket_price:
age : <2, [2,17], [18,65], >65
ride_datetime : weekdays peak, weekdays off-peak,
weekends peak, weekends off-peak, ...
ride_duration : <5, >=5
is_public_holiday : F, T
D. Pairwise Testing
Insight: banyak bug muncul dari interaksi 2 parameter. Pairwise testing memastikan setiap pasangan nilai parameter sudah ditest minimal sekali.
Klaim industri: considering pairwise interactions menemukan 50%-90% defect.
Contoh interaksi yang menarik di bus_ticket_price:
- Senior + weekend (2-way) โ apakah lansia di weekend dapat flat rate atau setengah dari flat rate?
- Senior + weekend + peak hour (3-way)
- Adult + long trip + holiday + weekend (4-way)
Tools: PICT (Microsoft), AllPairs (Python), Hexawise.
Penghematan: 4ร4ร2ร2 = 64 full combinations bisa direduksi jadi ~16-20 test cases dengan pairwise.
E. Decision Table Testing
Cocok untuk logika bisnis kompleks dengan banyak kondisi yang berinteraksi.
Format: kondisi di baris atas, aksi di baris bawah, setiap kolom = satu test case.
Contoh untuk sistem diskon e-commerce:
Conditions | C1 | C2 | C3 | C4
Member Premium? | Y | Y | N | N
Pembelian > 500rb? | Y | N | Y | N
Punya Voucher? | Y | Y | N | Y
---
Actions
Diskon 30% | โ
Diskon 20% | | โ | โ
Diskon 10% | | | | โ
Tidak ada diskon |
F. State Transition Testing
Cocok untuk sistem berbasis state machine.
Contoh: Sistem akun bank
States: Active โ Suspended โ Locked โ Closed
Transitions:
- Active โ Suspended: 3 kali gagal login
- Suspended โ Active: Admin reset password
- Suspended โ Locked: Tidak aktif 30 hari
- Locked โ Closed: Request penutupan akun
- Locked โ Active: Verifikasi identitas berhasil
Test case untuk: setiap state, setiap valid transition, invalid transitions, boundary triggers.
G. Use Case Testing
Test case diturunkan langsung dari use case document:
- Main flow (happy path)
- Alternative flows
- Exception flows
Contoh: Use case "Transfer Dana"
- Main: login โ transfer โ input rekening โ input nominal โ konfirmasi โ sukses
- Alternative: pilih rekening favorit โ transfer
- Exception: saldo kurang โ tolak; koneksi terputus โ rollback
H. Error Guessing
Berbasis pengalaman tester โ menebak di mana bug paling mungkin bersembunyi.
Berbasis pengetahuan tentang:
- Common bugs (off-by-one, null pointer, division by zero)
- Historical bugs di area sama
- Developer habits
- Risky areas
Contoh tebakan umum:
- Input 0 di field kalkulasi โ division by zero?
- Spasi di field username โ diterima atau ditolak?
- Klik tombol berkali-kali cepat โ duplicate transaction?
- Karakter spesial di nama file โ crash?
- SQL injection di password โ aman?
Structural ("White-box")
A. Statement Coverage
Pastikan setiap baris kode dieksekusi minimal sekali.
Formula: (Statement dieksekusi / Total statement) ร 100%
Contoh:
def calculate_fare(age, is_holiday):
fare = 3.0 # Statement 1
if age < 2: # Decision A
return 0 # Statement C (jalur True)
if age > 65: # Decision B
fare *= 0.5 # Statement D (jalur True)
if is_holiday: # Decision E
fare += 2.0 # Statement F (jalur True)
return fare # Statement G
Untuk 100% statement coverage, butuh 2 test case:
age=1(mengeksekusi statement 1, A, C)age=70, is_holiday=True(mengeksekusi statement 1, A, B, D, E, F, G)
Kelemahan: tidak menjamin semua branch ditest.
B. Branch Coverage
Pastikan setiap branch (True/False) dari setiap decision dieksekusi.
Untuk fungsi di atas: 3 decision ร 2 branch = 6 branch yang harus ditest.
Butuh 3 test case:
age=1โ True dari Aage=70, is_holiday=Trueโ False dari A, True dari B, True dari Eage=30, is_holiday=Falseโ False dari B, False dari E
๐ก Hierarki coverage: 100% branch coverage menjamin 100% statement coverage, tapi tidak sebaliknya.
C. Condition Coverage (Predicate Coverage)
Lebih dalam dari branch coverage โ memastikan setiap sub-kondisi individual dalam decision sudah pernah True dan False.
Contoh:
if age >= 18 and has_license:
print("Eligible")
Decision ini punya 2 sub-kondisi:
age >= 18has_license
Untuk 100% condition coverage, butuh test agar masing-masing sub-kondisi pernah True dan False:
age=20, has_license=Trueโ keduanya Trueage=17, has_license=Trueโ kondisi 1 Falseage=20, has_license=Falseโ kondisi 2 False
Kenapa ini lebih kuat? Branch coverage bisa dicapai dengan 2 test case yang menutupi seluruh kondisi True/False, tapi tidak menjamin setiap sub-kondisi diuji secara independen.
D. Basis Path Testing & Cyclomatic Complexity
Dikembangkan oleh Tom McCabe (1976).
Steps:
- Buat control flow graph
- Hitung cyclomatic complexity
- Identifikasi independent paths
- Buat test case untuk setiap path
Tiga formula cyclomatic complexity (semuanya menghasilkan nilai sama):
V(G) = P + 1di mana P = jumlah predicate nodesV(G) = E - N + 2di mana E = edges, N = nodesV(G) = jumlah non-overlapping regions
Contoh untuk calculate_fare di atas:
P = 3 (tiga if statements) V(G) = 3 + 1 = 4 independent paths
Independent paths:
- age < 2 โ return 0
- age normal, is_holiday=False โ return fare normal
- age normal, is_holiday=True โ return fare + holiday
- age > 65, is_holiday=False โ return fare * 0.5
Interpretasi nilai cyclomatic complexity:
- 1-10 โ kode sederhana, risiko rendah
- 11-20 โ cukup kompleks, perhatikan
- 21-50 โ sangat kompleks, risiko tinggi
-
50 โ harus direfactor
๐ก Tip: Banyak tim menetapkan cyclomatic complexity maksimum 10 sebagai coding standard.
๐ Worksheet: Apply Test Design Techniques
Skenario: Sistem pendaftaran mahasiswa baru dengan parameter:
age(int)is_local(boolean) โ domestik atau internasionalgpa(float, 0.0-4.0)program(string: "S1", "S2", "S3")
Equivalence Partitioning untuk gpa:
- Partisi invalid bawah: _________________
- Partisi rendah: _________________
- Partisi sedang: _________________
- Partisi tinggi: _________________
- Partisi invalid atas: _________________
Boundary Value Analysis untuk gpa:
- min - 1: _________________
- min: _________________
- min + 1: _________________
- medium: _________________
- max - 1: _________________
- max: _________________
- max + 1: _________________
Pairwise Testing โ identifikasi 5 kombinasi paling kritis:
Cyclomatic Complexity Calculation: Tulis kode singkat yang memvalidasi pendaftaran (dengan if-else berdasarkan parameter di atas), lalu hitung cyclomatic complexity-nya.
def validate_registration(age, is_local, gpa, program):
# tulis kodemu di sini
pass
- Jumlah predicate nodes (P): _________________
- V(G) = P + 1 = _________________
- Berapa minimum test case yang dibutuhkan: _________________
7. Test Case Development and Execution
7.1 Components of a Test Case
Test case yang baik harus memiliki komponen lengkap:
Test ID โ identifikasi unik (contoh: TC-LOGIN-001)
Description โ apa yang diuji dan mengapa
Prerequisites โ kondisi awal yang harus terpenuhi
Steps โ langkah-langkah detail dan berurutan
Expected Results โ apa yang seharusnya terjadi (spesifik dan terukur)
Actual Results โ diisi setelah eksekusi
Status โ Pass / Fail / Blocked
7.2 Contoh Test Case Lengkap
TC-LOGIN-001: Login dengan kredensial valid
- Test ID: TC-LOGIN-001
- Description: Memverifikasi user dengan email dan password valid berhasil login dan diarahkan ke dashboard
Prerequisites:
- Akun dengan email "testuser@binus.ac.id" sudah terdaftar
- Akun dalam status aktif
- Halaman login sudah terbuka
Steps:
- Pada field "Email", masukkan "testuser@binus.ac.id"
- Pada field "Password", masukkan "Test@1234"
- Klik tombol "Login"
Expected Result:
- User berhasil login
- Sistem menampilkan halaman dashboard
- Header menampilkan nama "Test User"
- URL berubah menjadi "/dashboard"
Actual Result: [diisi setelah testing]
Status: [PASS/FAIL/BLOCKED]
7.3 Karakteristik Test Case yang Baik
Atomic โ menguji satu hal spesifik. Jangan gabung banyak skenario.
Independent โ tidak bergantung pada test case lain. Bisa dijalankan mandiri.
Repeatable โ hasilnya konsisten setiap kali dijalankan.
Traceable โ bisa dilacak ke requirement/user story yang diuji.
Clear and Concise โ bahasa jelas, tidak ambigu, bisa dipahami orang yang tidak familiar dengan sistem.
๐ก Analogi: Test case yang baik seperti resep masakan yang detail โ siapa pun yang ikuti akan menghasilkan masakan yang sama.
๐ Worksheet: Write Your Test Cases
Tulis 3 test case lengkap untuk fitur "Reset Password":
TC-RESETPWD-001: [Title]
- Test ID: _________________
- Description: _________________
- Prerequisites: _________________
- Steps:
-
- Expected Result: _________________
TC-RESETPWD-002: [Title]
- Test ID: _________________
- Description: _________________
- Prerequisites: _________________
- Steps:
-
- Expected Result: _________________
TC-RESETPWD-003: [Title โ edge case]
- Test ID: _________________
- Description: _________________
- Prerequisites: _________________
- Steps:
-
- Expected Result: _________________
Self-check:
- Apakah setiap test case Atomic? _________________
- Apakah setiap test case Independent? _________________
- Apakah Expected Result spesifik dan terukur? _________________
8. Defect Identification
8.1 Studi Kasus: Twitter's Week Year Bug
Pada pergantian tahun 2014-2015, Twitter mengalami crash 5 jam karena bug satu huruf di kode Java.
Kode Bermasalah
DateTimeFormatter.ofPattern("dd MMM YYYY").format(zonedDateTime)
Akar Masalah
Java DateTimeFormatter membedakan:
YYYYโ Week-based Year (ISO 8601 Week Year)yyyyโ Calendar Year
ISO 8601 rule: "The first week of the year is the week containing the first Thursday."
Akibatnya: 29-31 Desember 2014 (Senin-Rabu) secara Week Year sudah dianggap "2015" karena minggu mereka mengandung Kamis pertama 2015.
Bug ini hanya muncul pada kondisi yang sangat spesifik (pergantian tahun tertentu), sehingga tidak terdeteksi sepanjang tahun.
Pelajaran dari Twitter Bug
Menghubungkan ke konsep yang sudah dipelajari:
Error โ Fault โ Failure:
- Error: developer pakai
YYYY(typo atau tidak tahu beda) - Fault: format string salah tersimpan di kode
- Failure: aplikasi crash 5 jam
Boundary Value Analysis: tanggal akhir tahun adalah boundary kritis yang harus selalu ditest untuk aplikasi yang menangani tanggal.
Defect Clustering: bug ini hanya muncul di 1 kondisi sangat spesifik dari sejuta kondisi.
8.2 Studi Kasus: Linux Kernel Interrupt Bug
Bug yang sangat sulit ditemukan: sebuah driver function lupa mengaktifkan kembali interrupt setelah dinonaktifkan.
Skala:
- Bug ada di 1 fungsi
- Fungsi itu di file 2.000 LOC
- File itu di modul 60.000 LOC
- Modul itu di Linux Kernel (~27 juta LOC)
Kondisi trigger: sangat langka dan spesifik, hampir mustahil di-trigger dalam testing biasa.
๐ก Pelajaran: Beberapa defect sangat sulit ditemukan via testing atau inspection. Testing yang baik tetap penting, tapi kita harus realistis bahwa tidak ada metode yang menjamin 100% bebas bug.
8.3 Apa itu Static Analysis?
Systematic examination of an abstraction of program state space.
Karakteristik:
- Tidak menjalankan kode (seperti code review tapi otomatis)
- Bekerja pada abstraksi program โ representasi yang disederhanakan
- Bisa menganalisis semua kemungkinan jalur sekaligus
Yang dicek (properti):
- Liveness โ "something good eventually happens" (misal: setiap request akhirnya dapat response)
- Safety โ "this bad thing can't ever happen" (misal: interrupt tidak pernah tetap disabled)
- Compliance โ coding standards dan best practices
8.4 What Static Analysis Can and Cannot Do
โ Bisa dilakukan dengan baik
Type checking โ mendeteksi tipe data yang salah. Java cegah saat kompilasi, Python pakai mypy untuk warning.
Pattern matching โ mendeteksi pola kode bermasalah:
- Java string comparison pakai
==(harusnya.equals()) - Array access tanpa bounds check
โ ๏ธ Bisa dilakukan tapi sering MAYBE
Value range analysis:
- Apakah pembagi bisa nol?
- Apakah index array bisa out of bounds?
Static analysis menjawab konservatif โ sering false positive.
โ Tidak bisa dilakukan
Membuktikan apakah program pasti berhenti = Halting Problem (Alan Turing, 1936). Secara matematis terbukti tidak ada algoritma yang bisa menjawab ini untuk semua program.
๐ Rice's Theorem (1953)
"Any nontrivial property about the language recognized by a Turing machine is undecidable."
Setiap static analysis tool pasti punya satu atau lebih dari kelemahan ini:
- Incomplete โ ada bug yang tidak dilaporkan (false negative)
- Unsound โ melaporkan bug yang sebenarnya bukan (false positive)
- Undecidable โ tidak bisa jawab pasti (MAYBE)
8.5 Static Analysis Cocok untuk Mendeteksi
Security: buffer overruns, improperly validated input
Memory safety: null dereference, uninitialized data
Resource leaks: memory leak, OS resource leak
API protocols: device drivers, real-time libraries, GUI frameworks
Exceptions: arithmetic, library, user-defined
Encapsulation: akses internal data, panggil private functions
Data races: dua thread akses data sama tanpa synchronization
8.6 Latihan: Analyze Python Statically
def n2s(n: int, b: int):
if n <= 0: return '0'
r = ''
while n > 0:
u = n % b
if u >= 10:
u = chr(ord('A') + u - 10)
n = n // b
r = str(u) + r
return r
Fungsi ini konversi bilangan dari basis 10 ke basis lain.
Pertanyaan static (tanpa eksekusi):
-
Tipe data variabel
u? โ int ATAU str (ubisa int dari modulo, atau str darichr()) -
Bisakah
unegatif? โ NO (Python:n % bikut tanda b; b positif โ u positif) -
Apakah selalu return value? โ YES (semua jalur berakhir return)
-
Bisa division by zero? โ MAYBE (jika b=0 dipanggil,
n%bdann//bcrash. Tidak ada validasi.) -
Return value mengandung '-'? โ NO (semua karakter yang masuk ke r adalah angka positif atau huruf kapital)
8.7 Apa itu Dynamic Analysis?
Tells you properties of the program that were definitely observed.
Berbeda dari static yang sering menjawab MAYBE, dynamic memberikan fakta konkret tentang apa yang benar-benar terjadi saat program dijalankan.
Yang dihasilkan Dynamic Analysis
Code Coverage โ baris/branch/path mana yang dieksekusi
Performance Profiling โ berapa lama setiap bagian kode dieksekusi
Type Profiling โ tipe data aktual yang digunakan saat runtime
Testing โ verifikasi output sesuai ekspektasi
Cara Kerja: Program Instrumentation
Kode tambahan (seperti "logging otomatis") disisipkan ke program. Sedikit memperlambat eksekusi tapi memberikan informasi sangat berharga.
8.8 Latihan: Analyze Python Dynamically
Untuk eksekusi n2s(12, 10):
Trace eksekusi:
- Iterasi 1: u=2, n=12โ1, r='2'
- Iterasi 2: u=1, n=1โ0, r='12'
- Return '12'
Pertanyaan dynamic:
-
Tipe data
uselama eksekusi ini? โ int only (tidak pernah masuk branch chr) -
Apakah
upernah negatif? โ NO (selalu 2 lalu 1) -
Berapa iterasi loop? โ 2 iterasi
-
Pernah division by zero? โ NO (b=10, tidak nol)
-
Return value mengandung '-'? โ NO ('12' tidak ada minus)
8.9 Static vs Dynamic Analysis
Static Analysis
- Hanya butuh source code
- Reasoning konservatif tentang semua input dan path
- Warnings bisa false positive
- Bisa report SEMUA warning untuk kelas masalah tertentu
- Advanced: formal verification (mahal, jarang di CI)
Dynamic Analysis
- Butuh build sukses + test inputs
- Mengamati eksekusi individual
- Reported problems are real (witness input ada)
- Hanya bisa report yang terlihat โ tergantung test input, ada false negative
- Advanced: symbolic execution (mahal, jarang di CI)
๐ก Analogi final:
- Static = X-ray (lihat struktur tanpa "menjalankan", kadang ada bayangan menyesatkan)
- Dynamic = tes darah (hasil pasti dan konkret, tapi hanya untuk sampel yang diambil)
8.10 Tools for Static Analysis
General purpose:
- SonarQube (multi-language, sangat populer di enterprise)
- Coverity (powerful untuk C/C++)
- ESLint (JavaScript)
- Pylint, mypy (Python)
- SpotBugs/FindBugs (Java)
Security focused:
- Snyk
- Semgrep
- Checkmarx
Formal verification:
- Frama-C
- SPARK/Ada (untuk safety-critical)
8.11 Static Analysis is Key Part of CI
Static analysis berjalan otomatis di CI pipeline:
Code โ Commit โ Build โ Unit Tests โ Integration Tests โ Static Analysis
Tools CI: Travis CI, GitHub Actions, Jenkins
Best practice:
- Diff-based analysis (analisis hanya kode yang berubah)
- Integrasi langsung di IDE untuk feedback instan
8.12 Static Analysis di IDE
Static analysis sudah tertanam di IDE modern:
- IntelliJ IDEA (Java)
- PyCharm (Python)
- Xcode (iOS/macOS)
- Eclipse (Java)
- VS Code (dengan extensions)
Developer dapat feedback dalam hitungan detik saat coding โ implementasi ekstrem dari prinsip "Start Testing Early".
8.13 What Makes a Good Static Analysis Tool?
Fast โ tidak boleh memperlambat development velocity. Semakin besar codebase, semakin penting kecepatan.
Few false positives โ terlalu banyak false alarm โ developer mulai mengabaikan semua warning ("alert fatigue").
Continuous โ bagian dari CI pipeline. Diff-based analysis lebih efisien.
Informative โ pesan jelas, lokasi pasti, idealnya menyarankan atau otomatis menerapkan fix.
8.14 Static Analysis Bisa Diaplikasikan ke Semua Atribut
- Find bugs โ Reliability
- Refactor code โ Maintainability
- Keep code stylish โ Readability
- Identify code smells โ Maintainability
- Measure quality โ Quality metrics
- Find usability & accessibility issues โ Usability
- Identify bottlenecks โ Performance
๐ Worksheet: Defect Identification Strategy
Untuk proyek/aplikasi yang sedang dikembangkan:
Project: _________________
Static Analysis Setup:
- Tools yang akan digunakan: _________________
- Integrasi: IDE / CI / both? _________________
- False positive threshold yang acceptable: _________________
Dynamic Analysis Setup:
- Code coverage tool: _________________
- Performance profiler: _________________
- Target coverage minimal: ___% statement, ___% branch
Risk Assessment โ area kritis yang butuh perhatian khusus:
Bug Patterns yang perlu diwaspadai (berdasarkan jenis aplikasi):
- Security: _________________
- Memory: _________________
- Concurrency: _________________
- Lainnya: _________________
9. Defect Reporting and Tracking
9.1 Purpose of Defect Tracking
Defect tracking menyediakan transparansi dan komunikasi sistematis antara tester, developer, dan manajemen tentang status setiap bug yang ditemukan.
Tanpa tracking yang baik:
- Bug bisa "hilang" atau terlupakan
- Tidak ada visibility tentang quality status
- Sulit memprioritaskan pekerjaan
- Komunikasi antar tim chaotic
9.2 Defect Lifecycle
Setiap bug melewati tiga tahap utama:
๐ Identification
- Tester menemukan defect
- Mendokumentasikannya dengan detail
- Memberi prioritas (Critical/High/Medium/Low)
- Submit ke tracking system
๐ง Resolution
- Developer mendapat assignment
- Menganalisis root cause
- Memperbaiki defect
- Melakukan retest internal
- Mark sebagai "Ready for QA"
โ Closure
- Tester memverifikasi fix di environment yang sesuai
- Jika benar-benar fixed โ close
- Jika masih ada masalah โ reopen
9.3 Tools for Defect Tracking
JIRA โ paling populer di industri, fitur lengkap, integrasi luas
Bugzilla โ open source, sudah lama digunakan, banyak project open source
GitHub Issues โ built-in di GitHub, simple dan tight integration dengan code
Lainnya: Trello, Asana, Linear, Azure DevOps
Semua tools ini membantu:
- Mengorganisir bug berdasarkan severity dan prioritas
- Tracking status (Open/In Progress/Resolved/Closed)
- Komunikasi via comments
- Linking ke commits/pull requests
- Reporting dan analytics
9.4 Sample Defect Report
Defect report yang baik harus mencakup:
Defect ID: DEF-2024-0142
Title: Tombol "Submit" pada form pendaftaran tidak responsif setelah 3 kali klik berturut-turut
Description: Ketika user mengklik tombol "Submit" lebih dari 2 kali dalam interval kurang dari 1 detik, tombol menjadi tidak responsif dan tidak mengirim request ke server. Page perlu di-refresh untuk bisa submit lagi.
Steps to Reproduce:
- Buka halaman pendaftaran di /register
- Isi semua field dengan data valid
- Klik tombol "Submit"
- Sebelum response muncul, klik "Submit" 2 kali lagi dengan cepat (interval < 1 detik)
- Tunggu 5 detik
Expected Behavior:
- Klik pertama: form ter-submit, loading indicator muncul
- Klik berikutnya: diabaikan atau menampilkan pesan "Sedang memproses..."
- Tombol tetap responsif setelah proses selesai
Actual Behavior:
- Klik pertama: form ter-submit
- Klik berikutnya: tombol jadi tidak responsif
- Loading indicator tidak muncul
- Page perlu di-refresh
Environment:
- Browser: Chrome 120.0.6099.130
- OS: Windows 11 Pro
- Resolution: 1920x1080
- Network: WiFi stabil
Priority: High
Severity: Medium
Assigned to: John Doe (Frontend Team)
Status: Open
Attachments: screenshot.png, console-log.txt
Reported by: Jane Smith
Reported on: 15 March 2024
๐ Worksheet: Write a Defect Report
Pikirkan satu bug yang pernah kamu temukan (di aplikasi apa saja), lalu buat defect report lengkap:
Defect ID: _________________
Title: _________________
Description:
Steps to Reproduce:
Expected Behavior:
Actual Behavior:
Environment:
- Browser/Device: _________________
- OS: _________________
- Other: _________________
Priority: _________________ (Critical/High/Medium/Low)
Severity: _________________ (Blocker/Major/Minor/Trivial)
Self-check โ apakah report ini:
- โ Reproducible? Bisa diikuti steps-nya?
- โ Specific? Tidak ambigu?
- โ Complete? Semua info penting ada?
- โ Objective? Tidak emosional/blaming?
๐ Glossary
Acceptance Testing โ testing untuk validasi software dari perspektif end user, sebelum release.
Alpha Testing โ acceptance testing internal oleh tim non-development.
Beta Testing โ acceptance testing eksternal oleh user nyata terbatas.
Black-Box Testing โ testing tanpa pengetahuan internal kode.
Boundary Value Analysis (BVA) โ teknik test design fokus pada nilai batas partisi.
Branch Coverage โ metrik white-box, persentase branch (True/False) yang dieksekusi.
Bug โ istilah umum untuk defect/fault/failure.
Cyclomatic Complexity โ metrik kompleksitas kode berdasarkan jumlah independent paths.
Decision Table Testing โ teknik test design untuk logika bisnis dengan banyak kondisi.
Defect โ flaw dalam kode yang berpotensi menyebabkan failure.
Dynamic Analysis โ analisis program dengan menjalankan kodenya.
Equivalence Partitioning โ teknik test design dengan mengelompokkan input ke partisi yang diperlakukan sama.
Error โ kesalahan manusia yang menjadi akar masalah bug.
Exhaustive Testing โ menguji semua kemungkinan input โ secara matematis tidak feasible.
Failure โ deviasi sistem dari behavior yang diharapkan, terlihat dari luar.
Fault โ sinonim dengan defect.
Functional Testing โ testing fitur sesuai requirements.
Grey-Box Testing โ testing dengan pengetahuan parsial tentang internal kode.
Halting Problem โ masalah komputasi yang tidak bisa diselesaikan secara umum, dibuktikan Alan Turing 1936.
Integration Testing โ testing interaksi antar komponen.
Liveness Property โ "something good eventually happens."
MAYBE โ jawaban static analysis untuk pertanyaan yang tidak bisa dijawab pasti.
Non-Functional Testing โ testing atribut kualitas seperti performance, security, usability.
Pairwise Testing โ teknik combinatorial testing yang menguji setiap pasangan parameter values.
Performance Testing โ testing kecepatan, stabilitas, responsivitas.
Pesticide Paradox โ fenomena test suite kehilangan efektivitas jika tidak diupdate.
Regression Testing โ testing untuk memastikan perubahan tidak merusak fungsi yang ada.
Rice's Theorem โ teorema yang membuktikan setiap static analysis pasti incomplete, unsound, atau undecidable.
Risk Mitigation โ pengurangan risiko via testing dan praktik baik.
Safety Property โ "this bad thing can't ever happen."
State Transition Testing โ testing untuk sistem berbasis state machine.
Static Analysis โ analisis program tanpa menjalankan kodenya.
Statement Coverage โ metrik white-box, persentase statement yang dieksekusi.
System Testing โ testing seluruh sistem terintegrasi.
Unit Testing โ testing komponen individual dalam isolasi.
Usability Testing โ testing pengalaman pengguna.
Use Case Testing โ testing berdasarkan use case scenarios.
Validation โ "Are we building the right software?" โ verifikasi terhadap kebutuhan user.
Verification โ "Are we building the software right?" โ verifikasi terhadap spesifikasi.
White-Box Testing โ testing dengan pengetahuan penuh tentang kode internal.
๐ Referensi & Bacaan Lanjutan
Buku Klasik
- "The Art of Software Testing" โ Glenford J. Myers (klasik dasar testing)
- "Software Testing: A Craftsman's Approach" โ Paul C. Jorgensen
- "Lessons Learned in Software Testing" โ Cem Kaner, James Bach, Bret Pettichord
- "Test-Driven Development: By Example" โ Kent Beck
Standar & Sertifikasi
- ISTQB Foundation Level Syllabus โ silabus internasional untuk software tester
- IEEE 829 โ Standard for Software Test Documentation
- ISO/IEC 25010 โ Software Quality Standards
Online Resources
- Ministry of Testing (https://www.ministryoftesting.com) โ komunitas tester global
- Google Testing Blog (https://testing.googleblog.com) โ best practices dari Google
- Martin Fowler's articles on Testing (https://martinfowler.com/testing/)
- OWASP Testing Guide โ untuk security testing
Tools yang Disebutkan dalam Materi
Unit Testing Frameworks:
- JUnit (Java) โ https://junit.org
- pytest (Python) โ https://pytest.org
- Jest (JavaScript) โ https://jestjs.io
Static Analysis:
- SonarQube โ https://www.sonarqube.org
- ESLint โ https://eslint.org
- mypy โ https://mypy.readthedocs.io
- Snyk โ https://snyk.io
CI/CD:
- GitHub Actions โ https://github.com/features/actions
- Jenkins โ https://www.jenkins.io
- GitLab CI โ https://docs.gitlab.com/ee/ci/
Defect Tracking:
- JIRA โ https://www.atlassian.com/software/jira
- Bugzilla โ https://www.bugzilla.org
- GitHub Issues โ built-in di GitHub
Performance Testing:
- JMeter โ https://jmeter.apache.org
- k6 โ https://k6.io
- Gatling โ https://gatling.io
Paper & Theorem yang Direferensikan
- Halting Problem โ Alan Turing (1936), "On Computable Numbers, with an Application to the Entscheidungsproblem"
- Rice's Theorem โ Henry Gordon Rice (1953), "Classes of Recursively Enumerable Sets and Their Decision Problems"
- Cyclomatic Complexity โ Thomas J. McCabe (1976), "A Complexity Measure"
Studi Kasus Real
- Twitter Week Year Bug (2014-2015) โ bug
YYYYvsyyyydi Java DateTimeFormatter - Linux Kernel Driver Bugs โ contoh bug di sistem berskala besar
- Therac-25 (untuk bacaan tambahan) โ contoh klasik konsekuensi software bug di sistem kritis
๐ Catatan Akhir: Modul ini adalah pengantar ke dunia software testing. Praktik testing di industri terus berkembang dengan teknik baru seperti AI-driven testing, chaos engineering, mutation testing, dan property-based testing. Mahasiswa dianjurkan terus mengeksplorasi topik-topik lanjutan ini melalui referensi yang disediakan.
๐ฏ Pesan Penutup: Testing yang baik bukan tentang menjadi pesimis terhadap kode, tapi tentang bersikap profesional terhadap kualitas. Setiap engineer hebat adalah engineer yang memahami bahwa kode mereka akan punya bug โ dan punya strategi sistematis untuk menemukan dan memperbaikinya sebelum sampai ke user.
Software Engineering โ D7123