Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHPUnit + REST API
Forum PHP.pl > Forum > PHP
sf
Zaczynam przygodę z testami i mam kilka wątpliwości czy wszystko robię prawidłowo.

1) Pierwszy problem to pobranie jakiegoś artykułu po jego identyfikatorze. Nie wiem pod jakimi ID znajdują się artykuły dlatego wymyśliłem sobie tak, że moje API wylosuje artykuł jeśli jako ID wpiszemy wartość "-1". Czy taki myk jest dopuszczalny? W innym przypadku wydaje mi się, że musiałbym stworzyć obiekt modelu i wywołać metodę pobierz losowy artykuł. Czy też inne rozwiązanie to utworzenie obiektu modelu i wywołanie metody pobierz artykuły z limitem 1, a potem uruchomienie API z wyciągniętym ID.

(tak wiem, że tutaj powinno się to GET załatwić wink.gif)

  1. public function testGetArticleAction()
  2. {
  3. // request method, url, post data
  4. $result = $this->request('POST', '/apiArticle/get-article', array('slim.input' => 'id=-1'));
  5. ...
  6. }


2) Czy w testach tworzy się warunki - jeśli pierwszy assert się nie wykona to nie wykonuj następnych bo na pewno nie będą działać? Oto przykład:

  1. public function testGetArticleAction()
  2. {
  3. // request method, url, post data
  4. $result = $this->request('POST', '/apiArticle/get-article', array('slim.input' => 'id=-1'));
  5.  
  6. $this->assertEquals('200', $this->app->response->status());
  7. // tutaj kilka assert związanych z $result
  8. }


Jeśli wystąpi 500 bo np. aplikacja się wysypie i wszystkie pozostałe assert będą negatywne. Ewentualnie podpytanie co w przypadku gdy zwróci 500 i brak danych do obróbki spowoduje wysypanie się aplikacji, fatal error czy też wyjątek. Czy należy testy przed tym zabezpieczać?

3) Czy mogę w jednej metodzie dwa razy uruchomić moje api dla różnych wartości? Np. w jednym chce przetestować zwrócenie wyniku prawidłowego, w drugim, że artykułu nie ma.

  1. public function testGetArticleAction()
  2. {
  3. // request method, url, post data
  4. $result = $this->request('POST', '/apiArticle/get-article', array('slim.input' => 'id=-1'));
  5.  
  6. $this->assertEquals('200', $this->app->response->status());
  7.  
  8. $data = json_decode($result);
  9. // tutaj jakieś testy
  10.  
  11. // drugie wywołanie
  12. $result2 = $this->request('POST', '/apiArticle/get-article', array('slim.input' => 'id=99999999999'));
  13.  
  14. $this->assertEquals('200', $this->app->response->status());
  15. $data = json_decode($result);
  16.  
  17. $this->assertEquals('article_nof_found', $data->err->code);
  18. }
Pyton_000
Zainteresuj się może Codeception, ihmo wygodniejszy FW do testowania

Co dopytań:
1. Żeby testować to wrzuć sobie obiekt do bazy (za pomocą api) a potem go pobieraj.
2. W phpUnit jest coś takiego że konkretne metody mogą mieć przekazane wyniki z poprzedniej i na tym wykonać. Jeżeli jest 500 to raczej wina samego serwera i chyba się tego nie testuje.
3. Tak, aczkolwiek rozbiłbym to na 2 metody: jedna np. test_positive_response i test_negative_response
vokiel
Musisz zmienić trochę nastawienie do testów jednostkowych, część z tego co proponujesz to testy integracyjne. Testy jednostkowe testują najmniejsze możliwe jednostki aplikacji - pojedyncze funkcje, metody.

1. Pobranie artykułu po ID.
Rozumiem, że chcesz tu testować metodę API pobierającą artykuł, tak? Nie testujesz tutaj bazy danych tylko API, zatem robisz mock'a na połączenie do bazy danych i zwracasz w nim testowe dane, następnie sprawdzasz, czy to co zwraca API jest zgodne z tymi testowymi danymi. Dzięki temu nie obsługujesz w ogóle bazy danych i testy mogą zostać uruchomione bezpośrednio z kodu bez konfiguracji całego środowiska.

2. Generalnie nie. W testach decydujesz co badasz aktualnym testem. Testowanie samego /apiArticle/get-article możesz przeprowadzić na kilkanaście sposobów pod różnym kątem.
Np. sprawdzasz co zwraca API w przypadku
  • niepoprawnych ID (poza zakresem)
  • niepoprawnego formatu danych (np string zamiast int)
  • dziwnych danych typu próby włamań, SQL injection etc
  • różne warianty poprawnych danych

Za każdym razem wiesz co testujesz, np wysyłając jako ID ciąg tekstowy oczekujesz, że serwer zwróci błąd o kodzie 500 - asercję ustawiasz więc na sprawdzenie, czy wystąpił błąd i ma kod 500.

Jeśli wystąpi Ci jakiś fatal error z samego PHP to nie obsługujesz go w testach, bo takowy w działającej aplikacji nie ma prawa się pojawić, wszystko musi zostać obsłużone.

3. Tak, jeśli każde uruchomienia są od siebie niezależne, tzn gdy jedno nie wpływa na wyniki drugiego. Generalnie uruchomienie testów kilkukrotnie powinno za każdym razem zwracać te same wyniki.
Do czegoś takiego w PHPUnit jest specjalne rozwiązanie Data providers
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.