Software Testing
Tujuan (Objektives)
Testing adalah proses eksekusi program yang bertujuan untuk menemukan error Sebuah test yang baik adalah yang mempunyai kemungkinan besar menemukan error yang sebelumnya tidak terdeteksi Sebuah test dikatakan sukses jika dapat menemukan error yang tidak ditemukan sebelumnya
Prinsip Testing
Semua test seharusnya dapat dilacak dengan requirement dari customer Testing seharusnya direncanakan Memenuhi prinsip pareto (80 % error dapat ditemukan dengan tracing 20 % modul dalam program) Dimulai dengan “kecil” dan berlanjut ke yang “besar” Testing yang lengkap (exhaustive) tidak dimungkinkan Agar efektif, testing dapat dilakukan oleh pihak ketiga
Testability
Seberapa mudah sebuah program dapat ditest Operability Æ “semakin baik sistem bekerja, semakin efisien sistem di test” Observability Æ “Apa yang Anda lihat adalah apa yang Anda Test” Controllability Æ “semakin baik software dapat dikontrol, testing semakin dapat diotomasi dan lebih optimal” Decomposability Æ Dengan mengontrol scope dari testing, kita dapat mengisolasi masalah lebih cepat dan melakukan testing ulang dengan lebih smart
Testability (2)
Simplicity Æ Semakin sedikit yang di test, semakin cepat kita dapat melakukan pengetesan Stability Æ Semakin sedikit perubahan, semakin sedikit gangguan terhadap pengetesan Understanbility Æ semakin banyak informasi yang kita dapatkan, semakin smart kita melakukan testing
Good Test [Kaner, Falk & Nguyen]
Probabilitas tinggi menemukan error Tidak redundant “best of breed” Æ subset test untuk mengetes groups of tests yang mirip Tidak terlalu sederhana dan tidak terlalu kompleks
Test Information Flow
What Testing Shows errors Kesesuaian dengan requirement Performance (kinerja)
Indikasi dari kualitas
Siapa Melakukan Testing
developer Understands the system but, will test "gently" and, is driven by "delivery"
independent tester Must learn about the system, but, will attempt to break it and, is driven by quality
Exhaustive Testing
loop <= 20 X
14
There are 10 possible paths! If we execute one test per millisecond, it would take 3,170 years to test this program!!
Selective Testing Selected path
loop < 20 X
Test Case Design "Bugs lurk in corners and congregate at boundaries ..." Boris Beizer OBJECTIVE
to uncover errors
CRITERIA
in a complete manner
CONSTRAINT with a minimum of effort and time
Software Testing White-box testing: Mengetahui internal dari software, design test dijalankan pada semua internal dari software untuk memastikan mereka beroperasi berdasarkan spesifikasi dan design. Fokus utama: internal structures, logic paths, control flows, data flows internal data structures, conditions, loops, etc.
Black-box testing: Mengetahui fungsi spesifik dari software, design test untuk mendemonstrasikan setiap fungsi dan mengecek apakah terjadi error atau tidak Fokus utama: functions, operations, external interfaces, external data and information
White-Box Testing
Sering disebut juga glass-box testing, merupakan metode testing yang menggunakan kontrol struktur dari rancangan prosedural untuk melakukan test case. Testing dilakukan untuk memastikan: 1. 2.
3. 4.
Semua path independen di eksekusi paling tidak sekali Semua keputusan logikal dieksekusi untuk path yang benar dan yang salah Semua loop dieksekusi pada semua nilai batasnya Semua struktur data internal dicoba untuk memastikan kevalidan
Basis-Path testing & Control Structure Testing
Mengapa White-Box Testing ?
Banyak error dalam “special case” code yang jarang dieksekusi Control Flow tidak dapat diprediksi secara akurat dalam black-box testing. Typos error dapat terjadi dimana saja !
Basis-Path Testing
Proposed by Tom McCabe Bertujuan untuk melakukan pengukuran kompleksitas logikal dari rancangan prosedur dan menggunakannya sebagai guide untuk menentukan set dari path yang dieksekusi Basic set akan dieksekusi oleh setiap statement paling tidak sekali Isu w w w
Flow Graph Notation Cyclomatic Complexity Deriving Test Cases Graph Matrices
Flow Graph Notation
Pada a flow graph: w w w w
w
Panah disebut edges menggambarkan flow of control Lingkaran disebut nodes, menggambarkan satu atau lebih aksi Area yang dibatasi oleh edges dan nodes diebut regions Predicate Nodes adalah nodes yang mengandung kondisi
Setiap procedural design dapat ditranslasikan ke flow graph notation
Cyclomatic Complexity
Memberikan ukuran kuantitatif dari kompleksitas logikal. Nilainya memberikan jumlah dari independent path dalam basis set dan upper bound dari jumlah test untuk memastikan bahwa setiap statement dieksekusi paling tidak satu kali. Independent path adalah setiap path pada program yang mengenalkan paling tidak satu set baru statement yang sedang diproses atau kondisi baru (mis. Edge baru)
Cyclomatic Complexity (2) Example has: •Cyclomatic Complexity of 4. Dihitung dari: 1.Number of regions of flow graph. 2.#Edges - #Nodes + 2 3.#Predicate Nodes + 1 •Independent Paths: 1.1, 8 2.1, 2, 3, 7b, 1, 8 3.1, 2, 4, 5, 7a, 7b, 1, 8 4.1, 2, 4, 6, 7a, 7b, 1, 8 Cyclomatic complexity menyediakan upper bound untuk jumlah test yang dibutuhkan yg dapat menjamin melingkupi semua statements dalam program.
Deriving Test Case
Gunakan design atau code, gambarkan flow graph Tentukan cyclomatic complexity dari flow graph Tentukan basis set dari independent path Siapkan test case yang akan memaksa eksekusi dari setiap path dalam basis set
Note. Beberapa path mungkin hanya dapat dieksekusi sbg bagian dari test yang lain.
Matriks Graph Dapat mengotomatisasi turunan dari flow graph dan menentukan set dari basis path Graph matrix:
w
w w w
Adalah bujursangkar dengan #sides sama dengan #nodes Baris dan kolom menggambarkan nodes Isi matriks menggambarkan edges Gunakan nilai 1 untuk menghitung cyclomatic complexity w
w
Untuk setiap baris, jumlahkan nilai kolom dan kurangkan dengan 1 Jumlahkan totalnya dan tambahkan dgn 1 = CC
Matriks Graph (2) Link dapat diberikan bobot, sehingga dapat menentukan:
Probabilitas bahwa sebuah link (edge) akan dieksekusi Waktu proses yang dihabiskan selama mengunjungi sebuah link Memory dan resource yang dibutuhkan selama mengunjungi sebuah link
Control Structure testing Condition Testing
Condition testing bertujuan untuk melatih seluruh kondisi logika dalam modul program Ddapat mendefinisikan: w
w
w
w
Relational expression: (E1 op E2), dimana E1 dan E2 adalah ekspresi aritmatika. Simple condition: variabel Boolean atau ekspresi relational, kemungkinan didahului dengan sebuah operator NOT. Compound condition: Gabungan dari dua atau lebih kondisi sederhana, operator Boolean dan parentheses. Boolean expression: kondisi tanpa ekspresi relational.
Control Structure testing
Errors dalam ekspresi dapat berdasarkan pada: w w w w w
Boolean operator error Boolean variable error Boolean parenthesis error Relational operator error Arithmetic expression error
Metode condition testing fokus kepada testing setiap kondisi dalam program
Control Structure testing Strategi meliputi:
Contoh 1: C1 = B1 & B2 dimana B1, B2 adalah boolean conditions.
w
w
Branch testing – eksekusi setiap branch paling tidak satu kali. Domain Testing – menggunakan tiga atau empat test untuk setiap operator relational. Branch and relational operator testing - menggunakan condition constraints
Condition constraint of form (D1,D2) where D1 and D2 can be true (t) or false(f). The branch and relational operator test membutuhkan constraint set {(t,t),(f,t),(t,f)} yang harus ditemukan dengan eksekusi dari C1.
Pencakupan constraint set menjamin deteksi dari relational operator errors.
Loop Testing
Fundamental loop bagi banyak algoritma Dapat mendefinisikan loop dengan simple, concatenated, nested, dan unstructured. Examples:
Loop Testing Simple Loops dengan ukuran n:
w
Skip loop entirely Only one pass through loop Two passes through loop m passes through loop where m
Nested Loops
w
Start with inner loop. Set all other loops to minimum values. Conduct simple loop testing on inner loop. Work outwards Continue until all loops tested.
Loop Testing Concatenated Loops
w
w
If independent loops, use simple loop testing. If dependent, treat as nested loops.
Unstructured loops Don't test - redesign.