Pengembangan berbasis pengujian (TDD)

Pengantar Pengujian di Java

Maria Milusheva

Senior Software Engineer

Test-Driven Development

Sejauh ini kita hanya menulis tes setelah kode produksi.

  • Test-Driven Development (TDD) adalah teknik desain di mana tes memandu desain
  • TDD dilakukan dengan menulis tes sebelum menulis kode produksi

  • Mengapa TDD?

Pengantar Pengujian di Java

Manfaat TDD

  • Pengembangan dengan TDD lebih memenuhi kebutuhan proyek
  • Verifikasi instan - setiap kode yang ditulis sudah memiliki tes
  • Kode berbasis tes cenderung lebih rapi dan terstruktur
Pengantar Pengujian di Java

Hukum TDD

1. Harus menulis tes yang gagal sebelum menulis kode produksi

2. Harus menulis tes sesingkat mungkin

3. Jangan menulis kode produksi lebih dari yang diperlukan agar tes lulus

Menerapkan ini berurutan = satu siklus TDD

Pengembangan berlangsung melalui siklus TDD berulang

1 https://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html
Pengantar Pengujian di Java

Menguji palindrom

  • Misalkan kita ingin menulis metode yang memeriksa apakah sebuah integer adalah palindrom

  • Contoh integer palindrom: 12321, 0, 3333

Pengantar Pengujian di Java

Tulis tes yang gagal sebelum menulis kode apa pun

@Test
public void isPalindrome_nonPalindromicInt_returnsFalse() {
    int number = 1234;

    assertFalse(isPalindrome(number)); // isPalindrome() is not yet written
}

Tes adalah catatan untuk diri kita di masa depan tentang kebutuhan proyek.

Pengantar Pengujian di Java

Tulis kode minimal agar tes lulus

public boolean isPalindrome(int num) {
    return false; // Write minimal code that fulfills the requirements of the test.
}

Tes kini lulus. Lanjut ke siklus TDD berikutnya.

Pengantar Pengujian di Java

Tulis tes lain

Tes baru - kebutuhan fitur baru:

@Test
public void isPalindrome_PalindromicInt_ReturnsTrue() {
    int number = 1234321; // Now write a more complex test case.

    assertTrue(isPalindrome(number)); // At this point isPalindrome() will fail.
}
Pengantar Pengujian di Java

Implementasikan metodenya

public boolean isPalindrome(int num) {
    int inverted = 0;
    while (num != 0) {
        // At every iteration take the last digit of the number using % 10
        // and add it to inverted * 10.
        inverted = inverted * 10 + num % 10;
        // Now that we have processed the last digit, discard it using / 10.
        num = num / 10;
    }
    return inverted;
}
Pengantar Pengujian di Java

Perbaikan bug dengan TDD

TDD sangat membantu memperbaiki bug!

Metode yang baru ditulis mengembalikan true untuk number = -121. Ini tidak benar!

Kita menulis unit test untuk menunjukkan bug:

@Test
public void isPalindrome_NegativeNumber_ReturnsFalse() {
    int number = -121; // Not a palindrome as -121 is not the same as 121-.

    assertFalse(isPalindrome(number));
}
Pengantar Pengujian di Java

Perbaikan bug dengan TDD

public boolean isPalindrome(int num) {
    if (num < 0) { 
        return false; // We add a clause to return false for negative values.
    }
    int inverted = 0;
    while (num != 0) {
        inverted = inverted * 10 + num % 10;
        num = num / 10;
    }
    return inverted;
}
Pengantar Pengujian di Java

Ayo berlatih!

Pengantar Pengujian di Java

Preparing Video For Download...