Testowanie aplikacji

0

Napisałem appkę server + client. Chciałem ją teraz przetestować.
Mam np. repozytorium z kolekcjami. Do którego dobijam się z servera.
Nie mam pomysłu jak je przetestować. Chciałem zrobić np. taki test
repo.wstawJakasWartosc(wartosc);
i sprawdzać czy rozmiar kolekcji się zwiększa. Ale kolekcje w repo są private, to się do nich nie dostane żeby sprawdzić rozmiar.

W sumie nawet nie wiem jak główny program przetestować.
Server.main(); nie odpala bo po drodze ma masę przeszkód które z poziomu testu nie działają bo np. nie znajduje pliku z resourcami.
Większość metod w klasie servera też jest prywatnych więc nie ma do nich dostępu w testach.

Możecie podrzucić jakieś dobre materiały do nauki testowania. Wszystkie tutoriale jakie przeglądałem są dla jednej prostej metody. A tutaj w większym programie się gubie.

1

Poczytaj o Mockowaniu. (Mockito,PowerMock albo cos jeszcze innego).

0
BartoszCoyote napisał(a):

Poczytaj o Mockowaniu. (Mockito,PowerMock albo cos jeszcze innego).

Czy taki test ma sens?

@Mock
Repository repo;
@Test
    public void wstawWartoscTest() throws Exception {
           repo.wstawWartosc(new Wartosc("jakasTamWartosc"));
           Mockito.verify(repo, Mockito.times(1)).wstawWartosc(new Wartosc("jakasTamWartosc"));
    }
0

Lepszy by miało gdyby repo zwracało coś (nawet ten sam obiekt) po wstawieniu, wtedy sprawdzasz to co dostałeś. Druga sprawa jest taka, że jeżeli twój test testuje mocka to możesz go wyrzucić, w takim wypadku może jakiś test integracyjny.

Server.main(); nie odpala bo po drodze ma masę przeszkód które z poziomu testu nie działają bo np. nie znajduje pliku z resourcami.

To napisz to lepiej, nie hardkoduj przypadkiem ścieżek.
I na koniec: Jak się nauczyć testować?

2

Czy taki test ma sens?

Nie ma sensu. Testujesz Mockito czy dobrze działa. Szczepan Faber będzie zadowolony.

Nie mam pomysłu jak je przetestować. Chciałem zrobić np. taki test
repo.wstawJakasWartosc(wartosc);
i sprawdzać czy rozmiar kolekcji się zwiększa. Ale kolekcje w repo są private, to się do nich nie dostane żeby sprawdzić rozmiar.

Bardzo dobrze, że są prywatne. Pytanie czy nie potrzebujesz przetestować zachowania, które to zachowanie można opisać w następujący sposób:

Po dodaniu obiektu do repozytorium można ten obiekt odnaleźć w repozytorium.

Czyli w takim wypadku test będzie wyglądać w następujący sposób:

@Test
public void shouldFindElementAfterAddItToRepository(){
	Wartość w = new Wartość("…");

	repo.wstawWartość(w);

       Assertions.assertThat(repo.znajdź(w)).isNotNull().isEqulaTo(w);
}

Zauważ, że test obejmuje zachowanie i nie wnika w jaki sposób zaimplementowano metody wstawWartość i znajdź. Pod spodem może być kolekcja, ale może też być tradycyjna baza danych.

W sumie nawet nie wiem jak główny program przetestować.
Server.main(); nie odpala bo po drodze ma masę przeszkód które z poziomu testu nie działają bo np. nie znajduje pliku z resourcami.

To znaczy, że jest źle napisany w tym sensie, że trudno go użyć inaczej niż w „jedyny słuszny sposób”. Pomyśl co będzie, jak będziesz chciał zmienić w jakiś implementację, albo sposób użycia. Czy ograniczenia, które spotkałeś w testach nie spowodują, późniejszych problemów gdy będziesz chciał coś zmienić w kodzie.

Większość metod w klasie servera też jest prywatnych więc nie ma do nich dostępu w testach.

To bardzo dobrze, bo publiczne powinny być tylko te metody, które będą używane przez twoich użytkowników. Pisanie testów weryfikuje czy rzeczywisty sposób użycia jest prosty i spójny czy też wymaga od klienta jakiejś ekwilibrystyki. Ogólnie można założyć, że test to przykład kodu klienckiego. Jeżeli ty nie potrafisz użyć swojego kodu, to co ma powiedzieć klient?

1 użytkowników online, w tym zalogowanych: 0, gości: 1