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

Jak pisać testy jednostkowe ? - podejście TDD

Object Storage Arubacloud
0 głosów
845 wizyt
pytanie zadane 12 lipca 2018 w Java przez BuxBleed Użytkownik (810 p.)
Heej, od 2 tygodni pracuje jako stażysta w pewnej firmie. Mamy za zadanie stworzyć REST API w oparciu o frameworka Javy - Spring Boota.

Moi przełożeni wymagają pisania testów jednostkowych które będą weryfikować każdy z user stories czyli możliwy scenariusz wykonania metody. Preferują podejście TDD, programowania sterowanego testami czyli żeby najpierw pisać test a potem implementacje funkcjonalności co jest dla mnie niepojęte... Frameworki jakich używamy do testów to JUnit oraz Mockito - tego 2 nie ogarniam...

 

Jak w ogóle się do tego zabrać ? Pisanie prostych assercji jeszcze rozumiem, ale podejście TDD albo tworzenie makiet ( mocków ) klas i ich testowanie jest już dla mnie niepojęte....

2 odpowiedzi

+3 głosów
odpowiedź 12 lipca 2018 przez CenterPL Pasjonat (19,070 p.)
wybrane 12 lipca 2018 przez BuxBleed
 
Najlepsza
TDD jest bardzo fajną metodą i wierz mi, Twoje problemy wynikają tylko z powodu Twojej nie znajomości testowania jednostkowego i bycia dość początkującym. Masz super pracodawców jeśli wymagają pisania testów i pracy w TDD.

Do rzeczy jednak.

Flow TDD pewnie znasz - czerwone, zielone, refactor.

W fazie czerwonej tworzysz klasę testową - GameServiceTest i piszesz jakiś test np. testItShouldReturnPlayer. Puszczasz test, czerwono, bo klasa nie istnieje, metoda nie istnieje. Tworzysz je więc a w metodzie piszesz tyle ile jest niezbędne żeby test przeszedł, może to być zwrócenie nowego obiektu Player, którego jeszcze np nie masz, więc go tworzysz. Puszczasz test, zielone. Teraz robisz refaktoring, czyli sprawiasz, by metoda miała niezbędną logikę, puszczasz test i ma być znów zielono. I tak w kółko.

Co do Mocków, chodzi o to, że jeśli klasa, którą testujesz ma zależności, to aby te zależności mockować, tj robić ich makiety. Jeśli klasa zależy od jakichś prostych DTO, struktur, które nie mają logiki, nie musisz ich mockować. W innym wypadku, tworzysz mocka i to jego przekazujesz jako zależność.
komentarz 12 lipca 2018 przez BuxBleed Użytkownik (810 p.)

Problematyczne jest to, że nie wiem jak sama funkcjonalność ma działać bo przecież nie jest jeszcze nawet zaimplementowana i nie ma czego testować...

 

Co do Mocków to jeśli mam w miarę prostą klasę to mogę po prostu zrobić test na zwykłych asercjach ? Czy w takim wypadku mimo wszystko trzeba by skorzystać z Mockito ?


@RunWith(MockitoJUnitRunner.class)
public class TestClass{

    
    @InjectMocks
    public ClassToBeTested testedObj;

    @Test
    public void verifySth(){
    //logika testu
    //wywolanie jakis metod na obiekcie testedObj
    }
 
}

 

1
komentarz 12 lipca 2018 przez CenterPL Pasjonat (19,070 p.)

Nie masz zaimplementowanej logiki, ale przecież wiesz, co powinieneś otrzymać. 

Przykład:

Masz taska, żeby stworzyć serwis autoryzujący klienta. Wiesz, że w systemie istnieje już klasa generująca token. 

Tworzysz test:

AuthServiceTest, a w nim metodę testową:

testItShouldAuthorizeClientByToken - mockujesz sobie klasę generatora tokenu eg. TokenGenerator i ustawiasz mu aby metoda TokenGeneratorGenerate zwracała ciąg znaków typu ab28c$3r3ewnrb i zapodajesz ten Mock jako depedency do klasy AuthService. Teraz możesz zrobić asercję z tym tokenem. Nie bardzo piszę w Javie, więc pozwolę sobie zapodać przykład w PHPUnit, który jest bardzo podobny. 

//AuthServiceTest.php

class AuthServiceTest extends TestCase
{
	private $token = 'afuhf2wibiuvfdosuhvbiu43';

	public function itShouldReturnNewUserToken()
	{
		// tworzymy mock, bo klasa zwraca randomowy token, co jest trudne to testowania
		$tokenGeneratorMock = $this->createMock(TokenGenerator::class);
		$tokenGeneratorMock->expects($this->once())
				->method('generateToken')
				->willReturn($this->token);
		
		$user = new User(); // nie tworzymy mocka, bo to DTO, nie ma logiki
		
		$authServiceUnderTest = new AuthService($tokenGeneratorMock);

		$actual = $authServiceUnderTest->authorize($user);

		$this->assetSame($this->token, $actual);
	}
}

//AuthService.php

class AuthService
{
	private $tokenGenerator;

	public function __construct(TokenGeneratorInterface $tokenGenerator)
	{
		$this->tokenGenerator = $tokenGenerator;
	}

	public function authorize(UserInterface $user)
	{
		//logika autoryzacji, coś tam robimy z userem
		// ...

		$token = $this->tokenGenerator->generateToken();
		return $token;
	}
}

 

komentarz 12 lipca 2018 przez BuxBleed Użytkownik (810 p.)
W sumie nie pisze w PHP i go nie znam ale zrozumiałem o co chodzi w tym kodzie :D

Trochę mi to rozjaśniło w głowie, ale nadal tam panuje ciemność... Może znasz jakieś fajne źródło najlepiej w języku POLSKIM gdzie mógłbym zagłębić się w sam framework Mockito ? Oglądałem masę tutoriali po angielsku i jakoś żaden nie mógł do mnie dotrzeć
1
komentarz 12 lipca 2018 przez CenterPL Pasjonat (19,070 p.)
Dobrze napisany kod jest do zrozumienia nawet dla laika, bez względu na język w jakim programuje, także jeśli rozumiesz mój kod, znaczy, że jest dobrze napisany :)

Wyciorny poniżej podał dokumentację Mockito, ona jest bardzo przystępna. Niestety nie znam nic polskiego, bo sam korzystam jedynie z anglojęzycznych źródeł, polskie zazwyczaj są dość kiepskie.

Osobiście myślę, że to kwestia praktyki, dasz radę, zakumasz kiedy używać Mocków, stubów, spy'ów etc. Po prostu ćwicz i nie staraj się od razu wszystkiego na siłę rozumieć, czasem na chwilę warto zaakceptować fakt, a z czasem rozumieć dlaczego.
0 głosów
odpowiedź 12 lipca 2018 przez Wiciorny Ekspert (269,710 p.)
brzmi to jak Staż w Allerion w Krakowie hehe Nie ma lepiej opisanej bilbioteki do testów niż nasza Mockito ;] wiec spokojnie

http://static.javadoc.io/org.mockito/mockito-core/2.19.0/org/mockito/Mockito.html

Podobne pytania

0 głosów
0 odpowiedzi 175 wizyt
pytanie zadane 23 grudnia 2018 w Java przez Potopiec Obywatel (1,550 p.)
0 głosów
2 odpowiedzi 3,098 wizyt
pytanie zadane 28 października 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)
0 głosów
0 odpowiedzi 254 wizyt
pytanie zadane 22 sierpnia 2021 w Java przez Bartek030 Obywatel (1,460 p.)

92,555 zapytań

141,402 odpowiedzi

319,537 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...