Testing dan Implementasi
Sistem
Outline
n
White box testing
n
Pembuatan flowgraph
White box testing
n
Adalah testing yang diturunkan dari “pengetahuan”
tentang struktur dan implementasi program
n
Nama lain : glass box, structural, clear box atau
open box testing
n
harus tahu secara detail tentang perangkat lunak
yang akan di uji.
n
Untuk pengujian yang lengkap maka suatu
perangkat lunak harus diuji dengan white box dan
black box testing
White Box Testing menggunakan 3 macam
tahapan testing
1.
Unit Testing
2.
Integration testing
3.
Regression Testing
White box testing
n
Pembuatan testcase didasarkan pada alur logika
Alur logika : cara dimana suatu bagian dari
program tertentu dieksekusi saat menjalankan
program.
n
Alur logika dapat direpresentasikan dengan
Kegunaan
n
Menguji setiap jalur independent
n
Menguji keputusan logic (true atau falsa)
n
Menguji Loops dan batasannya
Komponen flowgraph
•
Nodes (titik)
à
pernyataan (atau sub program) yang
akan ditinjau saat eksekusi program.
•
Edges (anak panah)
à
jalur alur logika program untuk
menghubungkan satu pernyataan (atau sub program)
dengan yang lainnya.
•
Branch nodes (titik cabang)
à
titik-titik yang
mempunyai lebih dari satu anak panah keluaran.
•
Branch edges (anak panah cabang)
à
anak panah
yang keluar dari suatu titik cabang
•
Paths (jalur)
à
jalur yang mungkin untuk bergerak dari
satu titik ke lainnya sejalan dengan keberadaan arah
anak panah.
Komponen flowgraph
n
Eksekusi suatu test case menyebabkan program
untuk mengeksekusi pernyataan-pernyataan
tertentu, yang berkaitan dengan jalur tertentu,
sebagaimana tergambar pada flow graph.
n
Cakupan cabang, pernyataan dan jalur dibentuk
dari eksekusi jalur program yang berkaitan
dengan peninjauan titik, anak panah, dan jalur
dalam flow graph.
Cakupan pernyataan
n
Ditentukan dengan menilai proporsi dari
pernyataan-pernyataan yang ditinjau oleh
sekumpulan test cases yang ditentukan.
n
Cakupan pernyataan 100% jika tiap pernyataan
pada program ditinjau setidaknya minimal sekali
tes
n
Cakupan pernyataan berkaitan dengan nodes
Contoh Cakupan Pernyataan
•
Pada contoh gambar
flow
graph
di samping
terdapat 10 titik.
•
Misal suatu jalur eksekusi
program melewati titik-titik
A, B, D, H, K.
•
Berarti ada 5 titik dari 10
titik yang dikunjungi,
maka cakupan
Cakupan cabang
n
Cakupan cabang ditentukan dengan menilai
proporsi dari cabang keputusan yang diuji oleh
sekumpulan test cases yang telah ditentukan.
n
Cakupan cabang 100% adalah bilamana tiap
cabang keputusan pada program ditinjau
setidaknya minimal sekali tes.
n
Cakupan cabang berkaitan dengan peninjauan
anak panah cabang (branch edges) dari flow
graph.
Contoh Cakupan Cabang
•
Pada contoh gambar
flow graph
di samping,
terdapat 6 anak panah
cabang.
•
Mis. suatu jalur eksekusi
program melewati
titik-titik A, B, D, H, K,
maka jalur tersebut
meninjau 2 dari 6 anak
panah cabang yang ada,
jadi cakupannya sebesar
33 %.
Cakupan jalur
n
Cakupan jalur ditentukan dengan menilai
proporsi eksekusi jalur program yang diuji oleh
sekumpulan test cases yang telah ditentukan.
n
Cakupan jalur 100 % adalah bilamana tiap jalur
pada program dikunjungi setidaknya minimal
sekali tes.
n
Cakupan jalur berkaitan dengan peninjauan jalur
Contoh Cakupan Jalur
•
Berdasarkan contoh
flow
graph
di atas, terdapat 4
jalur.
•
Bila suatu eksekusi jalur
pada program melalui
titik-titik A, B, D, H, K, maka
eksekusi tersebut
meninjau 1 dari 4 jalur
yang ada, jadi cakupannya
sebesar 25%.
Disain cakupan tes
Untuk mendisain cakupan dari tes, perlu diketahui tahap-
tahap sebagai berikut:
1.
Menganalisa
source code
untuk membuat
flow graph
.
2.
Mengidentifikasi jalur tes untuk mencapai pemenuhan
tes berdasarkan pada
flow graph
.
3.
Mengevaluasi kondisi tes yang akan dicapai dalam tiap
tes.
4.
Memberikan nilai masukan dan keluaran berdasarkan
Basis path testing
n
Merupakan teknik
white box testing
yang dikenalkan oleh
Tom McCabe [MC76].
n
Memungkinkan pendisain
test cases
untuk melakukan
pengukuran terhadap kompleksitas logika dari disain
prosedural
n
Menggunakan ukuran kompleksitas tsb sebagai panduan
dalam menentukan kelompok basis dari jalur eksekusi
dimana hal ini akan menjamin eksekusi tiap pernyataan
dalam program sekurangnya sekali selama testing
berlangsung.
Basis path testing
n
Identifikasi didasarkan pada jalur, struktur atau
koneksi yang ada dari suatu sistem (branch
testing), karena cabang-cabang dari kode atau
fungsi logika diidentifikasi dan dites
n
Konsep utama basis path :
•
Tiap basis path harus diidentifikasi, tidak boleh
ada yang terabaikan (setidaknya dites 1 kali).
•
Kombinasi dan permutasi dari suatu basis
Cyclomatic complexity
n
Adalah
pengukuran kuantitatif dari kompleksitas
logika program.
n
Pada konteks metode
basis path testing
, nilai
yang dihitung bagi
cyclomatic complexity
menentukan jumlah jalur-jalur yang independen
dalam kumpulan basis suatu program dan
memberikan jumlah tes minimal yang harus
dilakukan untuk memastikan bahwa semua
pernyataan telah dieksekusi sekurangnya satu
kali.
Cyclomatic complexity
n
Jalur independen adalah tiap jalur pada program
yang memperlihatkan 1 kelompok baru dari
pernyataan proses atau kondisi baru.
n
[
Region / Complexity
] V(G) = E (
edges
) – N
Pembuatan
test cases
dengan
menggunakan
cyclomatic complexity
:
Tahapan :
1.
Gunakan disain atau kode sebagai dasar,
gambarlah
flow graph
2.
Berdasarkan
flow graph
, tentukan
cyclomatic
complexity
3.
Tentukan kelompok basis dari jalur independen
secara linier
4.
Siapkan
test cases
yang akan melakukan
public static int binarySearch( int key, int[] sequence ) { int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) { mid = ( top + bottom ) / 2;
if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; }
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 1 1
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 1 2 1 2
1 2
10
F
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 10 F 1 2
3 1 2 10 F T F
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 10 3 T F 10 F 1 2
3 1 2 10 F T F 4 T 5 T
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 4 T 5 T 10 3 T F F 1 2
3 1 2 10 F T F 4 T 5 T 6 F
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 10 6 4 T 5 T 3 T F F 1 2 F
3 1 2 10 F T F 4 T 5 T 6 F 9
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 9 6 4 T 5 T 3 T F F 1 2 F 10
3 1 2 10 F T F 4 T 5 T 6 F 7 T 9
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 7 T 9 6 4 T 5 T 3 T F F 1 2 F 10
3 1 2 10 F T F 4 T 5 T 6 F 7 T 8 F 9
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 8 F 7 T 9 6 4 T 5 T 3 T F F 1 2 F 10
3 1 2 10 F T F 4 T 5 T 6 F 7 T 8 F 9
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 8 F 7 T 9 6 4 T 5 T 3 T F F 1 2 F 10
3 1 2 10 F T F 4 T 5 T 6 F 7 T 8 F 9
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 8 F 7 T 9 6 4 T 5 T 3 T F F 1 2 F 10
3 1 2 10 F T F 4 T 5 T 6 F 7 T 8 F 9
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 8 F 7 T 9 6 4 T 5 T 3 T F F 1 2 F 10
n
Setelah pembuatan flowgraph,
tahap selanjutnya adalah
menghitung CC untuk
menentukan jumlah jalur
independen
CC = jml edges-jml nodes+2
CC = 13-10+2
= 5
3 1 2 10 F T F 4 T 5 T 6 F 7 T 8 F 9n
Berdasarkan urutan alurnya,
didapatkan suatu kelompok
basis flow graph
:
Jalur 1 = 1-2-10
Jalur 2 = 1-2-3-10
Jalur 3 = 1-2-3-4-6-7-9-2-10
Jalur 4 = 1-2-3-4-6-8-9-2-10
Jalur 5 = 1-2-3-4-5-9-2-10
3 1 2 10 F T F 4 T 5 T 6 F 7 T 8 F 9n
Tahap selanjutnya adalah menyusun
test
cases
yang akan melakukan eksekusi dari tiap
jalur dalam kelompok basis
n
Testcase jalur 1
nilai bottom valid
dimana nilai record
bernilai false
hasil yang
diharapkan :
sistem melakukan
[return keyPosition]
dan keluar dari
subprogram
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; }
n
Testcase jalur 3
public static int binarySearch( int key, int[] sequence ) {
int bottom = 0;
int top = sequence.length - 1; int mid = 0;
int keyPosition = -1;
while( bottom <= top && keyPosition == -1 ) {
mid = ( top + bottom ) / 2; if( sequence[ mid ] == key ) { keyPosition = mid;
}
else {
if( sequence[ mid ] < key ) { bottom = mid + 1; } else { top = mid - 1; } } } return keyPosition; } 3 1 2 10 F T F 4 T 5 T 6 F 7 T 8 F 9