Programowanie sterowane testami

Wprowadzenie do testowania w Javie

Maria Milusheva

Senior Software Engineer

Test-Driven Development

Do tej pory pisaliśmy testy dopiero po napisaniu kodu produkcyjnego.

  • Test-Driven Development (TDD) to technika projektowania, w której testy kierują projektem
  • TDD polega na pisaniu testów przed kodem produkcyjnym

  • Po co stosować TDD?

Wprowadzenie do testowania w Javie

Zalety TDD

  • TDD pomaga lepiej spełniać wymagania projektu
  • Natychmiastowa weryfikacja – każdy napisany kod ma już testy
  • Kodowanie na podstawie testów prowadzi do czystszego, lepiej zorganizowanego kodu
Wprowadzenie do testowania w Javie

Prawa TDD

1. Należy napisać nieudany test przed napisaniem jakiegokolwiek kodu produkcyjnego

2. Należy napisać możliwie najkrótszy test

3. Nie należy pisać więcej kodu produkcyjnego niż wymaga przejście testu

Stosowanie ich kolejno = jeden cykl TDD

Rozwój odbywa się przez powtarzające się cykle TDD

1 https://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html
Wprowadzenie do testowania w Javie

Testowanie palindromów

  • Załóżmy, że chcemy napisać metodę sprawdzającą, czy liczba całkowita jest palindromem

  • Przykłady palindromicznych liczb całkowitych: 12321, 0, 3333

Wprowadzenie do testowania w Javie

Napisz nieudany test przed napisaniem kodu

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

    assertFalse(isPalindrome(number)); // isPalindrome() nie jest jeszcze napisane
}

Test to notatka dla nas samych przypominająca o wymaganiach projektu.

Wprowadzenie do testowania w Javie

Napisz minimalny kod, aby test przeszedł

public boolean isPalindrome(int num) {
    return false; // Napisz minimalny kod spełniający wymagania testu.
}

Test przechodzi. Możemy przejść do następnego cyklu TDD.

Wprowadzenie do testowania w Javie

Napisz kolejny test

Nowy test – nowe wymaganie dla funkcji:

@Test
public void isPalindrome_PalindromicInt_ReturnsTrue() {
    int number = 1234321; // Napisz bardziej złożony przypadek testowy.

    assertTrue(isPalindrome(number)); // W tym momencie isPalindrome() nie przejdzie.
}
Wprowadzenie do testowania w Javie

Zaimplementuj metodę

public boolean isPalindrome(int num) {
    int inverted = 0;
    while (num != 0) {
        // W każdej iteracji pobierz ostatnią cyfrę liczby za pomocą % 10
        // i dodaj do inverted * 10.
        inverted = inverted * 10 + num % 10;
        // Po przetworzeniu ostatniej cyfry odrzuć ją za pomocą / 10.
        num = num / 10;
    }
    return inverted;
}
Wprowadzenie do testowania w Javie

Naprawianie błędów z TDD

TDD świetnie nadaje się do naprawiania błędów!

Napisana metoda zwraca true dla number = -121. To jest błąd!

Piszemy test jednostkowy ilustrujący błąd:

@Test
public void isPalindrome_NegativeNumber_ReturnsFalse() {
    int number = -121; // Nie jest palindromem, bo -121 to nie to samo co 121-.

    assertFalse(isPalindrome(number));
}
Wprowadzenie do testowania w Javie

Naprawianie błędów z TDD

public boolean isPalindrome(int num) {
    if (num < 0) { 
        return false; // Dodajemy klauzulę zwracającą false dla wartości ujemnych.
    }
    int inverted = 0;
    while (num != 0) {
        inverted = inverted * 10 + num % 10;
        num = num / 10;
    }
    return inverted;
}
Wprowadzenie do testowania w Javie

Czas na ćwiczenia!

Wprowadzenie do testowania w Javie

Preparing Video For Download...