Pengenalan Test Driven Development

Test Driven Development (TDD) bagi saya merupakan sebuah metodologi mengembangkan baris program dengan berlandaskan Test sebagai kunci utama dalam proses pengembangan tersebut. Mengapa TDD menjadi penting? Buat saya pribadi adalah dengan menjadikan Test sebagai acuan, kita dapat mereduksi kesalahan-kesalahan dalam mengembangkan sebuah program aplikasi, membantu kita dalam melakukan refactoring, dan masih banyak manfaat lainnya.

Pada dasarnya, setiap kali kita membuat sebuah program ada tiga proses yang harus kita perhatikan dan pasti kita lakukan: Input – Process – Output. Jadi pada dasarnya setelah kita mengembangkan aplikasi, kita akan melakukan test dengan cara memasukan data-data yang dibutuhkan, lalu melakukan test terhadap fungsi yang kita buat, dan mencocokan hasil output-nya apakah sesuai ekspektasi kita atau tidak.

Pada TDD pun kita melakukan hal tersebut. Bedanya kita melakukannya dengan menggunakan baris program. Tahapan-nya pun dibagi menjadi tiga bagian: Red – Green – Refactor. Untuk mempermudah penjelasannya, kita akan membuat sebuah program penambahan sederhana untuk menjelaskan tahapan-tahapan TDD.

Buatlah 2 buat project dengan nama TDD, dan TDD.Test. Pada project TDD.Test kita akan merefrensikan project TDD dan jangan lupa untuk menambahkan Micorsoft.VisualStudio.QualityTools.UnitTestFramework (dll ini adalah dll Test default Micorsoft. Anda bisa mengganti-nya dengan xunit, nunit, dsb).

Red

Pada tahapan ini kita akan mendefinisikan data yang dibutuhkan. Dalam kasus membuat program penjumlahan saya akan membuat sebuah kelas yang memiliki input 2 buah nilai (bilangan 1, bilangan 2) misalnya 1 dan 2. Ekspektasi hasil dari proses-nya adalah menghasilkan nilai 3. Tentu saja karena proses untuk pemrograman ini belum ada, maka ketika kita menjalankan test-nya, akan didapati hasil merah (failed).


    [TestClass]
    public class CalculatorTest
    {
        [TestMethod]
        public void CalculatorTest_Add()
        {
            var bil1 = 1;
            var bil2 = 2;
            var result = Calculator.Add(bil1, bil2);
            Assert.AreEqual(3, result);
        }
    }

File TDD.Test.CalculatorTest.cs


    public static class Calculator
    {
        public static int Add(int bil1, int bill2)
        {
            throw new NotImplementedException();
        }
    }

File TDD.Calculator.cs
Ketika kita mencoba melakukan run pada test tersebut hasilnya adalah:

Ketika kita mendefinisikan bagaimana sebuah kelas akan di test, kita juga mendefinisikan bagaimana program itu akan dibuat. Pada kasus diatas misalnya saya tidak ingin membuat instance kelas Calculator, sehingga saya membuat kelas tersebut static.

Green

Pada tahapan selanjutnya kita mulai mendefinsikan bagaimana proses yang akan kita buat. Pada tahapan ini tentu saja kita akan menjumlahkan bil 1 + bil 2 untuk menghasilkan output yang kita ingini.


    public static class Calculator
    {
        public static int Add(int bil1, int bill2)
        {
            return bil1 + bill2;
        }
    }

Sekali lagi kita akan mencoba menjalankan test yang kita miliki. Hasilnya adalah sebagai berikut:

Asumsi pada tahapan ini adalah kita membuat se-simple mungkin program yang kita miliki agar lolos dengan test yang sudah kita definisikan. Sampai pada tahap ini kita sudah memiliki sebuah baris program yang Testable.

Refactor

Misalnya pada tahap ini kita memiliki ide baru untuk menambahkan kelas lain seperti pengurangan, pengalian, pembagian, dsb. Maka kita bisa melakukan perubahan drastis. Tapi sebelumnya kita tentu menambahkan baris test terlebih dahulu.


    public static class Calculator
    {
        public static int Add(int bil1, int bill2)
        {
            return new Add().Calculation(bil1, bill2);
        }

        public static int Subtraction(int bil1, int bil2)
        {
            return new Subtraction().Calculation(bil1, bil2);
        }

        public static int Multiply(int bil1, int bil2)
        {
            return new Multiply().Calculation(bil1, bil2);
        }
    }

    public class Add : ICalculation
    {
        public int Calculation(int bil1, int bil2)
        {
            return bil1 + bil2;
        }
    }

    public  class Subtraction : ICalculation
    {
        public int Calculation(int bil1, int bil2)
        {
            return bil1 - bil2;
        }
    }

    public class Multiply : ICalculation
    {
        public int Calculation(int bil1, int bil2)
        {
            return bil1*bil2;
        }
    }

    public interface ICalculation
    {
        int Calculation(int bil1, int bil2);
    }

Summary

Menurut saya mempelajari dan menajamkan mindset TDD sangat diperlukan bagi seorang Developer. Pengalaman saya ketika saya mempelajari metodologi ini, produktivitas saya menurun karena mau tidak mau saya harus mempelajari bagaimana baris program saya akan di test, mempelajari environment yang akan saya gunakan, dll. Akan tetapi di kemudian hari semua-nya menjadi lebih mudah khusus-nya jika terdapat bug yang harus diperbaiki ataupun melakukan tugas refactor karena saya memiliki pedoman-pedoman untuk mengembangkan program.

2 Replies to “Pengenalan Test Driven Development”

    1. Hi! Maaf baru balas. Ketika berusaha beradaptasi, hasil survey-nya mengejutkan. Waktu Anda untuk menyelesaikan baris program akan naik 30%. Akan tetapi ketika Anda sudah terbiasa, akan membantu Anda karena semakin Anda terikat dengan test. Anda bisa saja tidak perlu melakukan test manual. 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *