Testgedreven ontwikkeling

Introductie tot testen in Java

Maria Milusheva

Senior Software Engineer

Test-Driven Development

Tot nu toe schreven we tests pas na de productcode.

  • Test-Driven Development (TDD) is een ontwerptechniek waarbij tests het ontwerp sturen
  • Bij TDD schrijf je tests vóór enige productcode

  • Waarom TDD doen?

Introductie tot testen in Java

Voordelen van TDD

  • Ontwikkelen met TDD helpt de projecteisen beter te halen
  • Directe verificatie: alle code heeft al tests
  • Coderen op basis van tests leidt tot schonere, beter gestructureerde code
Introductie tot testen in Java

De wetten van TDD

1. Schrijf een falende test vóór je productcode

2. Schrijf de kortst mogelijke test

3. Schrijf niet meer productcode dan nodig is om de test te laten slagen

Deze op volgorde toepassen = één TDD-cyclus

Ontwikkeling gebeurt via herhaalde TDD-cycli

1 https://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html
Introductie tot testen in Java

Testen op palindromen

  • Stel: we willen een methode schrijven die checkt of een geheel getal een palindroom is

  • Voorbeelden van palindromische getallen: 12321, 0, 3333

Introductie tot testen in Java

Schrijf eerst een falende test vóór je code

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

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

Een test is als een notitie aan je toekomstige zelf die herinnert aan de eisen.

Introductie tot testen in Java

Schrijf minimale code zodat de test slaagt

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

Test slaagt nu. We kunnen door naar de volgende TDD-cyclus.

Introductie tot testen in Java

Schrijf nog een test

Nieuwe test - nieuwe eis voor de feature:

@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.
}
Introductie tot testen in Java

Implementeer de methode

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;
}
Introductie tot testen in Java

Bugfixen met TDD

TDD is top voor bugfixes!

De methode die we net schreven geeft true voor number = -121. Dat klopt niet!

We schrijven een unittest om de bug te laten zien:

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

    assertFalse(isPalindrome(number));
}
Introductie tot testen in Java

Bugfixen met 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;
}
Introductie tot testen in Java

Laten we oefenen!

Introductie tot testen in Java

Preparing Video For Download...