Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Testowanie z pomocą PhpUnit
athabus
post 26.02.2019, 15:55:20
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Dzisiaj zabrałem się za naukę PhpUnit i mam problem. O ile napisanie testów jest zazwyczaj dość proste i w sumie nie sprawia mi problemów o tyle mam problem z niektórymi testami. Problem polega na tym, że w zasadzie nie wiem jak bym mógł napisać sensowne testy.

Weźmy na przykład mój mały projekcik, który w skrócie pozwala na obrazki nakładać różne filtry (np. resize, b&W itp) i na końcu konwertować je do postaci base64. W tym projekcie mam taką klasę:
https://gitlab.com/hadwao/image-inliner/blo...der/Encoder.php, która można powiedzieć, że jest takim hubem, który korzystając z kilku dependencji przekształca wykonuje całą pracę z przekształceniem obrazka wyjściowego na wersję baser64.


Problem polega na tym, że o ile dobrze zrozumiałem zasadę, to wszystkie dependencje powinienem mockować. Jeśli w tej klasie zmockuje zależności, to w zasadzie okażę się, że nie ma czego tutaj testować, bo sama metoda to po prosu kolejne wywołania metod ze wstrzykniętych zależności. Przyznam szczerze, że trochę tutaj utknąłem i nie mam pomysłu na napisanie testów dla tej klasy.

PS znacie jakiś mały projekt z dobrze napisanymi testami? Chętnie bym popatrzył jak to się robi, ale nie mogę znaleźć niczego na tyle małego aby móc szybko się wgryźć w logikę.

Ten post edytował athabus 26.02.2019, 16:08:29
Go to the top of the page
+Quote Post
nospor
post 26.02.2019, 16:23:59
Post #2





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Zanim odpowiem to szybka uwaga:

  1. protected function validateData(array $data)
  2. {
  3. foreach (array_keys($data) as $key) {
  4. if (!in_array($key, static::EXPECTED_KEYS)) {
  5. unset($data[$key]);
  6. }
  7. }
  8.  
  9. if (count($data) != count(static::EXPECTED_KEYS)) {
  10. throw new \InvalidArgumentException();
  11. }
  12. }
  13.  

Mozesz to skrocic juz do:

  1. protected function validateData(array $data)
  2. {
  3. foreach (array_keys($data) as $key) {
  4. if (!in_array($key, static::EXPECTED_KEYS)) {
  5. throw new \InvalidArgumentException();
  6. }
  7. }
  8.  
  9. }
  10.  


Co do pytania:
- mozesz przetestowac czy twoje obiekty zostaly wywolane w okreslonej kolejnosci i zadana ilosc razy. Generalnie nie lubie takiej metody ale tutaj faktycznie malo jest do testowania
- mozesz tez sprawdzic czy zwrocony obiekt zawiera te dane:
  1. $inlineImageData = [
  2. 'data_url' => (string)$image->encode('data-url'),
  3. 'profile' => $this->profile->getName(),
  4. 'height' => $image->height(),
  5. 'width' => $image->width(),
  6. 'path' => $imagePath,
  7. 'orig_width' => $origWidth,
  8. 'orig_height' => $oriHeight
  9. ];

Przegladajac kod widze ze moglbys to sprawdzic

Troche problematyczny jest ten kawalek
  1. foreach ($this->profile->getFilters() as $profileFilter) {
  2. $imageFilter = $this->filterFactory->create($profileFilter->class());
  3. $imageFilter->execute($image, $profileFilter->config());
  4. }

Gdzie zamiast przekazac obiekty filtrow ty przekazujesz ich nazwy i twoja klasa wewnatrz siebie tworzy je samodzielnie

ps: zainteresuj sie php-cs-fixer. Przegladajac twoj kod mam wrazenie ze pisza go przynajmniej dwie rozne osoby - strasznie rozny styl formatowania, czesto daleki od PSR. Az dziw bierze ze jedna osoba moze tak roznie pisac... rozdwojenie jazni? wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
athabus
post 26.02.2019, 16:46:53
Post #3





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Dzięki za rady, jutro do tego usiądę i spróbuję zastosować w praktyce.

Cytat
ps: zainteresuj sie php-cs-fixer. Przegladajac twoj kod mam wrazenie ze pisza go przynajmniej dwie rozne osoby - strasznie rozny styl formatowania, czesto daleki od PSR. Az dziw bierze ze jedna osoba moze tak roznie pisac... rozdwojenie jazni? wink.gif


Do niedawna byłem zupełnym hobbystą - dopiero jak zacząłem myśleć o szukaniu pierwszej pracy w IT(pół roku temu) spotkałem się z kolegą z forum aby rzucił okiem na mój kod i uświadomił mnie o istnieniu PSR, clean code i kilku innych "pierdołach" wink.gif To rozdwojenie jaźni to "szukanie drogi" + brak wyrobionych nawyków + naturalna skłonność do robienia chaosu . Teraz już jest trochę lepiej bo pracuję nad tym tematem no i używam już cs-fixera ;-)
Go to the top of the page
+Quote Post
nospor
post 26.02.2019, 16:49:39
Post #4





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Cytat
no i używam już cs-fixera
A po kodzie tego nie widac. Fixer powinien poprawic to i owo w nim. Jestes pewien ze uzywasz czy moze masz tylko w requite-dev ? wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
athabus
post 26.02.2019, 16:55:32
Post #5





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


W sensie teraz już używam od jakichś 2-3 tygodni ;-)
Libka powstawała jakoś w grudniu i wtedy jeszcze nie używałem.
Go to the top of the page
+Quote Post
Pilsener
post 1.03.2019, 20:53:10
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Cytat
to w zasadzie okażę się, że nie ma czego tutaj testować


Dlatego w wielu projektach nie wymaga się otestowania na poziomie 100%, testy jednostkowe są szczególnie przydatne jeśli mamy jakąś współdzieloną bibliotekę, która ma sporo logiki, stabilny interfejs i tak dalej - w przypadku jednak często zmieniających się kontrolerów aplikacji webowej, z których 90% tylko przekazuje dane z repozytoriów do templatek testy jednostkowe słabo się sprawdzają.

Trzeba też pamiętać, że testy jednostkowe mają nie tylko testować kod, ale wymuszać dobre praktyki (TDD/TBD), wykrywać fragmenty martwego kodu i w końcu (moim zdaniem największa zaleta) gwarantować, że zmiany w kodzie będą dokonywane w sposób świadomy i zorganizowany a nie tylko proteza, workaround, wklejka tysiąca linii by użyć jednej metody itp.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 21:58