Sunday, October 19, 2014

Pengujian kelas Math yang disediakan oleh Java



Pengujian merupakan aktivitas yang sering diabaikan dalam pengembangan karena dapat menghindari peluang kerugian akibat kesalahan yang ditemukan saat pengembangan buakan saat operasi produktif. Kesalahan program dapat berakibat sangat fatal bahkan sampai pada kematian atau kerugian sampai berjuta dollar. Contoh kesalahan yang diakibatkan perangkat lunak, yaitu Ariane-5, roket pengangkut satelit milik masyarakat Eropa malfanction setelah 50 detik peluncuran yang disebabkan overflow pemroses 32 bit yang memperoleh data dari 64 bit.

Pengujian sebaiknya dilakukan secara otomatis bukan secara interaktif. Setelah perbaikan program kita dapat mengulangi pengujian tanpa harus berulang kali memasukkan kasus pengujian lewat keyboard secara interaktif.

Berikut adalah contoh program kelas Math yang disediakan oleh java dan diuji apakah benar berfungsi dengan baik atau tidak.

Program :
public class MathExploreToy {
                public MathExploreToy() {
                }

                static void test(){
                                testE();
                                testPI();
                                testAbs();
                }
                static void betterTest(){
                                testIntAbs();
                }
                static void testE(){
                                System.out.println("Testing untuk Math.E");
                                System.out.println("Math.E = "+Math.E);
                                System.out.println("");
                }
                static void testPI(){
                                System.out.println("Testing untuk Math.PI");
                                System.out.println("Math.PI = "+Math.PI);
                                System.out.println("");
                }
                static void testAbs(){
                                System.out.println("Testing untuk Math.abs()");
                                System.out.println("Math.abs(-23.7) ="+Math.abs(-23.7));
                                System.out.println("Math.abs(0.0) ="+Math.abs(0.0));
                                System.out.println("Math.abs(23.7) ="+Math.abs(23.7));
                                System.out.println("Double.MIN_VALUE = "+Double.MIN_VALUE);
                                System.out.println("Math.abs(Double.MIN_VALUE) = " +Math.abs(Double.MIN_VALUE));
                                System.out.println("Math.abs(-Double.MIN_VALUE) = " +Math.abs(-Double.MIN_VALUE));
                                System.out.println("Double.MAX_VALUE ="+Double.MAX_VALUE);
                                System.out.println("Math.abs(Double.MAX_VALUE) = "+Math.abs(Double.MAX_VALUE));
                                System.out.println("Math.abs(-Double.MAX_VALUE) = "+Math.abs(-Double.MAX_VALUE));
                                System.out.println("");
                }
                static void testIntAbs(){
                                System.out.println("Cara pengujian yang baik - mendukung otomatisasi:");
                                System.out.println("Testing untuk Math.abs() bagi bilangan bulat");
                                if (Math.abs(-23) !=23) System.out.println("Math(-23) :: Error! Hasil harus 23");
                                else System.out.println("Math(-23) :: Correct!");
                                if (Math.abs(23) !=23) System.out.println("Math(23) :: Error! Hasil harus 23");
                                else System.out.println("Math(23) :: Correct!");
                                System.out.println("Integer.MIN_VALUE ="+Integer.MIN_VALUE);
                                System.out.println("Math.abs(Integer.MIN_VALUE) ="+Math.abs(Integer.MIN_VALUE));
                                System.out.println("Integer.MAX_VALUE ="+Integer.MAX_VALUE);
                                if (Math.abs(Integer.MIN_VALUE) != (-Integer.MIN_VALUE)) System.out.println("Math(Integer.MIN_VALUE) :: Error!");
                                else System.out.println("Math(Integer.MIN_VALUE) :: Correct!");
                                if (Math.abs(Integer.MIN_VALUE) < 0) System.out.println("Math(Integer.MIN_VALUE) :: Erro! Hasil harus > 0");
                                else System.out.println("Math(Integer.MIN_VALUE) :: Correct!");
                                if (Math.abs(Integer.MAX_VALUE) != Integer.MAX_VALUE) System.out.println("Math(Integer>MAX_VALUE) :: Error!");
                                else System.out.println("Math(Integer.MAX_VALUE) :: Correct!");
                                System.out.println("\n\nPERHATIAN!");
                                System.out.println(
                                                "Pengujian menunjukkan hasil yang tidak sesuai dengan matematika!!!\n"+
                                                "Pada kondisi batas sangat sulit diprediksi, untuk itu kita harus mengacu dokumentasi bahasa\n"+
                                                "Pengujian otomatis terkadang tidak dapat menemukannya dengan benar karena dibatasi juga\n"+
                                                "oleh kemampuan bahasa itu sendiri bila kesalahan adalah pada spesifikasi bahasa itu sendiri!\n"+
                                                "Pengujian otomatis akan benar ditangani oleh yang ahli , penguji dapat ditambah sbb:\n"+
                                                "Berdasarkan kenyataan bahwa hasil fungsi abs tidak boleh kurang dari nol"
                                );
                                System.out.println(
                                                "\n"+
                                                "Di Java, Math.abs(Integer.MIN_VALUE) justru menghasilkan bilangan negatif. \n"+
                                                "Melanggar rumus matematika dimana hasil fungsi absolut selalu bernilai positif.\n"+
                                                "Hasil ini dapat ditelusuri karena representasi int adalah two's complement\n"+
                                                "Versi yang dipakai penulis :: JDK 1.4"
                                );
                }
                static void testAcos(){
                                System.out.println("Math.acos(0.9) = " + Math.acos(0.9));
                }
                static void testCeil(){
                }
                static void testCos(){
                }
                static void testExp(){
                }
                static void testFloor(){
                }
                static void testLog(){
                }
                static void testMax(){
                }
                static void testMin(){
                }
                static void testPow(){
                }
                static void testSin(){
                }
                static void testSqrt(){
                }
                static void testTan(){
                }
                public static void main(String[] args){
                                test();
                                betterTest();
                }
}
Output :


Penjelasan mengenai program diatas.

static void testE(){
                                System.out.println("Testing untuk Math.E");
                                System.out.println("Math.E = "+Math.E);
                                System.out.println("");
                }
                static void testPI(){
                                System.out.println("Testing untuk Math.PI");
                                System.out.println("Math.PI = "+Math.PI);
                                System.out.println("");
                }
                static void testAbs(){
                                System.out.println("Testing untuk Math.abs()");
                                System.out.println("Math.abs(-23.7) ="+Math.abs(-23.7));
                                System.out.println("Math.abs(0.0) ="+Math.abs(0.0));
                                System.out.println("Math.abs(23.7) ="+Math.abs(23.7));
                                System.out.println("Double.MIN_VALUE = "+Double.MIN_VALUE);
                                System.out.println("Math.abs(Double.MIN_VALUE) = " +Math.abs(Double.MIN_VALUE));
                                System.out.println("Math.abs(-Double.MIN_VALUE) = " +Math.abs(-Double.MIN_VALUE));
                                System.out.println("Double.MAX_VALUE ="+Double.MAX_VALUE);
                                System.out.println("Math.abs(Double.MAX_VALUE) = "+Math.abs(Double.MAX_VALUE));
                                System.out.println("Math.abs(-Double.MAX_VALUE) = "+Math.abs(-Double.MAX_VALUE));
                                System.out.println("");
                }


Metode diatas apabila dipanggil akan memperlihatkan hasil program dilayar dimana kita dapat memeriksa kebenaran antarmuka (yaitu konstanta E dan PI setra metode-metode di kelas).
Pada testAbs() terhadap double , kita harus menerapkan prinsip “equivalence partitions” dimana kita harus memperoleh kelompok-kelompok dimana satu anggota kelompok dapat dipandang mewakili kelompok itu. Dalam persoalan abs() adalah :


  • < 0 , diwakili oleh -23.7 mewakili seluruh anggota kelompok < 0

  • 0 , diwakili oleh 0 yang merupakan satu-satunya anggota kelompok

  • > 0 , diwakili oleh 23.7 mewakili seluruh anggota kelompok > 0

Persoalan berikutanya adalah masalah batas-batas domain. Bila kita membaca dokumentasi java , maka double mengikuti spesifikasi IEEE dalam jangkauan bilangan neagtif dan positif.

Dengan metode test() kita melakukan pengujian namun kita harus mengamati hasil dan membandingkannya sendiri dari hasli yang diperoleh di layar komputer.

Metode betterTest() adalah satu kemajuan berikutnya:

static void testIntAbs(){
                                System.out.println("Cara pengujian yang baik - mendukung otomatisasi:");
                                System.out.println("Testing untuk Math.abs() bagi bilangan bulat");
                                if (Math.abs(-23) !=23) System.out.println("Math(-23) :: Error! Hasil harus 23");
                                else System.out.println("Math(-23) :: Correct!");
                                if (Math.abs(23) !=23) System.out.println("Math(23) :: Error! Hasil harus 23");
                                else System.out.println("Math(23) :: Correct!");
                                System.out.println("Integer.MIN_VALUE ="+Integer.MIN_VALUE);
                                System.out.println("Math.abs(Integer.MIN_VALUE) ="+Math.abs(Integer.MIN_VALUE));
                                System.out.println("Integer.MAX_VALUE ="+Integer.MAX_VALUE);
                                if (Math.abs(Integer.MIN_VALUE) != (-Integer.MIN_VALUE)) System.out.println("Math(Integer.MIN_VALUE) :: Error!");
                                else System.out.println("Math(Integer.MIN_VALUE) :: Correct!");
                                if (Math.abs(Integer.MIN_VALUE) < 0) System.out.println("Math(Integer.MIN_VALUE) :: Erro! Hasil harus > 0");
                                else System.out.println("Math(Integer.MIN_VALUE) :: Correct!");
                                if (Math.abs(Integer.MAX_VALUE) != Integer.MAX_VALUE) System.out.println("Math(Integer>MAX_VALUE) :: Error!");
                                else System.out.println("Math(Integer.MAX_VALUE) :: Correct!");


Sulitnya pengujian tampak pada metode tersebut :
Kita telah dibantu kode pengujian dimana akan tampil dilayar : “Error :: “ bila terdapat kesalahan di program (metode) yang diuji. Namun kita dapat terjebak bila menggunakan fasilitas bahasa pada kasus diatas. Dimana di Java pada kasus batas tidak sesuai definisi matematika untuk fungsi absolut. Penguji harus pintar agar sesuai dengan konstrain yang berlaku di matematika, tidak hanya mengandalkan yang disediakan oleh bahasa.

1 comment:

  1. Titanium vs Titanium Drill Bits: Play with No Deposit
    Titanium vs ford edge titanium 2021 Titanium Drill Bits. fram titanium oil filter A bit about the Titanium. This paper has a very simple titanium bars and flexible titanium pots and pans sheet of paper that will allow you titanium quartz to create a compact,

    ReplyDelete