• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Testy, kiedy i jak.

+2 głosów
131 wizyt
pytanie zadane 11 października w Java przez pomaraqcz Początkujący (360 p.)
Witam,

mam pytanie odnośnie testów. Na razie jedyne "doświadczenie" jakie mam to proste testy jednostkowe typy sprawdzić czy klasa add() dobrze dodaje do siebie 2 inty. Za to nie mam pojęcia jak to przełożyć na trochę większy projekt. Jak np testować czy baza in memory (korzystam z H2) się tworzy? Czy w ogolę jest to zadanie do testowania?

Albo inny przykład, program sql wyciaga z bazy dane, jak to mozna by było przetestować, bo niestety nie mam pojęcia...

1 odpowiedź

+1 głos
odpowiedź 11 października przez mbabane Maniak (55,220 p.)

Test jednostkowy polega na tym, że sprawdzasz, odizolowaną od reszty zależności, daną klasę czy metodę. Chodzi o to że testujesz czy dana klasa robi to do czego została stworzona. Jeśli klasa posiada jakiś dodatkowy element (tzn. jest od czegoś zależna) czyli np. pobiera dane z bazy, to do testu jednostkowego, trzeba zrobić testową bazę, która ma przygotowane jakieś dane i na tych testowych danych robić test. Innym wyjściem jest zrobienie tzw. mocka czyli coś co powoduje, że dana zależność np. baza danych jest ukrywana i zastępowana przez sztuczny obiekt, którym zarządza programista. Do tego przydaje się np. framework Mockito, który ułatwia zastępowanie zależności sztucznymi obiektami. Jeśli klasa nie ma żadnych zależności to jest to sytuacja piękna i klarowna, testy piszę się dokładnie tak prosto jak do Twojego kalkulatora. Jednak duży projekt może nie mieć takich klas i trzeba zaprzęgać właśnie np. mockito. W mockowaniu przede wszystkim chodzi o to, że zapewniasz że obiekt który jest zależnością na pewno działa na 100% i zwraca poprawne dane (poprawne w kontekście danego testu), ponieważ sprawdzasz tylko jedną klasę/funkcjonalność i nie obchodzi cię działanie innej części systemu. W teście jednostkowym trzeba tak ustawiać zależności aby generowały odpowiednie do testu dane, czyli w zależności od tego pod jakim kątem sprawdzasz daną funkcjonalność. Bo możesz sprawdzić coś w sytuacji kiedy wszystko poszło dobrze lub testować czy funkcjonalność zachowuje się odpowiednio kiedy coś poszło nie tak. Na przykład funkcjonalność kupowania - produkt można kupić kiedy jest w magazynie, ale co się stanie kiedy go nie będzie na magazynie? Trzeba zrobić dwa testy. Jeden, który zakłada że towar jest i kupno jest możliwe, Drugi, kiedy towaru nie ma na stanie i sprawdza się czy zostanie np. zgłoszony jakiś komunikat o błędzie:

Mając np. taki kod projektu:

class Product
{

}

interface ProductDao
{
    Product getProductById(Long id);

}

public class BuyingService
{
    ProductDao productDao; //zależność, kalsa BuyingService zależy od obiektu productDao.

    public BuyingService(ProductDao productDao)
    {
        this.productDao = productDao;
    }
    
    public boolean buy(Long idProduct)
    {
        Product product = productDao.getProductById(idProduct);
        if (product != null)
            return true;

        return false;
    }
}

Test może wyglądać np. tak (wykorzystany jest mockito i JUnit):

public class BuyingServiceTest
{
    @Test
    public void whenProductIsInWarehouseThenBuyingIsPossible()
    {
        ProductDao productDaoMock = mock(ProductDao.class); //sztuczny obiekt bazy danych

        Product productMock = new Product();
        when( productDaoMock.getProductById( anyLong() ) )
                .thenReturn(productMock); //ustawiamy ze sztuczny obiekt ma zwracac jakiś produkt

        BuyingService buyingService = new BuyingService(productDaoMock); //przekazujemy sztuczny obiekt do serwisu aby zrobic test jednostkowy

        boolean actual = buyingService.buy(1L); //uruchamiamy metodę serwisu

        assertTrue(actual); //sprawdzamy czy zwrociła to co oczekujemy
    }

    @Test
    public void whenProductIsNotInWarehouseThenBuyingIsImpossible()
    {
        ProductDao productDaoMock = mock(ProductDao.class); //sztuczny obiekt bazy danych

        when( productDaoMock.getProductById( anyLong() ) )
                .thenReturn(null); //ustawiamy ze sztuczny obiekt ma zwracac null tak jakby nie było go w bazie
        BuyingService buyingService = new BuyingService(productDaoMock); //przekazujemy sztuczny obiekt do serwisu aby zrobic test jednostkowy

        boolean actual = buyingService.buy(1L); //uruchamiamy metodę serwisu

        assertFalse(actual); //sprawdzamy czy zwrociła to co oczekujemy
    }
}

Najlepszym sposobem na zrozumienie testów jest ich pisanie - poczytaj na początek jak korzystać z JUnit i mockito.

Podobne pytania

0 głosów
2 odpowiedzi 130 wizyt
pytanie zadane 12 lipca w Java przez BuxBleed Użytkownik (790 p.)
0 głosów
2 odpowiedzi 79 wizyt
pytanie zadane 13 czerwca w Java przez uczen3354534 Nowicjusz (180 p.)
0 głosów
0 odpowiedzi 99 wizyt
pytanie zadane 4 grudnia 2017 w Java przez wojtek2002 Nowicjusz (140 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

56,493 zapytań

101,200 odpowiedzi

208,598 komentarzy

28,160 pasjonatów

Przeglądających: 235
Pasjonatów: 12 Gości: 223

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...