Vývoj řízený testy

Úvod do testování v Javě

Maria Milusheva

Senior Software Engineer

Vývoj řízený testy (TDD)

Dosud jsme psali testy až po napsání produkčního kódu.

  • Vývoj řízený testy (TDD) je technika návrhu, kde testy řídí design
  • TDD spočívá v psaní testů před jakýmkoli produkčním kódem

  • Proč používat TDD?

Úvod do testování v Javě

Výhody TDD

  • Vývoj s TDD vede k lepšímu plnění požadavků projektu
  • Okamžité ověření – každý napsaný kód již má testy
  • Kódování na základě testů vede k čistšímu a lépe strukturovanému kódu
Úvod do testování v Javě

Zákony TDD

1. Před napsáním jakéhokoli produkčního kódu musíte napsat neúspěšný test

2. Musíte napsat co nejkratší test

3. Nesmíte napsat více produkčního kódu, než je nutné k splnění testu

Aplikování v pořadí = jeden cyklus TDD

Vývoj probíhá opakovanými cykly TDD

1 https://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html
Úvod do testování v Javě

Testování palindromů

  • Předpokládejme, že chceme napsat metodu, která zjistí, zda je celé číslo palindromem

  • Příklady palindromních celých čísel: 12321, 0, 3333

Úvod do testování v Javě

Nejprve napište neúspěšný test

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

    assertFalse(isPalindrome(number)); // isPalindrome() ještě není napsána
}

Test je jako poznámka pro naše budoucí já, která nám připomíná požadavky projektu.

Úvod do testování v Javě

Napište minimální kód pro splnění testu

public boolean isPalindrome(int num) {
    return false; // Napište minimální kód splňující požadavky testu.
}

Test nyní prochází. Můžeme přejít k dalšímu cyklu TDD.

Úvod do testování v Javě

Napište další test

Nový test – nový požadavek na funkci:

@Test
public void isPalindrome_PalindromicInt_ReturnsTrue() {
    int number = 1234321; // Nyní napište složitější testovací případ.

    assertTrue(isPalindrome(number)); // V tomto bodě isPalindrome() selže.
}
Úvod do testování v Javě

Implementace metody

public boolean isPalindrome(int num) {
    int inverted = 0;
    while (num != 0) {
        // V každé iteraci vezměte poslední číslici pomocí % 10
        // a přidejte ji k inverted * 10.
        inverted = inverted * 10 + num % 10;
        // Po zpracování poslední číslice ji odstraňte pomocí / 10.
        num = num / 10;
    }
    return inverted;
}
Úvod do testování v Javě

Oprava chyb pomocí TDD

TDD se skvěle hodí pro opravy chyb!

Metoda, kterou jsme napsali, vrací true pro number = -121. To není správně!

Napíšeme unit test pro popis chyby:

@Test
public void isPalindrome_NegativeNumber_ReturnsFalse() {
    int number = -121; // Není palindrom, protože -121 není totéž jako 121-.

    assertFalse(isPalindrome(number));
}
Úvod do testování v Javě

Oprava chyb pomocí TDD

public boolean isPalindrome(int num) {
    if (num < 0) { 
        return false; // Přidáme podmínku pro vrácení false u záporných hodnot.
    }
    int inverted = 0;
    while (num != 0) {
        inverted = inverted * 10 + num % 10;
        num = num / 10;
    }
    return inverted;
}
Úvod do testování v Javě

Pojďme si procvičit!

Úvod do testování v Javě

Preparing Video For Download...