MODUL I Otomatisasi Proses Build dengan Apache Ant 1.1
Tujuan 1. Mahasiswa memahami pengertian dari proses build. 2. Mahasiswa memahami berbagai macam software yang berfungsi sebagai build tool 3. Mahasiswa memahami kegunaan Apache Ant 4. Mahasiswa memahami dan bisa melakukan instalasi software Apache Ant 5. Mahasiswa mampu membedakan proses membangun software tanpa build tool serta dengan menggunakan build tool 6. Mahasiswa memahami file-file yang terkait dan diperlukan oleh Apache Ant, yaitu file properties dan build.xml 7. Mahasiswa mampu menggunakan Apache ant dengan cara membuat build.xml untuk keperluan otomatisasi proses build serta menggunakan berbagai target yang telah didefinisikan pada build.xml tersebut.
1.2
Teori Singkat Apache Ant adalah software berbasis Java yang digunakan untuk
keperluan build tool. Sebagai build tool, tugas utama dari Ant adalah untuk menyediakan sumber daya dan melaksanakan proses yang memungkinkan membangun suatu software dari bentuk source code menjadi aplikasi yang siap didistribusikan atau bahkan telah diinstall pada remote server. Meskipun definisi tersebut kelihatannya sederhana, kita akan melihat bahwa Ant mempunyai banyak sekali tasks yang bisa digunakan untuk berbagai keperluan sesuai dengan tujuan utama dari build tool. Ada banyak build tool yang tersedia, beberapa diantaranya adalah build tool yang bersifat spesifik untuk sistem operasi tertentu. Beberapa contoh dari build tool, diantaranya adalah: •
GNU Make (ingat siklus ./configure, make, make install)
•
Jam
•
rake (untuk Ruby), dan lain-lain
Modul Praktikum Software Quality Assurance – hal 1 dari 60
Ant merupakan software untuk keperluan build tool yang bersifat cross platform, bisa digunakan pada berbagai sistem operasi yang mendukung Java. Meskipun demikian, pembahasan dalam tulisan ini akan menggunakan Linux. Jika anda menggunakan Windows, silahkan sesuaikan dengan sistem operasi anda (hanya jika diperlukan). Selama tidak menggunakan fitur spesifik dari sistem operasi yang bersangkutan (diantaranya dengan tag <exec>), maka pembahasan ini bersifat cross platform. Mengapa Harus Menggunakan Build Tool? Build tool tidak diperlukan jika software yang akan kita bangun sangat sederhana (seperti misalnya hanya menampilkan satu atau beberapa baris tulisan) dan kita tidak keberatan untuk menuliskan dan mencantumkan berbagai dependencies dari software tersebut (misalnya berbagai file jar yang kita perlukan). Jika aplikasi yang kita bangun relatif kompleks, melibatkan banyak dependencies, dengan struktur direktori tertentu, serta memerlukan banyak eksekusi atau menjalankan tools (misalnya jar, rmic, javac, bzip2, dan lain-lain), maka kita memerlukan build tool untuk meng-”otomatiskan” proses membangun (compile, test, run, deploy) software tersebut. Anda bisa membayangkan sendiri jika harus mengetikkan berpuluh-puluh baris untuk siklus compile, test, run, deploy jika tidak menggunakan build tool.
1.3
Praktik
Instalasi Apache Ant Ant adalah software bebas dan mempunyai lisensi ASF (Apache Software Foundation). Ant bisa diperoleh di http://ant.apache.org. Versi terakhir saat tulisan ini dibuat adalah versi 1.7.1. Download distribusi Ant seperti berikut ini: [bpdp@bpdp-arch ant]$ ls -la total 7484 drwxr-xr-x 2 bpdp users 4096 2009-09-01 03:08 . drwxr-xr-x 26 bpdp users 4096 2009-09-19
Modul Praktikum Software Quality Assurance – hal 2 dari 60
17:37 .. -rw-r--r-- 1 bpdp users 7641928 2008-07-09 16:19 apache-ant-1.7.1-bin.tar.bz2 [bpdp@bpdp-arch ant]$ Asumsi: •
JDK telah terinstall dan JAVA_HOME telah di-set.
•
Ant akan diinstall di direktori $HOME/software/
Berikut adalah langkahnya: 1.$ cd software 2.$ tar -xjvf apache-ant-1.7.1-bin.tar.bz2 Hasilnya: [bpdp@bpdp-arch software]$ pwd /home/bpdp/software [bpdp@bpdp-arch software]$ ls -la apache-ant-1.7.1/ total 276 drwxr-xr-x 6 bpdp users 4096 2008-06-27 12:04 . drwxr-xr-x 25 bpdp users 4096 2009-09-28 10:05 .. -rw-r--r-- 1 bpdp users 126 2008-06-27 12:04 INSTALL -rw-r--r-- 1 bpdp users 51380 2008-06-27 12:04 KEYS -rw-r--r-- 1 bpdp users 15289 2008-06-27 12:04 LICENSE -rw-r--r-- 1 bpdp users 1270 2008-06-27 12:04 NOTICE -rw-r--r-- 1 bpdp users 4119 2008-06-27 12:04 README -rw-r--r-- 1 bpdp users 146814 2008-06-27 12:04 WHATSNEW drwxr-xr-x 2 bpdp users 4096 2009-09-04 10:23 bin drwxr-xr-x 9 bpdp users 4096 2009-09-04 10:23 docs drwxr-xr-x 3 bpdp users 4096 2009-09-04 10:23 etc -rw-r--r-- 1 bpdp users 7160 2008-06-27 12:04 fetch.xml -rw-r--r-- 1 bpdp users 4445 2008-06-27 12:04 get-m2.xml drwxr-xr-x 2 bpdp users 4096 2009-09-04 10:23 lib [bpdp@bpdp-arch software]$
Setelah itu, setting konfigurasi environment variable di $HOME/.bashrc sebagai berikut: export ANT_HOME=/home/bpdp/software/apache-ant-1.7.1/ export PATH=$PATH:$ANT_HOME/bin
Setelah itu setiap kali login, shell sudah mengenali ant yang telah kita install. Jika telah terinstall dengan benar, hasil instalasi adalah sebagai berikut: [bpdp@bpdp-arch software]$ ant -version Apache Ant version 1.7.1 compiled on June 27 2008
Modul Praktikum Software Quality Assurance – hal 3 dari 60
[bpdp@bpdp-arch software]$
Jika ingin mengetahui lebih lengkap lagi, gunakan parameter -diagnostics. Struktur Direktori dan Berbagai File Untuk keperluan praktikum ini, buat struktur direktori dengan berbagai file berikut ini: .
|-- build | `-- classes `-- src `-- simpleant `-- HelloWorld.java
Isi dari file HelloWorld.java adalah sebagai berikut: package simpleant; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }
Kompilasi dan Eksekusi Program Tanpa Apache Ant - Shell $ javac -sourcepath src -d build/classes/ src/simpleant/HelloWorld.java $ java -cp build/classes simpleant.HelloWorld Hello World $
Kompilasi dan Eksekusi Program Tanpa Apache Ant - jar Untuk keperluan ini anda harus membuat file manifest terlebih dahulu (misalnya helloworld-manifest). $ cat helloworld-manifest Main-Class: simpleant.HelloWorld
Modul Praktikum Software Quality Assurance – hal 4 dari 60
$ mkdir build/jar $ jar cfm build/jar/HelloWorld.jar helloworld-manifest -C build/classes/ . $ java -jar build/jar/HelloWorld.jar Hello World $
Kompilasi dan Eksekusi Menggunakan Apache Ant Untuk menggunakan Apache Ant, kita harus membuait suatu file yang berisi tasks (berbagai tugas) yang bisa dikerjakan oleh Apache Ant. File tersebut secara default mempunyai nama build.xml. Berikut ini adalah isi build.xml yang terletak pada direktori root dari project. <project name="HelloWorld" basedir="." default="main"> <property name="src.dir" value="src"/> <property name="build.dir" value="build"/> <property name="classes.dir" value="${build.dir}/classes"/> <property name="jar.dir" value="${build.dir}/jar"/> <property name="main-class" value="simpleant.HelloWorld"/>
<delete dir="${build.dir}"/> <mkdir dir="${classes.dir}"/> <javac srcdir="${src.dir}" destdir="${classes.dir}"/> <mkdir dir="${jar.dir}"/> <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="$ {classes.dir}"> <manifest> <java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>
Dengan demikian, direktori yang kita buat sekarang akan mempunyai struktur sebagai berikut:
Modul Praktikum Software Quality Assurance – hal 5 dari 60
[bpdp@bpdp-arch helloworld-with-ant]$ tree . |-- build.xml `-- src `-- simpleant `-- HelloWorld.java 2 directories, 2 files
Jalankan “ant” pada root directory project yang bersangkutan seperti berikut ini: [bpdp@bpdp-arch helloworld-with-ant]$ ant clean Buildfile: build.xml clean: [delete] Deleting directory /home/bpdp/kerjaan/src/java/helloworldwith-ant/build BUILD SUCCESSFUL Total time: 0 seconds [bpdp@bpdp-arch helloworld-with-ant]$ ant run Buildfile: build.xml compile: [mkdir] Created dir: /home/bpdp/kerjaan/src/java/helloworld-withant/build/classes [javac] Compiling 1 source file to /home/bpdp/kerjaan/src/java/helloworld-with-ant/build/classes jar: [mkdir] Created dir: /home/bpdp/kerjaan/src/java/helloworld-withant/build/jar [jar] Building jar: /home/bpdp/kerjaan/src/java/helloworld-withant/build/jar/HelloWorld.jar run: [java] Hello World BUILD SUCCESSFUL Total time: 1 second [bpdp@bpdp-arch helloworld-with-ant]$
1.4
Latihan 1. Gantilah HelloWorld.java dengan program untuk menampilkan hasil perkalian 100*150 dan nama kelas Perkalian.
1.5
Tugas Buatlah proyek baru yang terdiri atas 2 file source code Java. File
pertama adalah definisi class, file kedua adalah file utama yang di dalamnya Modul Praktikum Software Quality Assurance – hal 6 dari 60
akan membuat instance dari class yang telah didefinisikan pada file pertama. Buatlah file build.xml untuk keperluan seperti pada praktik di atas dan tunjukkan bahwa program yang anda buat tersebut berhasil dikompilasi dan dijalankan.
Modul Praktikum Software Quality Assurance – hal 7 dari 60
MODUL II SCM, Revision Control / Source Code Management, dan Git
2.1
Tujuan 1. Mahasiswa
memahami
pengertian
dari
Software
Configuration
Management. 2. Mahasiswa memahami keterkaitan antara SCM, Revision Control System, ource Code Management, dan Git 3. Mahasiswa
memahami
dan
mampu
mengaplikasikan
dasar-dasar
mengaplikasikan
dasar-dasar
pemakaian Git untuk developer individual 4. Mahasiswa
memahami
dan
mampu
pemakaian Git untuk berkolaborasi antar developer. 2.2
Teori Singkat
Pengantar Ada dua kepanjangan dari SCM dan keduanya saling berkaitan. SCM pertama adalah Software Configuration Management. SCM kedua adalah Source Code Management. Untuk menghilangkan kebingungan, Source Code Management sering disebut juga Revision Control. Meskipun demikian, masih sering ditemui istilah di dunia komputasi yang menggunakan SCM untuk menunjukkan Software Configuration Management. Penjelasan ini semata-mata untuk menghilangkan kebingungan jika suatu saat membaca buku teks ataupun artikel yang menggunakan singkatan SCM. Untuk keperluan selanjutnya, SCM akan merujuk pada Software Configuration Management. SCM merupakan aktivitas tracking dan dan pengendalian perubahan pada software. SCM biasanya berisi dua aktivitas utama yaitu Revision Control dan penetapan Baselines. Suatu baseline merupakan suatu produk atau sekumpulan produk yang menjadi dasar perbandingan logis. Revision Control itu sendiri merupakan suatu pengelolaan terhadap berbagai perubahan yang terjadi terhadap berbagai Modul Praktikum Software Quality Assurance – hal 8 dari 60
artifak pada proses software development. Dalam software development dengan anggota tim pengembang yang terdiri atas lebih dari satu orang, sering terjadi kasus satu artifak (dokumen, source code, dll) diubah oleh lebih dari satu orang. Revision Control merupakan aktivitas untuk mengelola hal tersebut. Untuk mempermudah melakukan Revision Control, biasanya digunakan suatu software yang termasuk dalam kategori Version Control System. Software untuk Version Control System Banyak software yang dibuat untuk keperluan VCS ini. Pada dasarnya, VCS bisa dikategorikan ke dalam berbagai kelompok berikut ini: •
Lokal / Tersentralisasi, semua developer harus berada pada sistem komputer yang sama. Contoh software ini antara lain adalah RCS (Remote Control System) dan SCCS (Source Code Control System).
•
Terdistribusi (DRCS / Distributed Revision Control System), menggunakan pendekatan
Peer-to-Peer.
Sinkronisasi
dilakukan
dengan
mempertukarkan patches-set antar peer. Contoh software ini antara lain adalah Aegis, Bazaar, Git, Darcs, GNU Arch, Mercurial, Monotone. •
Client-server, semua developer melakukan sinkronisasi pada suatu server terpusat. Contoh dari software ini antara lain adalah CVS dan Subversion.
Tentang Git Git adalah DRCS yang pada awalnya dirancang dan dibuat oleh Linus Torvalds untuk keperluan pengembangan kernel Linux setelah BitKeeper yang sebelumnya digunakan untuk keperluan pengembangan kernel berubah menjadi software proprietary. Git merupakan software bebas dan bisa diperoleh di http://www.git-scm.org.
Source Code Hosting dengan Fasilitas Git Beberapa vendor menyediakan akses bebas untuk hosting source code, terutama untuk proyek-proyek opensource atau proyek-proyek software bebas.
Modul Praktikum Software Quality Assurance – hal 9 dari 60
Beberapa diantaranya adalah: 1. GitHub (http://www.github.com) 2. Gitorious (http://www.gitorius.org) 3. GNU Savannah (http://savannah.gnu.org) 4. Project Kenai (http://www.kenai.com) 5. Sourceforge (http://sourceforge.net)
Proyek-proyek Pengguna Git Git digunakan oleh banyak proyek pengembangan software, diantaranya adalah Linux kernel, Arch Linux, Merb, Ruby on Rails, Samba, GNOME, GTK, Fedora, dan lain-lain. KDE saat ini sedang mengevaluasi kemungkinan untuk menggunakan Git. Proyek dibawah KDE yang sudah berimigrasi ke Git adalah Amarok. Migrasi ini kemungkinan akan segera diikuti oleh berbagai proyek KDE lainnya. 2.3
Praktik
Git untuk Individu Untuk praktik ini, copy-kan seluruh file yang telan anda kerjakan pada suatu direktori baru. Kita akan melakukan pengelolaan source code pada posisi di dalam direktori baru tersebut. Penting: Direktori dan file-file yang tertulis pada praktik ini lain dengan yang anda kerjakan. Tidak perlu memperhatikan perbedaan itu, yang perlu anda pahami adalah perintah yang anda kerjakan dan hasil pada komputer anda. Praktik Bagian ini digunakan jika kita hanya berurusan dengan diri kita sendiri. Source code tidak akan dikolaborasikan dengan developer lain. Pertama kita inisialisasi user dengan perintah berikut: $ git config --global user.name "Bambang Purnomosid D. P." $ git config --global user.email "
[email protected]" $
Modul Praktikum Software Quality Assurance – hal 10 dari 60
Perintah ini cukup dilakukan sekali saja. Perintah ini akan menyimpan konfigurasi di direktori $HOME/.gitconfig berikut ini: $ cat /home/bpdp/.gitconfig [user] name = Bambang Purnomosid D. P. email =
[email protected] $
Setelah itu inisialisasi direktori proyek tempat source code berada: [bpdp@bpdp-arch bab2]$ git init Initialized empty Git repository in /home/bpdp/kerjaan/modul-praktikum/sqa/bab2/.git/ [bpdp@bpdp-arch bab2]$ ls -la total 28 drwxr-xr-x 6 bpdp users 4096 2009-10-09 05:12 . drwxr-xr-x 9 bpdp users 4096 2009-10-09 05:06 .. drwxr-xr-x 7 bpdp users 4096 2009-10-09 05:12 .git -rw-r--r-- 1 bpdp users 1785 2009-10-09 05:07 build.xml drwxr-xr-x 4 bpdp users 4096 2009-10-09 05:07 checkstyle drwxr-xr-x 2 bpdp users 4096 2009-10-09 05:07 classes drwxr-xr-x 3 bpdp users 4096 2009-10-09 05:07 src [bpdp@bpdp-arch bab2]$ Tambahkan semua source code ke dalam repository: [bpdp@bpdp-arch bab2]$ git add . [bpdp@bpdp-arch bab2]$ ls -la .git/ total 44 drwxr-xr-x 7 bpdp users 4096 2009-10-09 drwxr-xr-x 6 bpdp users 4096 2009-10-09 -rw-r--r-- 1 bpdp users 23 2009-10-09 drwxr-xr-x 2 bpdp users 4096 2009-10-09 -rw-r--r-- 1 bpdp users 92 2009-10-09 -rw-r--r-- 1 bpdp users 73 2009-10-09 drwxr-xr-x 2 bpdp users 4096 2009-10-09 -rw-r--r-- 1 bpdp users 1088 2009-10-09 drwxr-xr-x 2 bpdp users 4096 2009-10-09 drwxr-xr-x 15 bpdp users 4096 2009-10-09 drwxr-xr-x 4 bpdp users 4096 2009-10-09 [bpdp@bpdp-arch bab2]$
05:14 05:14 05:14 05:14 05:14 05:14 05:14 05:14 05:14 05:14 05:14
. .. HEAD branches config description hooks index info objects refs
Setelah itu lakukan commit. Commit adalah aktivitas untuk menuliskan atau menggabungkan perubahan-perubahan yang telah dilakukan ke dalam repository. Istilah lain untuk commit adalah checkin atau ci). “Initial commit for Modul Praktikum Software Quality Assurance – hal 11 dari 60
project” di bawah ini adalah pesan yang akan dituliskan pada commit ini. Initial commit for project # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached
..." to unstage) # # new file: build.xml # new file: checkstyle/checks/checkstyle_checks.xml # new file: checkstyle/checks/sun_checks.xml # new file: checkstyle/lib/antlr.jar # new file: checkstyle/lib/checkstyle-5.0.jar # new file: checkstyle/lib/checkstyle-all-5.0.jar # new file: checkstyle/lib/commons-beanutilscore.jar # new file: checkstyle/lib/commons-cli-1.1.jar # new file: checkstyle/lib/commons-logging.jar # new file: src/vehicles/Bicycle.java # new file: src/vehicles/BicycleMain.java # ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ".git/COMMIT_EDITMSG" 22 lines, 758 characters Setelah disimpan dengan menggunakan perintah pada editor yang bersangkutan, hasilnya adalah sebagai berikut:
Modul Praktikum Software Quality Assurance – hal 12 dari 60
[bpdp@bpdp-arch bab2]$ git commit [master (root-commit) a533121] Initial commit for project 11 files changed, 504 insertions(+), 0 deletions(-) create mode 100644 build.xml create mode 100644 checkstyle/checks/checkstyle_checks.xml create mode 100644 checkstyle/checks/sun_checks.xml create mode 100644 checkstyle/lib/antlr.jar create mode 100644 checkstyle/lib/checkstyle-5.0.jar create mode 100644 checkstyle/lib/checkstyle-all-5.0.jar create mode 100644 checkstyle/lib/commons-beanutils-core.jar create mode 100644 checkstyle/lib/commons-cli-1.1.jar create mode 100644 checkstyle/lib/commons-logging.jar create mode 100644 src/vehicles/Bicycle.java create mode 100644 src/vehicles/BicycleMain.java [bpdp@bpdp-arch bab2]$
Perintah-perintah berikut ini akan banyak digunakan pada saat kita bekerja dengan source code. Perintah “git status” dan “git diff“ Perintah “git status” digunakan untuk melihat status dari working copy. Jika tidak ada perubahan, hasilnya adalah sebagai berikut: [bpdp@bpdp-arch bab2]$ git status # On branch master nothing to commit (working directory clean) [bpdp@bpdp-arch bab2]$ Jika kita telah mengedit file kita, kita bisa melihat perubahan yang kita lakukan terhadap source code dengan perintah “git diff”. Berikut adalah hasilnya: [bpdp@bpdp-arch bab2]$ git status # On branch master # Changed but not updated: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # modified: build.xml no changes added to commit (use "git add" and/or "git commit -a") [bpdp@bpdp-arch bab2]$ git diff diff --git a/build.xml b/build.xml Modul Praktikum Software Quality Assurance – hal 13 dari 60
index 5726443..68907c7 100644 --- a/build.xml +++ b/build.xml @@ -1,4 +1,4 @@ -<project name="sample" default="checkstyle" basedir="."> +<project name="Checkstyle" default="checkstyle" basedir="."> <property name="classes.dir" value="classes" /> <property name="src.dir" value="src" /> (END) Setelah mengedit dan menyimpan perubahan tersebut, lakukan commit sebagai berikut (anda harus mengisikan commit message): [bpdp@bpdp-arch bab2]$ git commit build.xml [master 2b3b11d] Change project name 1 files changed, 1 insertions(+), 1 deletions(-) [bpdp@bpdp-arch bab2]$
Perintah “git add” dan “git rm” Jika kita menambahkan file atau direktori ke proyek kita, kita bisa menggunakan “git add”. Berikut ini adalah snapshot dari proses penambahan tersebut: [bpdp@bpdp-arch bab2]$ git status # On branch master # Untracked files: # (use "git add ..." to include in what will be committed) # # README nothing added to commit but untracked files present (use "git add" to track) [bpdp@bpdp-arch bab2]$ git add README [bpdp@bpdp-arch bab2]$ git status # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # new file: README # [bpdp@bpdp-arch bab2]$ git commit
Modul Praktikum Software Quality Assurance – hal 14 dari 60
[master 063f06a] Menambahkan file README 1 files changed, 2 insertions(+), 0 deletions(-) create mode 100644 README [bpdp@bpdp-arch bab2]$ git status # On branch master nothing to commit (working directory clean) [bpdp@bpdp-arch bab2]$ Jika ingin me-remove file dari pelacakan git, gunakan “git rm” Perintah “git log” Perintah ini digunakan untuk menampilkan catatan-catatan (logs) terhadap apa yang telah dilakukan terhadap source code: commit 063f06a0c22af5a72e50c1d5eca2d42480d58e33 Author: Bambang Purnomosid D. P Date: Fri Oct 9 05:33:05 2009 +0700 Menambahkan file README commit 2b3b11d560b61c025f3756206fe7121fe1443fd3 Author: Bambang Purnomosid D. P Date: Fri Oct 9 05:29:23 2009 +0700 Change project name commit a533121fadeff09c76569679516155a534e270e8 Author: Bambang Purnomosid D. P Date: Fri Oct 9 05:16:05 2009 +0700 Initial commit for project (END) Jika memerlukan lebih rinci lagi, bisa menggunakan “git log –stat –summary”. Git untuk Kolaborasi Kolaborasi akan melibatkan lebih dari satu developer. Pada dasarnya ada beberapa perintah yang sering digunakan pada saat berkolaborasi. Perintah “git clone“ Perintah ini digunakan untuk mengambil repository dari. Contoh jika akan mengambil dari remote host berikut ini adalah sebagai berikut: [bpdp@bpdp-arch scm]$ git clone git://github.com/progit/progit.git Modul Praktikum Software Quality Assurance – hal 15 dari 60
Initialized empty Git repository in /home/bpdp/buku/softdev/scm/progit/.git/ remote: Counting objects: 3652, done. remote: Compressing objects: 100% (1160/1160), done. remote: Total 3652 (delta 1895), reused 3511 (delta 1795) Receiving objects: 100% (3652/3652), 5.49 MiB | 20 KiB/s, done. Resolving deltas: 100% (1895/1895), done. [bpdp@bpdp-arch scm]$ Hasilnya adalah sebagai berikut: [bpdp@bpdp-arch scm]$ ls total 76 drwxr-xr-x 17 bpdp users drwxr-xr-x 3 bpdp users drwxr-xr-x 8 bpdp users -rw-r--r-- 1 bpdp users -rw-r--r-- 1 bpdp users drwxr-xr-x 11 bpdp users drwxr-xr-x 9 bpdp users drwxr-xr-x 11 bpdp users drwxr-xr-x 11 bpdp users drwxr-xr-x 3 bpdp users drwxr-xr-x 11 bpdp users drwxr-xr-x 2 bpdp users drwxr-xr-x 2 bpdp users source drwxr-xr-x 10 bpdp users drwxr-xr-x 2 bpdp users drwxr-xr-x 11 bpdp users drwxr-xr-x 11 bpdp users drwxr-xr-x 7 bpdp users drwxr-xr-x 9 bpdp users [bpdp@bpdp-arch scm]$
-la progit/ 4096 4096 4096 97 821 4096 4096 4096 4096 4096 4096 4096 4096
2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09
04:14 04:09 04:14 04:14 04:14 04:14 04:14 04:14 04:14 04:14 04:14 04:14 04:14
. .. .git .gitignore README cs de en es-es es-mx es-ni figures figures-
4096 4096 4096 4096 4096 4096
2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09 2009-10-09
04:14 04:14 04:14 04:14 04:14 04:14
ja latex nl pt-br ru zh
Perintah git clone juga bisa dilakukan pada host yang sama seperti berikut ini: [root@bpdp-arch ~]# git clone /home/bpdp/kerjaan/modulpraktikum/sqa/bab2 Initialized empty Git repository in /root/bab2/.git/ [root@bpdp-arch ~]# ls -la bab2/ total 28 drwxr-xr-x 5 root root 4096 2009-10-09 05:57 . drwxr-x--- 16 root root 4096 2009-10-09 05:57 .. drwxr-xr-x 8 root root 4096 2009-10-09 05:57 .git -rw-r--r-- 1 root root 123 2009-10-09 05:57 README
Modul Praktikum Software Quality Assurance – hal 16 dari 60
-rw-r--r-- 1 root root 1789 2009-10-09 05:57 build.xml drwxr-xr-x 4 root root 4096 2009-10-09 05:57 checkstyle drwxr-xr-x 3 root root 4096 2009-10-09 05:57 src [root@bpdp-arch ~]#
Perintah git clone juga bisa dilakukan menggunakan protokol ssh berikut ini: [root@bpdp-arch ~]# git clone [email protected]:/home/bpdp/kerjaan/modulpraktikum/sqa/bab2 Initialized empty Git repository in /root/bab2/.git/ The authenticity of host '192.168.1.248 (192.168.1.248)' can't be established. RSA key fingerprint is d4:ce:34:11:64:61:a3:fc:07:6d:51:96:8b:6e:cd:ea. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.248' (RSA) to the list of known hosts. [email protected]'s password: remote: Counting objects: 24, done. remote: Compressing objects: 100% (23/23), done. remote: Total 24 (delta 2), reused 0 (delta 0) Receiving objects: 100% (24/24), 2.17 MiB, done. Resolving deltas: 100% (2/2), done. [root@bpdp-arch ~]# Jika dua orang developer bekerja sama pada source code yang sama, maka bisa digunakan perintah “git pull” untuk mengintegrasikan perubahan-perubahan yang telah di-commit oleh masing-masing developer tersebut. Perintah “git pull” juga bisa menggunakan local copy, melalui ssh, atau protokol lain. 2.4
Latihan 1. Cobalah melakukan clone terhadap hasil pekerjaan teman anda dengan menggunakan protokol SSH. Letakkan hasilnya di suatu direktori tertentu yang lain dari direktori yang telah anda kerjakan.
2.5
Tugas 1. Buatlah proyek baru dan ulangi lagi menggunakan langkah-langkah praktik untuk developer individual di atas. Pahami fungsi dari masingmasing langkah tersebut dengan baik.
Modul Praktikum Software Quality Assurance – hal 17 dari 60
MODUL III Otomatisasi Pemeriksaan Kesesuaian Source Code dengan Konvensi Menggunakan Checkstyle
3.1
Tujuan 1. Mahasiswa
memahami
arti
penting
dari
konvensi
dalam
tim
pengembangan software. 2. Mahasiswa
memahami
fungsi
dari
software
Checkstyle
dalam
pemeriksaan kesesuaian source code dengan konvensi. 3. Mahasiswa memahami dan mampu mendefinisikan task di Apache Ant untuk keperluan pemeriksaan kesesuaian konvensi. 4. Mahasiswa memahami dan mampu mengintegrasikan Checkstyle dalam proyek pengembangan software. 3.2
Teori Singkat Konvensi adalah kesepakatan (kadang diwujudkan dalam aturan tertulis)
yang berfungsi untuk mengurangi ketidakpastian dan ketidakjelasan serta kekacauan. Konvensi biasanya tidak mempunyai sanksi hukum yang tegas dan seringkali hanya berupa sanksi sosial jika terdapat pelanggaran. Checkstyle
(http://checkstyle.sourceforge.net)
adalah
peranti
pengembangan yang digunakan untuk “memaksakan” kesesuaian source dengan
konvensi.
Dalam pembuatan
software,
source
code
readibility
merupakan hal yang sangat penting karena memudahkan untuk peer reviews serta proses testing dan debugging. Meskipun pembuatan source code pada dasarnya bebas (misalnya, bisa saja membuat nama variabel dengan bentuk namaVariabel atau nama_variabel), tetapi “kekacauan” seperti itu tidak bisa ditolerir dalam proyek pembuatan software karena bisa mendatangkan ketidakpastian dan ketidakjelasan. Konvensi pembuatan source code dalam bahasa pemrograman Java dapat dilihat di http://java.sun.com/docs/codeconv/. Praktikum ini akan menggunakan Checkstyle versi 5.0 Modul Praktikum Software Quality Assurance – hal 18 dari 60
3.3
Praktik
Struktur Direktori dan Berbagai File . |-|-| | | | | | | | | | `--
build.xml checkstyle |-- checks | |-- checkstyle_checks.xml | `-- sun_checks.xml `-- lib |-- antlr.jar |-- checkstyle-5.0.jar |-- checkstyle-all-5.0.jar |-- commons-beanutils-core.jar |-- commons-cli-1.1.jar `-- commons-logging.jar src `-- vehicles |-- Bicycle.java `-- BicycleMain.java Pada dasarnya, dari distribusi Checkstyle, kita memerlukan berbagai file
.jar yang diperlukan serta file check yang bertipe XML dan berisi berbagai modul konfigurasi dari Checkstyle yang akan digunakan untuk memeriksa kesesuaian dengan konvensi. Distribusi Checkstyle telah menyediakan file sun_checks.xml yang bisa kita gunakan. File tersebut berisi konvensi source code sesuai dengan kode konvensi dari Sun pada URL yang telah disebutkan di atas. Direktori lib/ berisi semua file .jar dari distribusi Checkstyle. Untuk keperluan tulisan ini, kita menggunakan pemeriksaan dari sun_checks.xml. File build.xml digunakan Apache Ant untuk otomatisai task, sedangkan source code terletak pada direktori src dan semuanya berada pada paket vehicles. build.xml <project name="checkstyle" default="checkstyle" basedir="."> <property name="classes.dir" value="classes" /> <property name="src.dir" value="src" /> <path id="cpath"> <pathelement location="${classes.dir}"/> <path id="checkstylecp"> <pathelement location="checkstyle/lib/*.jar" />
Modul Praktikum Software Quality Assurance – hal 19 dari 60
<echo message="Cleaning and creating new directory" /> <delete dir="${classes.dir}" /> <mkdir dir="${classes.dir}" /> <echo message="compiling all vehicles and tests classes" /> <javac debug="true" source="1.5" classpathref="cpath" srcdir="${src.dir}" destdir="${classes.dir}"/> <java classname="vehicles.BicycleMain" classpathref="cpath"/>
Untuk menggunakan Apache Ant, perhatikan pada taskdef serta target checkstyle di atas. Pada target tersebut kita definisikan file checks yang kita gunakan yaitu sun_checks.xml. File yang akan kita periksa kesesuaiannya dengan konvensi adalah Bicycle.java dan BicycleMain.java berikut ini: Bicycle.java /* * A sample testable class * taken from: http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html * */ package vehicles; public class Bicycle { // the Bicycle class has three fields public int cadence; public int gear; public int speed; // the Bicycle class has one constructor public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } // the Bicycle class has four methods public void setCadence(int newValue) {
Modul Praktikum Software Quality Assurance – hal 20 dari 60
}
cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void setSpeed(int newValue) { speed = newValue; } public int getGear() { return gear; } public int getCadence() { return cadence; } public int getSpeed() { return speed; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; }
BicycleMain.java package vehicles; import vehicles.*; public class BicycleMain { public static void main (String args[]) { Bicycle Bike = new Bicycle(10, 20, 1); System.out.println("We have a new bicycle wth speed = " + Bike.getSpeed() + ", cadence = " + Bike.getCadence() + ", gear = " + Bike.getGear()); } }
Hasil eksekusi Apache Ant adalah sebagai berikut: $ ant clean Buildfile: build.xml clean: [echo] Cleaning and creating new directory [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/classes BUILD SUCCESSFUL Total time: 0 seconds [bpdp@bpdp-arch bab3]$ ant Buildfile: build.xml checkstyle: [checkstyle] Running Checkstyle 5.0 on 2 files [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:0: Missing package-
Modul Praktikum Software Quality Assurance – hal 21 dari 60
info.java file. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:2: Line has trailing spaces. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:9: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:10: Line has trailing spaces. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:10:1: File contains tab characters (this is the first instance). [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:12:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:12:16: Variable 'cadence' must be private and have accessor methods. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:13:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:13:16: Variable 'gear' must be private and have accessor methods. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:14:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:14:16: Variable 'speed' must be private and have accessor methods. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:15: Line has trailing spaces. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:17:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:17:20: Parameter startCadence should be final. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:17:38: Parameter startSpeed should be final. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:17:54: Parameter startGear should be final. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:22: Line has trailing spaces. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:24:5: Method 'setCadence' is not designed for extension - needs to be abstract, final or empty. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:24:5: Missing a Javadoc
Modul Praktikum Software Quality Assurance – hal 22 dari 60
comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:24:28: Parameter newValue should be final. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:27: Line has trailing spaces. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:28:5: Method 'setGear' is not designed for extension - needs to be abstract, final or empty. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:28:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:28:25: Parameter newValue should be final. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:32:5: Method 'setSpeed' is not designed for extension - needs to be abstract, final or empty. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:32:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:32:26: Parameter newValue should be final. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:36:5: Method 'getGear' is not designed for extension - needs to be abstract, final or empty. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:36:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:40:5: Method 'getCadence' is not designed for extension - needs to be abstract, final or empty. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:40:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:44:5: Method 'getSpeed' is not designed for extension - needs to be abstract, final or empty. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:44:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:48:5: Method 'applyBrake' is not designed for extension - needs to be abstract, final or empty. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:48:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:48:28: Parameter decrement should be final. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:51: Line has trailing
Modul Praktikum Software Quality Assurance – hal 23 dari 60
spaces. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:52:5: Method 'speedUp' is not designed for extension - needs to be abstract, final or empty. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:52:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/Bicycle.java:52:25: Parameter increment should be final. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:3: Using the '.*' form of import should be avoided - vehicles.*. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:3:1: Redundant import from the same package - vehicles.*. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:5:1: Utility classes should not have a public or default constructor. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:7:5: Missing a Javadoc comment. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:7:29: '(' is preceded with whitespace. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:7:30: Parameter args should be final. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:7:41: Array brackets at illegal position. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:9:17: Name 'Bike' must match pattern '^[a-z][a-zA-Z0-9]*$'. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:9:36: '10' is a magic number. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:9:40: '20' is a magic number. [checkstyle] /home/bpdp/kerjaan/modulpraktikum/sqa/bab3/src/vehicles/BicycleMain.java:11: Line is longer than 80 characters. BUILD FAILED /home/bpdp/kerjaan/modul-praktikum/sqa/bab3/build.xml:37: Got 52 errors and 0 warnings. Total time: 1 second $
Jika kita lihat pada hasil di atas, ada 52 error atau bisa dikatakan ada 52 hal
Modul Praktikum Software Quality Assurance – hal 24 dari 60
yang tidak sesuai dengan konvensi source code. Setelah mengetahui ketidaksesuaian tersebut, developer tinggal menyesuaikan dengan konvensi serta menjalankan Apache Ant lagi. 3.4
Latihan 1. Carilah salah satu saja dari hasil eksekusi di atas yang bisa anda betulkan agar sesuai dengan konvensi source code dari Sun. Betulkan kemudian eksekusi ant lagi.
3.5
Tugas Carilah suatu source code Java dari Internet kemudian lakukan
pemeriksaan dengan menggunakan Checkstyle. Tunjukkan bagian-bagian yang tidak sesuai dengan konvensi. Sebutkan juga URL tempat anda mengambil source code Java tersebut.
Modul Praktikum Software Quality Assurance – hal 25 dari 60
MODUL IV Static Analysis Menggunakan FindBugs
4.1
Tujuan 1. Mahasiswa memahami pengertian static analysis 2. Mahasiswa memahami pengertian dari bug patterns dan mengetahui lokasi tempat mencari bug patterns tersebut 3. Mahasiswa memahami fungsi dari software FindBugs 4. Mahasiswa mampu melakukan instalasi terhadap software FindBugs 5. Mahasiswa mampu menggunakan software FindBugs untuk keperluan melacak bugs sesuai dengan bug patterns, baik melaui antarmuka Swing maupun melalui build.xml dari Apache Ant. 6. Mahasiswa mampu membaca dan memahami hasil analisis dari software FindBugs. 7. Mahasiswa mampu mengintegrasikan software FindBugs dalam proyek pengembangan software.
4.2
Teori Singkat FindBugs adalah software yang digunakan untuk keperluan analisis static.
FindBugs bekerja dengan membandingkan antara bytecode yang dihasilkan dengan berbagai bug patterns. Mungkin anda berpikir bahwa tool ini tidak berguna karena pada saat mengkompilasi-pun, error akan dimunculkan jika compiler menemui error tersebut. Hal tersebut memang benar, tetapi tidak semua error bisa diperiksa oleh compiler. Compiler hanya akan memeriksa error yang bersifat sintaksis. Dunia software engineering selama ini juga mengumpulkan berbagai pattern yang berkaitan dengan bugs. Beberapa patterns yang diimplementasikan oleh FindBugs bisa diperoleh di website dari software FindBugs, yaitu di http://findbugs.sourceforge.net/bugDescriptions.html. FindBugs adalah software bebas dan bisa diperoleh dii http://findbugs.sourceforge.net/. Modul Praktikum Software Quality Assurance – hal 26 dari 60
4.3
Praktik
Instalasi FindBugs Download distribusi FindBugs (versi terakhir saat tulisan ini dibuat (5 Oktober 2009) adalah versi 1.3.9. $ ls -al /home/bpdp/master/findbugs/ total 7328 drwxr-xr-x 2 bpdp users 4096 2009-10-01 20:00 . drwxr-xr-x 32 bpdp users 4096 2009-10-04 08:49 .. -rw-r--r-1 bpdp users 7481095 2009-10-01 20:00 findbugs1.3.9.tar.gz $ cd /home/bpdp/software/ $ tar -xzvf findbugs-1.3.9.tar.gz $ mv findbugs-1.3.9 findbugs $ cd findbugs $ ls -la total 140 drwxr-xr-x 7 bpdp users 4096 2009-10-01 20:48 . drwxr-xr-x 27 bpdp users 4096 2009-10-02 10:29 .. -rw-r--r-- 1 bpdp users 1511 2006-11-07 04:11 LICENSE-ASM.txt -rw-r--r-1 bpdp users 2873 2006-11-13 10:35 LICENSEAppleJavaExtensions.txt -rw-r--r-- 1 bpdp users 11767 2006-11-07 04:11 LICENSE-bcel.txt -rw-r--r-1 bpdp users 11358 2008-10-03 10:30 LICENSE-commonslang.txt -rw-r--r-- 1 bpdp users 1257 2006-11-07 04:11 LICENSE-docbook.txt -rw-r--r-- 1 bpdp users 1964 2006-11-07 04:11 LICENSE-dom4j.txt -rw-r--r-1 bpdp users 19241 2008-10-17 10:30 LICENSEjFormatString.txt -rw-r--r-- 1 bpdp users 1586 2008-06-19 01:54 LICENSE-jaxen.txt -rw-r--r-- 1 bpdp users 228 2006-11-07 04:11 LICENSE-jcip.txt -rw-r--r-- 1 bpdp users 1811 2009-04-03 10:57 LICENSE-jdepend.txt -rw-r--r-- 1 bpdp users 251 2007-08-03 11:53 LICENSE-jsr305.txt -rw-r--r-1 bpdp users 1349 2009-06-14 10:57 LICENSE-mysqlconnector.txt -rw-r--r-- 1 bpdp users 26430 2006-11-07 04:11 LICENSE.txt -rw-r--r-- 1 bpdp users 633 2008-06-13 10:30 README.txt drwxr-xr-x 4 bpdp users 4096 2009-10-01 20:48 bin drwxr-xr-x 5 bpdp users 4096 2009-10-01 20:48 doc drwxr-xr-x 2 bpdp users 4096 2009-10-01 20:48 lib drwxr-xr-x 2 bpdp users 4096 2009-10-01 20:48 plugin drwxr-xr-x 3 bpdp users 4096 2009-10-01 20:48 src $
Edit $HOME/.bashrc dan tambahkan berikut ini: export FINDBUGS_HOME=/home/bpdp/software/findbugs/ export PATH=$PATH:$FINDBUGS_HOME/bin Setelah itu, setiap login, path untuk FindBugs ini akan dikenali dan file-file
Modul Praktikum Software Quality Assurance – hal 27 dari 60
executable bisa langsung dieksekusi. Struktur Direktori dan File . |-- build.xml |-- classes `-- src `-- vehicles |-- Bicycle.java `-- BicycleMain.java build.xml File ini hanya diperlukan jika kita akan menggunakan Apache Ant. <project name="findbugs" default="findbugs" basedir="."> <property name="classes.dir" value="classes" /> <property name="src.dir" value="src" /> <path id="cpath"> <pathelement location="${classes.dir}"/> <echo message="Cleaning and creating new directory" /> <delete dir="${classes.dir}" /> <mkdir dir="${classes.dir}" /> <echo message="compiling all vehicles and tests classes" /> <javac debug="true" source="1.5" classpathref="cpath" srcdir="${src.dir}" destdir="${classes.dir}"/> <java classname="vehicles.BicycleMain" classpathref="cpath"/> <property name="findbugs.home" value="/home/bpdp/software/findbugs" /> <pathelement location="${findbugs.home}/lib/findbugs.jar" /> <pathelement location="${findbugs.home}/lib/findbugs-ant.jar" /> <sourcePath path="${src.dir}" />
Modul Praktikum Software Quality Assurance – hal 28 dari 60
Bicycle.java /* * taken from: http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html * */ package vehicles; public class Bicycle { // the Bicycle class has three fields public int cadence; public int gear; public int speed; // the Bicycle class has one constructor public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; String myName = "Bambang"; myName.replace("B", "L"); } // the Bicycle class has four methods public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void setSpeed(int newValue) { speed = newValue; } public int getGear() { return gear; } public int getCadence() { return cadence; } public int getSpeed() { return speed; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; } }
Perhatikan pada source code di atas (Bicycle.java). Di source code terdapat bagian yang membuat object String (String myName = “Bambang”;) dan
Modul Praktikum Software Quality Assurance – hal 29 dari 60
penggantian satu karakter B dengan L (myName.replace(”B”, “L”);). Bagian ini pada saat dikompilasi tidak akan menghasilkan kesalahan dan program tetap bisa dijalankan dengan baik, tetapi bagian tersebut bukan merupakan praktik yang baik karena statement tersebut tidak akan berguna. myName pada bagian tersebut merupakan object yang bersifat immutable dan merupakan salah satu bug pattern. Bagian tersebut tidak akan menghasilkan error, tetapi tidak berguna sama sekali karena setelah statement tersebut, myName tetap berisi seperti sebelumnya. BicycleMain.java package vehicles; import vehicles.*; public class BicycleMain { public static void main (String args[]) { Bicycle Bike = new Bicycle(10, 20, 1); System.out.println("We have a new bicycle wth speed = " + Bike.getSpeed() + ", cadence = " + Bike.getCadence() + ", gear = " + Bike.getGear()); } }
Analisis Static Menggunakan FindBugs GUI Jalankan FindBugs dengan mengeksekusi perintah “findbugs.sh” (jika menggunakan Linux) atau “findbugs.bat” (jika menggunakan Windows). Berikut adalah hasilnya:
Modul Praktikum Software Quality Assurance – hal 30 dari 60
Setiap melakukan analisis, buat proyek baru dengan memilih menu File – New Project … berikut ini:
Modul Praktikum Software Quality Assurance – hal 31 dari 60
Setelah menetapkan direktori untuk classes dan src, klik pada Finish. Berikut adalah hasilnya:
Modul Praktikum Software Quality Assurance – hal 32 dari 60
Analisis Static Menggunakan Apache Ant Selain menggunakan GUI seperti di atas, bisa juga digunakan Apache Ant. Ekseksui “ant compile” untuk mengkompilasi tidak akan menghasilkan error, tetapi dengan FindBugs, bagian yang sesuai dengan bug pattern “Ignores Return Value” akan tertangkap oleh FindBugs. Perhatikan dan kerjakan snapshots berikut: $ ant compile Buildfile: build.xml clean: [echo] Cleaning and creating new directory [delete] Deleting directory /home/bpdp/kerjaan/modulpraktikum/sqa/bab4/classes [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/bab4/classes compile: [echo] compiling all vehicles and tests classes [javac] Compiling 2 source files to /home/bpdp/kerjaan/modulpraktikum/sqa/bab4/classes BUILD SUCCESSFUL
Modul Praktikum Software Quality Assurance – hal 33 dari 60
Total time: 1 second $ ant findbugs Buildfile: build.xml clean: [echo] Cleaning and creating new directory [delete] Deleting directory /home/bpdp/kerjaan/modulpraktikum/sqa/bab4/classes [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/bab4/classes compile: [echo] compiling all vehicles and tests classes [javac] Compiling 2 source files to /home/bpdp/kerjaan/modulpraktikum/sqa/bab4/classes findbugs: [findbugs] Executing findbugs from ant task [findbugs] Running FindBugs... [findbugs] Warnings generated: 1 [findbugs] Calculating exit code... [findbugs] Setting 'bugs found' flag (1) [findbugs] Exit code set to: 1 [findbugs] Java Result: 1 [findbugs] Output saved to findbugs-results.txt BUILD SUCCESSFUL Total time: 5 seconds
Hasil tersebut akan disimpan pada file findbugs-results.txt dengan format file text seperti yang disebutkan pada build.xml. Isi dari file hasil tersebut adalah sebagai berikut: $ cat findbugs-results.txt H C RV: new vehicles.Bicycle(int, int, int) ignores return value of String.replace(CharSequence, CharSequence) At Bicycle.java:[line 23] $
4.4
Latihan 1. Betulkan source code di atas kemudian kompilasi dan periksa lagi dengan software FindBugs sampai tidak terdapat bug.
4.5
Tugas Carilah source code Java di Internet kemudian lakukan analisis statis
dengan menggunakan FindBugs. Catat hasilnya dan buatlah analisisnya.
Modul Praktikum Software Quality Assurance – hal 34 dari 60
MODUL V Unit Testing Menggunakan JUnit 5.1
Tujuan 1. Mahasiswa
memahami
pengertian
unit
testing
dan
pentingnya
mengaplikasikan unit testing tersebut dalam pembuatan aplikasi. 2. Mahasiswa memahami berbagai framework yang bisa digunakan untuk unit testing. 3. Mahasiswa memahami dan mampu mengintegrasikan JUnit dalam proyek pembuatan aplikasi menggunakan Java 4. Mahasiswa mampu membuat kelas untuk keperluan unit test suatu kelas. 5.2
Teori Singkat Unit testing adalah metode verifikasi dan validasi software yang dilakukan
oleh developer untuk memastikan bahwa unit individual dari suatu source code berfungsi sebagaimana dimaksudkan. Unit individual dalam suatu source code bisa berupa function dan procedure (pada paradigma terstruktur) serta class dengan berbagai method (pada paradigma obyek). Dalam literatur software testing, biasanya unit testing ini dibagi menjadi dua kategori yaitu •
Static unit testing
•
Dynamic unit testing
Static Unit Testing Dalam static unit testing, developer tidak mengeksekusi unit individual tersebut tetapi akan dilakukan review terhadap source code tersebut dengan melihat berbagai kemungkinan perilaku yang mungkin terjadi terhadap software. Review terhadap unit individual dilaksanakan dengan menggunakan 2 teknik: •
Inspection: review dilakukan oleh peer group dengan suatu kriteria tertentu.
•
Walkthrough: developer memimpin tim untuk
Modul Praktikum Software Quality Assurance – hal 35 dari 60
melakukan simulasi
berdasarkan skenario tertentu.
Dynamic Unit Testing Dalam dynamic unit testing, developer melakukan eksekusi source code secara terisolasi, dalam artian tidak berada dalam execution environment yang semestinya. Unit Testing dan Metodologi Pengembangan Software Metodologi
pengembangan
software
pada
dasarnya
terdiri
atas
pemodelan dan proses dalam pembuatan software. Pada umumnya, saat ini pendekatan yang digunakan adalah pendekatan iteratif. Unit testing ini mempunyai kedudukan yang vital dalam metodologi XP (Extreme Programming) dan bahkan cenderung menjadi suatu metodologi sendiri, yaitu Test-Driven Development. Dalam metodologi ini, stub untuk test dibuat terlebih dahulu berdasarkan skenario atau suatu requirements tertentu. Pada awalnya, tentu saja semua test akan menghasilkan failure. Iterasi berikutnya akan digunakan untuk memastikan bahwa test akan menghasilkan lolos-uji (pass). Framework untuk Testing Untuk mempraktikkan unit testing, diperlukan framework tertentu. Unit testing mulai banyak dibicarakan setelah Kent Beck membangun framework SUnit (menggunakan Smalltalk). Setelah itu, produk-produk framework software untuk unit testing banyak bermunculan berdasarkan pattern dari SUnit tersebut (dikenal dengan sebutan xUnit). Beberapa framework tersebut diantaranya adalah: •
JUnit
•
TestNG
•
JTest, dan lain-lain.
Tentang JUnit
Modul Praktikum Software Quality Assurance – hal 36 dari 60
JUnit adalah software yang dibuat oleh Kent Beck, Erich Gamma, dan David Saff. JUnit adalah software bebas dengan lisensi CPL (Common Public License) versi 1.0. JUnit bisa diperoleh pada alamat URL http://www.junit.org. 5.3
Praktik
Strukur Direktori dan File . |-|-|-| | | `--
build.xml classes lib |-- ant-junit.jar |-- junit-4.7.jar `-- junit-dep-4.7.jar src |-- tests | `-- BicycleTest.java `-- vehicles `-- Bicycle.java
Unit test akan dilakukan terhadap kelas Bicycle (dalam file Bicycle.java). Unit test diletakkan pada paket tests di direktori src. build.xml <project name="junit4" default="test" basedir="."> <property name="output.dir" value="test-results" /> <property name="classes.dir" value="classes" /> <property name="src.dir" value="src" /> <property name="lib.dir" value="lib" /> <property name="report.dir" value="reports" /> <path id="cpath"> <pathelement location="${lib.dir}/junit-4.7.jar"/> <pathelement location="${classes.dir}"/> <echo message="Cleaning and creating new directory" /> <delete dir="${classes.dir}" /> <delete dir="${output.dir}" /> <delete dir="${report.dir}" /> <mkdir dir="${classes.dir}" />
Modul Praktikum Software Quality Assurance – hal 37 dari 60
<mkdir dir="${report.dir}" /> <echo message="compiling all vehicles and tests classes" /> <javac debug="true" source="1.5" classpathref="cpath" srcdir="${src.dir}" destdir="${classes.dir}"/> <junit printsummary="yes" haltonfailure="yes"> <pathelement location="${classes.dir}"/> <pathelement path="${lib.dir}/ant-junit.jar"/> <pathelement path="${lib.dir}/junit-4.7.jar"/> <pathelement path="${lib.dir}/junit-dep-4.7.jar"/> Target yang digunakan untuk melakukan unit testing adalah target “test”. Hasil akan disimpan di direktori sesuai isi variabel ${report.dir}. Unit test dilakukan terhadap seluruh isi direktori ${src.dir} dengan pola file *Test*.java. Dengan demikian, dari pola tersebut akan diketahui bahwa yang berisi unit test adalah BicycleTest.java. Bicycle.java /* * A sample testable class * http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html * */ package vehicles; public class Bicycle { // the Bicycle class has three fields
Modul Praktikum Software Quality Assurance – hal 38 dari 60
}
public int cadence; public int gear; public int speed; // the Bicycle class has one constructor public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } // the Bicycle class has four methods public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void setSpeed(int newValue) { speed = newValue; } public int getGear() { return gear; } public int getCadence() { return cadence; } public int getSpeed() { return speed; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; }
BicycleTest.java package tests; import vehicles.*; import org.junit.*; import static org.junit.Assert.*; public class BicycleTest { @Test public void test_applyBrake() { System.out.println("Test applyBrake method ..."); Bicycle Bike = new Bicycle(10, 20, 1); assertEquals(Bike.getGear(), 1); assertEquals(Bike.getSpeed(), 20);
Modul Praktikum Software Quality Assurance – hal 39 dari 60
assertEquals(Bike.getCadence(), 10); // testing setter Bike.setGear(2); Bike.setSpeed(30); Bike.setCadence(5); assertEquals(Bike.getGear(), 2); assertEquals(Bike.getSpeed(), 30); assertEquals(Bike.getCadence(), 5); Bike.applyBrake(10); assertEquals(Bike.getSpeed(), 20); } @Test public void test_speedUp() { System.out.println("Test speedUp method ...") ; Bicycle Bike = new Bicycle(10, 20, 1); assertEquals(Bike.getGear(), 1); assertEquals(Bike.getSpeed(), 20); assertEquals(Bike.getCadence(), 10); // testing setter Bike.setGear(2); Bike.setSpeed(30); Bike.setCadence(5); assertEquals(Bike.getGear(), 2); assertEquals(Bike.getSpeed(), 30); assertEquals(Bike.getCadence(), 5); Bike.speedUp(5); assertEquals(Bike.getSpeed(), 35); } } Hasil eksekusi untuk unit test tersebut adalah sebagai berikut: $ ant test Buildfile: build.xml clean: [echo] Cleaning and creating new directory [delete] Deleting directory /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab5/classes [delete] Deleting directory /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab5/reports [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab5/classes [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab5/reports compile: [echo] compiling all vehicles and tests classes [javac] Compiling 2 source files to /home/bpdp/kerjaan/modul-
Modul Praktikum Software Quality Assurance – hal 40 dari 60
praktikum/sqa/src/bab5/classes test: [junit] Running tests.BicycleTest [junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.019 sec BUILD SUCCESSFUL Total time: 1 second $
Hasil dari unit testing akan diletakkan pada direktori reports (yaitu direktori yang sesuai dengan nama yang dideskripsikan di ${report.dir}) berikut ini: [bpdp@bpdp-arch bab5]$ cat reports/TEST-tests.BicycleTest.txt Testsuite: tests.BicycleTest Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.019 sec ------------- Standard Output --------------Test applyBrake method ... Test speedUp method ... ------------- ---------------- --------------Testcase: test_applyBrake took 0.004 sec Testcase: test_speedUp took 0 sec [bpdp@bpdp-arch bab5]$
5.4
Latihan 1. Tambahkan sembarang satu method pada Bicycle.java dan buatlah unit testing-nya.
5.5
Tugas Buatlah proyek baru dan dalam proyek tersebut terdapat 2 class. Buatlah
juga unit testingnya dan jalankan test tersebut dengan menggunakan target dari Apache Anti di build.xml.
Modul Praktikum Software Quality Assurance – hal 41 dari 60
MODUL VI Code Coverage Menggunakan Cobertura 6.1
Tujuan 1. Mahasiswa memahami pengertian code coverage 2. Mahasiswa memahami berbagai tipe coverage yang mungkin bisa dilakukan pada source code 3. Mahasiswa memahami pengertian instrumentasi 4. Mahasiswa mampu melakukan instalasi software Cobertura 5. Mahasiswa memahami dan mampu mengaplikasikan Cobertura untuk melakukan proses code coverage. 6. Mahasiswa memahami dan mampu membaca hasil output dari Cobertura.
6.2
Teori Singkat Code coverage berkaitan dengan istilah tentang pengukuran dan
terutama digunakan berkaitan dengan software testing. Code coverage menunjukkan seberapa lengkap suatu source code telah dicakup dengan test. Code coverage merupakan bagian dari White Box testing. White Box testing merupakan testing yang dilakukan terhadap kondisi internal dari software dan berkaitan dengan cara kerja atau source code dari software tersebut secara langsung. Code coverage merupakan jenis dari White Box testing karena testing tidak dilakukan terhadap interface atau contract dari sistem. Code coverage ini pertama kali dipublikasikan oleh Miller dan Maloney (1963). Jenis-jenis Code Coverage Code coverage mempunyai beberapa kriteria berikut ini: •
Function coverage, apakah setiap function dalam source code telah dipanggil?
•
Statement / Line coverage, apakah setiap baris dari source code telah dieksekusi?
•
Decision / Branch coverage, apakah setiap struktur kendali (if … elseif …
Modul Praktikum Software Quality Assurance – hal 42 dari 60
else …) telah dievaluasi ke TRUE atau FALSE? •
Condition / Predicate coverage, apakah setiap sub ekspresi boolean dievaluasi ke TRUE atau FALSE?
•
Modified Condition / Decision coverage, apakah untuk suatu decision, setidaknya dipenuhi salah satu kemungkinan?
•
Path coverage, apakah setiap jalur yang mungkin telah dieksekusi?
•
Entry/exit coverage, apakah setiap kemungkinan dari pemanggilan dan nilai kembalian dari function telah dieksekusi?
•
Relational operator coverage, memeriksa apakah ekspresi dengan operator relasional (<, <=, >, >=) diperiksa dengan nilai seperti batas yang telah ditetapkan.
Instrumentasi Pada dasarnya, code coverage dilaksanakan dengan menggunakan instrumentation.
Instrumentation
adalah
istilah
yang
digunakan
untuk
menunjukkan manipulasi aplikasi dengan cara melakukan injeksi kode-kode untuk reporting ke dalam posisi-posisi tertentu yang bisa menunjukkan bagian yang telah dicakup oleh test atau belum. Instrumentasi dilakukand pada level source code atau level compiled. Pada level source code, tool yang digunakan akan menginjeksikan kode instrumentasi ke source code (mengubah source code) baru kemudian di kompilasi. Pada level compiled, kode instrumentasi diinjeksikan setelah dikompilasi. Tentang Cobertura Cobertura (bahasa spanyol dari “coverage”) adalah software tool yang digunakan untuk keperluan mengukur code coverage untuk Java. Cobertura adalah software bebas dan bisa diperoleh di http://cobertura.sourceforge.net. Cobertura adalah fork dari jcoverage (http://www.jcoverage.com). Cobertura bersama-sama dengan JUnit akan mengukur ketercakupun test untuk source code dan kemudian membuat lapora dalam bentuk HTML ataupun XML.
Modul Praktikum Software Quality Assurance – hal 43 dari 60
Cobertura melakukan injeksi (instrumentasi) setelah source code dikompilasi menjadi class. 6.3
Praktik
Instalasi Cobertura Cobertura terakhir saat tulisan ini dibuat (11 Oktober 2009) adalah versi 1.9.3 yang dirilis pada tanggal 17 September 2009. Download file cobertura1.9.3-bin.tar.bz2 kemudian ekstrak pada direktori tertentu dengan perintah “tar -xjvf cobertura-1.9.3-bin.tar.bz2″. Berikut ini adalah hasilnya: [bpdp@bpdp-arch new]$ ls -la /home/bpdp/software/cobertura-1.9.3/ total 536 drwxr-xr-x
4 bpdp users
drwxr-xr-x 29 bpdp users
4096 2009-09-18 04:01 . 4096 2009-10-11 07:57 ..
-rw-r--r--
1 bpdp users
-rw-r--r--
1 bpdp users
2340 2009-09-18 04:01 COPYRIGHT
-rw-r--r--
1 bpdp users
12491 2009-09-18 04:01 ChangeLog
-rw-r--r--
1 bpdp users
956 2009-09-18 04:01 README
-rw-r--r--
1 bpdp users
611 2009-09-18 04:01 cobertura-check.bat
-rw-r--r--
1 bpdp users
211 2009-09-18 04:01 cobertura-check.sh
-rw-r--r--
1
18332 2009-09-18 04:01 COPYING
bpdp
users
616
2009-09-18
04:01
cobertura-
bpdp
users
216
2009-09-18
04:01
cobertura-
instrument.bat -rw-r--r--
1
instrument.sh -rw-r--r--
1 bpdp users
611 2009-09-18 04:01 cobertura-merge.bat
-rw-r--r--
1 bpdp users
211 2009-09-18 04:01 cobertura-merge.sh
-rw-r--r--
1 bpdp users
615 2009-09-18 04:01 cobertura-report.bat
-rw-r--r--
1 bpdp users
215 2009-09-18 04:01 cobertura-report.sh
-rw-r--r--
1 bpdp users 445936 2009-09-18 04:01 cobertura.jar
-rw-r--r--
1 bpdp users
3471 2009-09-18 04:01 coberturaFlush.war
drwxr-xr-x
3 bpdp users
4096 2009-09-18 04:01 examples
drwxr-xr-x
2 bpdp users
4096 2009-10-10 23:22 lib
[bpdp@bpdp-arch new]$
Modul Praktikum Software Quality Assurance – hal 44 dari 60
Struktur Direktori dan File . |-|-|-| | `--
build.properties build.xml lib |-- junit-4.7.jar `-- junit-dep-4.7.jar src |-- tests | `-- BicycleTest.java `-- vehicles |-- Bicycle.java `-- Car.java
Catatan: pada bagian ini kita sengaja membuat Car.java tanpa unit test. build.xml <project name="code.coverage.with.cobertura" default="coverage" basedir="."> <description>Project's code coverage project with Cobertura <property file="build.properties" /> <path id="cobertura.classpath"> <path id="junit.classpath"> <mkdir dir="${classes.dir}" /> <mkdir dir="${instrumented.dir}" /> <mkdir dir="${reports.xml.dir}" /> <mkdir dir="${reports.html.dir}" /> <mkdir dir="${coverage.xml.dir}" /> <mkdir dir="${coverage.summaryxml.dir}" /> <mkdir dir="${coverage.html.dir}" />
Modul Praktikum Software Quality Assurance – hal 45 dari 60
<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="yes"> <delete file="cobertura.ser"/> <delete dir="${instrumented.dir}" /> <exclude name="**/*Test.class" /> <junit fork="yes" dir="${basedir}" failureProperty="test.failed">
Modul Praktikum Software Quality Assurance – hal 46 dari 60
<junitreport todir="${reports.xml.dir}"> <delete dir="${classes.dir}" /> <delete dir="${instrumented.dir}" /> <delete dir="${reports.dir}" /> <delete file="cobertura.log" /> <delete file="cobertura.ser" /> <delete file="build.xml~" /> <delete file="build.properties~" />
build.properties src.dir=src cobertura.dir=/home/bpdp/software/cobertura-1.9.3 lib.dir=lib classes.dir=classes instrumented.dir=instrumented reports.dir=reports reports.xml.dir=${reports.dir}/junit-xml reports.html.dir=${reports.dir}/junit-html coverage.xml.dir=${reports.dir}/cobertura-xml coverage.summaryxml.dir=${reports.dir}/cobertura-summaryxml coverage.html.dir=${reports.dir}/cobertura-html Catatan: sesuaikan path di atas dengan letak dari instalasi Cobertura. Bicycle.java /* * A sample testable class * http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html * */ package vehicles; public class Bicycle { // the Bicycle class has three fields public int cadence; public int gear; public int speed; // the Bicycle class has one constructor public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } // the Bicycle class has four methods public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void setSpeed(int newValue) { speed = newValue;
Modul Praktikum Software Quality Assurance – hal 48 dari 60
}
} public int getGear() { return gear; } public int getCadence() { return cadence; } public int getSpeed() { return speed; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; }
Car.java package vehicles; public class Car { public int cadence; public int gear; public int speed; public Car(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void setSpeed(int newValue) { speed = newValue; } public int getGear() { return gear; } public int getCadence() { return cadence; } public int getSpeed() { return speed; } public void applyBrake(int decrement) { speed -= decrement; }
Modul Praktikum Software Quality Assurance – hal 49 dari 60
}
public void speedUp(int increment) { speed += increment; } public void park() { speed = 0; cadence = 0; gear = 0; }
BicycleTest.java package tests; import vehicles.*; import org.junit.* ; import static org.junit.Assert.* ; public class BicycleTest { @Test public void test_applyBrake() { System.out.println("Test applyBrake method ..."); Bicycle Bike = new Bicycle(10, 20, 1); assertEquals(Bike.getGear(), 1); assertEquals(Bike.getSpeed(), 20); assertEquals(Bike.getCadence(), 10); // testing setter Bike.setGear(2); Bike.setSpeed(30); Bike.setCadence(5); assertEquals(Bike.getGear(), 2); assertEquals(Bike.getSpeed(), 30); assertEquals(Bike.getCadence(), 5); Bike.applyBrake(10); assertEquals(Bike.getSpeed(), 20); } @Test public void test_speedUp() { System.out.println("Test speedUp method ...") ; Bicycle Bike = new Bicycle(10, 20, 1); assertEquals(Bike.getGear(), 1); assertEquals(Bike.getSpeed(), 20); assertEquals(Bike.getCadence(), 10); // testing setter Bike.setGear(2); Bike.setSpeed(30); Bike.setCadence(5); Modul Praktikum Software Quality Assurance – hal 50 dari 60
}
assertEquals(Bike.getGear(), 2); assertEquals(Bike.getSpeed(), 30); assertEquals(Bike.getCadence(), 5); Bike.speedUp(5); assertEquals(Bike.getSpeed(), 35);
}
Hasil ekseksi Buildfile: build.xml init: [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab6/new/classes [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab6/new/instrumented [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab6/new/reports/junit-xml [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab6/new/reports/junit-html [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab6/new/reports/cobertura-xml [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab6/new/reports/cobertura-summary-xml [mkdir] Created dir: /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab6/new/reports/cobertura-html compile: [javac] Compiling 3 source files to /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab6/new/classes instrument: [delete] Deleting directory /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab6/new/instrumented [cobertura-instrument] Cobertura 1.9.3 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file [cobertura-instrument] Instrumenting 2 files to /home/bpdp/kerjaan/modul-praktikum/sqa/src/bab6/new/instrumented [cobertura-instrument] Cobertura: Saved information on 2 classes. [cobertura-instrument] Instrument time: 127ms test: [junit] Cobertura: Loaded information on 2 classes. [junit] Cobertura: Saved information on 2 classes. [junitreport] Processing /home/bpdp/kerjaan/modulpraktikum/sqa/src/bab6/new/reports/junit-xml/TESTS-TestSuites.xml to /tmp/null785389569 [junitreport] Loading stylesheet jar:file:/home/bpdp/software/apacheant-1.7.1/lib/antjunit.jar!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junitframes.xsl [junitreport] Transform time: 544ms [junitreport] Deleting: /tmp/null785389569
Modul Praktikum Software Quality Assurance – hal 51 dari 60
coverage-report: [cobertura-report] Cobertura 1.9.3 - GNU GPL License (NO WARRANTY) See COPYRIGHT file [cobertura-report] Cobertura: Loaded information on 2 classes. [cobertura-report] Report time: 142ms summary-coverage-report: [cobertura-report] Cobertura 1.9.3 - GNU GPL License (NO WARRANTY) See COPYRIGHT file [cobertura-report] Cobertura: Loaded information on 2 classes. [cobertura-report] Report time: 129ms alternate-coverage-report: [cobertura-report] Cobertura 1.9.3 - GNU GPL License (NO WARRANTY) See COPYRIGHT file [cobertura-report] Cobertura: Loaded information on 2 classes. [cobertura-report] Report time: 195ms coverage: BUILD SUCCESSFUL Total time: 4 seconds
Hasil dari eksekusi diatas adalah laporan yang bisa dilihat pada direktori reports. Berikuti ini adalah screenshots dari reports tersebut.
Modul Praktikum Software Quality Assurance – hal 52 dari 60
Modul Praktikum Software Quality Assurance – hal 53 dari 60
6.4
Latihan 1. Buatlah unit test untuk Car.java sehingga code coverage menjadi 100%
6.5
Tugas Carilah contoh program dari Internet. Sebutkan URL tempat program
tersebut berada. Buatlah analisis code coverage dari program tersebut dengan menggunakan Cobertura.
Modul Praktikum Software Quality Assurance – hal 54 dari 60
MODUL VII Refactoring 7.1
Tujuan 1. Mahasiswa memahami pengertian refactoring serta peran dari refactoring dalam peningkatan kualitas software. 2. Mahasiswa memahami jenis-jenis refactoring yang bisa ditangani oleh IDE NetBeans. 3. Mahasiswa memahami dan mampu melakukan proses refactoring.
7.2
Teori Singkat Refactoring adalah proses yang dilakukan oleh developer untuk
memperbaiki kualitas internal source code tanpa mengubah behaviour atau fungsionalitas dari program aplikasi yang dibangun. Refactoring ini merupakan suatu bentuk dari program transformation. Pada dasarnya, refactoring biasanya bertujuan untuk: 1. Meningkatkan keterbacaan (readibility) dari source code. 2. Menyederhanakan struktur source code. 3. Menyesuaikan dengan perubahan konvensi 4. Meningkatkan
kemampuan
source
code
untuk
bisa
dirawat
(maintainability). 5. Meningkatkan kinerja 6. Meningkatkan ekstensibilitas. Contoh paling sederhana dari refactoring ini adalah perubahan nama kelas. Jika dilakukan secara manual, proses ini akan memakan waktu yang lama jika proyek yang dilaksanakan adalah proyek yang besar. Selain itu, proses tersebut akan bersifat error prone atau mudah terjadi error. Hal ini disebabkan karena perubahan nama kelas akan mengubah nama file, mengubah seluruh bagian dari source code di file-file lain yang berisi pembuatan instance baru dari kelas yang bersangkutan, dan seterusnya. Istilah refactoring pertama kali muncul pada suatu artikel oleh William F. Modul Praktikum Software Quality Assurance – hal 55 dari 60
Opdyke dan Ralph E. Johnson pada tahun 1990. Thesis dari Opdyke juga merupakan thesis yang pertama membahas tentang refactoring browser. Sebelumnya, di komunitas Forth (suatu nama bahasa pemrograman), sudah terdapat istilah factoring sejak tahun 1984 dengan pengertian yang sama dengan refactoring meskipun mempunyai ruang lingkup yang lebih kecil. Beberapa operasi yang relatif umum dijumpai untuk refactoring ini antara lain adalah: 1. Perubahan nama (method, class, dan lain-lain) 2. Perubahan letak kelas dari satu paket ke paket lain 3. Perubahan parameter method 4. Memindahkan method ke superclass 5. Memindahkan method ke subclass 6. Menyalin class ke satu paket yang sama atau ke paket lain. 7. Menghapus property / method (jika tidak ada bagian lain dari source code yang mereferensi propery / method tersebut). 8. Konversi inner class ke outer class dan sebaliknya. 7.3
Praktik Dengan menggunakan NetBeans (versi 6.7.1), bukalah salah satu contoh
program demo di JDK yang telah terinstall di komputer anda. Letak dari program demo tersebut ada di $JAVA_HOME/demo/. Setelah itu cobalah buka salah satu file source code dari salah satu demo tersebut. Lakukan langkah-langkah berikut (asumsi, demo yang dibuka disini adalah Stylepad dan source code yang dibuka adalah Notepad.java): 1. Pilih menu Refactor 2. Pilih menu Rename... 3. Isikah nama kelas baru EditorPad sebagai berikut:
Modul Praktikum Software Quality Assurance – hal 56 dari 60
Setelah itu klik pada Preview, NetBeans akan menampilkan hasil analisis refactoring berikut ini:
Perhatikan sisi paling kiri dan lihat berbagai perubahan yang akan dilakukan. Untuk mengimplementasikan refactoring sesuai analisis tersebut, klik pada Do Refactoring. Perhatikan berbagai perubahan yang terjadi. 7.4
Latihan 1. Buka salah satu project demo JDK di NetBeans. Buatlah refactoring untuk mengubah salah satu method dari kelas yang terdapat pada source code project demo yang anda buat tersebut.
7.5
Tugas Carilah source code di Internet yang membahas tentang inner class.
Gunakan NetBeans untuk mengeluarkan inner class tersebut keluar menjadi suatu kelas tersendiri. Modul Praktikum Software Quality Assurance – hal 57 dari 60
MODUL VIII Acceptance Test 8.1
Tujuan 1. Mahasiswa memahami pengertian Acceptance Tests 2. Mahasiswa memahami gambaran pelaksanaan Acceptance Tests 3. Mahasiswa memahami bahwa terdapat kemungkinan melaksanakan automated acceptance test. 4. Mahasiswa memahami pengertian serta struktur dari ATP (Acceptance Test Plan). 5. Mahasiswa mampu membuat ATP
8.2
Teori Singkat Acceptance Tests adalah suatu uji yang dilakukan dengan tujuan untuk
melihat tingkat penerimaan klien terhadap aplikasi yang dibuat. Pada dasarnya, AT bisa dibagi 2, yaitu: 1. BAT (Business Acceptance Tests), yaitu AT yang dilakukan secara komprehensif oleh developer atau siapapun juga dari pihak pengembang untuk memastikan bahwa aplikasi tersebut siap untuk diuji oleh klien. 2. UAT (User Acceptance Tests), yaitu uji penerimaan yang dilaksanakan secara langsung oleh klien dengan cara melakukan test secara komprehensif sesuai dengan ATP (Acceptance Test Plan). Untuk keperluan pelaksanaan AT ini, perlu dibuat suatu acceptance criteria, yaitu kriteria-kriteria yang menjadi dasar penentuan tingkat penerimaan klien terhadap program aplikasi yang dikembangkan. Dengan berdasar pada acceptance criteria tersebut, bisa dibuat ATP. Suatu ATP terdiri atas: Acceptance Test Plan Suatu ATP mempunyai beberapa bagian yang merupakan kelengkapan dari ATP tersebut. Pada dasarnya, suatu ATP terdiri atas: 1. Halaman judul Modul Praktikum Software Quality Assurance – hal 58 dari 60
2. Change Logs (catatan-catatan perubahan terhadap ATP) 3. Daftar Isi 4. Ringkasan Eksekutif (berisi deskripsi singkat dari dokumen yang bisa digunakan untuk mem-validasi kesesuaian project dengan requirements) 5. Test yang dilaksanakan. Untuk point 5 di atas, setiap bagian dari test akan dirinci ke dalam point-point berikut ini: 1. Deskripsi singkat tentang kemampuan sistem yang akan diuji 2. Requirements mana yang akan diverifikasi oleh test. 3. Pre-kondisi dari test, berkaitan dengan kondisi berbagai infrastruktur hardware maupun software sebelum test dilaksanakan, misalnya sebelum test database dump sudah harus dimasukkan ke dalam current database. 4. Langkah-langkah pengujian, setiap langkah harus bernomor (sesuai dengan nomor seksi dokumen), mempunyai bagian untuk menandai (“ ___ “) yang bisa di-check / di-centang jika test tersebut telah dilaksanakan, berisi instruksi yang detail langkah per langkah. 5. Post-kondisi dari test, berkaitan dengan operasi-operasi apa yang perlu dilaksanakan sehingga software siap untuk diuji pada uji selanjutnya. 8.3
Praktik Bukalah salah satu demo dari JDK, kemudian tentukan Acceptance
Criteria dari demo tersebut. Salah satu contoh dari Acceptance Criteria dari aplikasi Stylepad adalah: Program
mampu
menampilkan
teks
dalam
pemformatan
garis
bawah
(underline), berhuruf miring (italic), dan tebal (bold). 8.4
Latihan 1. Buka salah satu demo lagi dan kemudian buatlah minimal 5 acceptance criteria.
Modul Praktikum Software Quality Assurance – hal 59 dari 60
8.5
Tugas Buatlah ATP dari salah satu demo yang sudah anda buat “acceptance
criteria”-nya.
Modul Praktikum Software Quality Assurance – hal 60 dari 60