Testy jednostkowe

Na rozmowach rekrutacyjnych na testera manualnego często słyszałem pytanie o piramidę testów. O ile wymienienie poszczególnych poziomów testów nie stanowi dla większości kandydatów większego problemu to dokładne wyjaśnienie poszczególnych poziomów nie jest już takie trywialne. W tym wpisie postaram się przybliżyć testy jednostkowe.

.

Aplikacja

Testy będziemy przeprowadzać na kalkulatorze. Musimy sprawdzić czy kalkulator prawidłowo wykonuje jedną z podstawowych operacji matematycznych, a mianowicie dzielenie. Oczywiście moglibyśmy to zrobić fizycznie klikając na przyciski i weryfikując czy wynik na ekranie jest poprawny. Naszym celem jest jednak dodanie testu jednostkowego, który będzie testował mały wycinek kodu.

Testowana metoda

Nasza metoda posiada dwa parametry liczbowe. Wewnątrz metody dzielimy podane liczby korzystając z operatora matematycznego „/” i zwracamy wartość dzielenia z naszej metody.

public class Calculator {

    public int div (int firstNumber, int secondNumber) {
        return  firstNumber/secondNumber;
    }
// inne metody
}

Pierwszy test

W naszych testach będziemy sprawdzali czy metoda div() działa poprawnie. Spróbujemy kilkukrotnie ją wywołać dla różnych wartości liczbowych i zobaczymy czy metoda zachowa się tak jak tego oczekujemy. Nasz test weryfikuje tylko działanie drobnego fragmentu kodu, który później będzie stanowił część większego programu i będzie wywoływany po tym jak użytkownik wybierze operację dzielenia i poda dwie wartości liczbowe. Pierwszy test sprawdza jaki wynik zwróci metoda div() gdy przekażemy jej wartości 10 i 5. Oczekiwany rezultat w tym przypadku to 2, ponieważ 10 : 5 = 2. W Javie taki test możemy zapisać następująco:

@Test
public void divTest() {
    Calculator calculator = new Calculator();
    Assert.assertEquals(calculator.div(10,5),2);
}

Pierwsza linijka wewnątrz metody to stworzenie klasy kalkulatora w której znajduje się metoda, którą chcemy testować. Druga linika to sprawdzenie (asercja) czy wynik metody div (10,5) jest równy 2. Po uruchomieniu test kończy się sukcesem. Metoda działa dla powyższych danych testowych.

Drugi test

Kolejny test przeprowadzimy dla dzielnika, który jest liczbą zmiennoprzecinkową. Spróbujemy zweryfikować działanie metody div() dla wartości 10 i 4. Oczekiwany rezultat to 2.5. Test dla przedstawionych wartości może wyglądać następująco:

@Test
public void divTest() {
    Calculator calculator = new Calculator();
    Assert.assertEquals(calculator.div(10,4),2.5);
}

Dla powyższych danych testowych dostaniemy błąd. Nasza metoda zwróci wartość 2 co nie jest oczekiwanym rezultatem. Odkryliśmy błąd w Naszym programie i teraz możemy zastanowić się z czego on wynika. Po przeanalizowniu metody div zauważamy, że korzysta ona z typu int, który jest stałoprzecinkowy tzn. nie posiada żadnych miejsc po przecinku. Aby kalkulator zaczął obsługiwać liczby zmiennoprzecinkowe musimy zmodyfikować metodę div i zmienić typ danych na float:

public float div (float firstNumber, float secondNumber) {
    return  firstNumber/secondNumber;
}

Teraz poniższy test powinien zakończyć się sukcesem:

@Test
public void divTest() {
    Calculator calculator = new Calculator();
    Assert.assertEquals(calculator.div(10,4),2.5f);
}

Podsumowanie

W tym wpisie na prostym przykładzie przedstawiłem ideę testów jednostkowych. Udało nam się znaleźć błąd w bardzo małym fragmencie kodu, naprawić go i zweryfikować, że po zmianach wszystko działa tak jak tego oczekujemy. Warto zapamiętać ten przykład, aby w łatwy sposób wytłumaczyć czym są testy jednostkowe podczas rozmowy rekrutacyjnej.

Dodaj komentarz

avatar
  Subscribe  
Powiadom o