Pytanie o testowanie API

0

Hej
Robię sobie REST API w Symfony. Wszystko fajnie, aż przyszła pora na testy. Jestem w nich niestety jeszcze bardzo początkujący i mam problem. Korzystam z PHPUnit.
Otóż mam akcję dodawania użytkowników. Każdy musi mieć unikalną nazwę użytkownika oraz emali. Jak sobie z tym poradzić? Jeśli ustawie dane do przesłania na sztywno to będzie próbowało za każdym razem tworzyć takiego samego użytkownika i wiadomo że każde uruchomienie testu prócz pierwszego zakończy się błędem. Powinienem generować jakieś losowe dane? Albo usuwać to co zostało stworzone zaraz po zakończeniu testu (jak?)? Powiedzcie jak to powinno być zrobione.
Drugie pytanie: czy do każdej metody powinna być dokładnie jedna metoda z testem? Zastanawiam się na przykład czy powinienem testować zarówno powodzenie jak i błąd tworzenia użytkownika, ale wtedy muszę jakoś to rozdzielić.

0

Najprościej chyba będzie tak:

public function setUp()
{
    $this->client = $this->createClient(['environment' => 'test']);
    $this->client->disableReboot();
    $this->em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
    $this->em->beginTransaction();
}

public function tearDown()
{
    $this->em->rollback();
}

Możesz też poszukać jakiś bundli: https://packagist.org/packages/dama/doctrine-test-bundle

Albo przeczytać dokumentację http://symfony.com/doc/current/testing.html

2
Testy napisał(a):

Hej
Albo usuwać to co zostało stworzone zaraz po zakończeniu testu?

Każdy test powinien sam sobie szykować wszystko - czyli setup testu przed jego rozpoczęciem - dzięki temu możesz odpalić testy wyrywkowo.

Drugie pytanie: czy do każdej metody powinna być dokładnie jedna metoda z testem?

Nie, jeden test na jedno zchowanie.

Zastanawiam się na przykład czy powinienem testować zarówno powodzenie jak i błąd tworzenia użytkownika

Tak, powinieneś - czyli dwa osobne testy (lub więcej, zalezy ile typów błędów).

0

Drugie pytanie: czy do każdej metody powinna być dokładnie jedna metoda z testem?
Zastanawiam się na przykład czy powinienem testować zarówno powodzenie jak i błąd tworzenia użytkownika

Powinieneś mieć tyle metod testowych ile jest ścieżek, a czasami nawet więcej. Absolutnie nie jedna metoda === jedna metoda testowa. Jedna metoda testowa powinna zawierać jedną asercję. Dlaczego? Bo jak zrobisz tak:

public function foo($foo) {
  // if return
  // if return
  // if return
  // some logic
}

public function testFoo() {
  // sprawdzam pierwszego if'a
  // sprawdzam drugiego if'a
  // sprawdzam trzeciego if'a
  // sprawdzam czy metoda zwraca to co powinna
}

i test Ci nie przejdzie to za cholere nie wiesz co się stało. Musisz sprawdzać, w którym miejscu Twoja funkcja zawiodła. Lepiej jest zrobić tak:

public function foo($foo) {
  // if return
  // if return
  // if return
  // some logic
}

public function foo_ThrowsException_IfSomethingHappens () {
    // sprawdzam pierwszego if'a
}

public function foo_ThrowsException_IfSomethingElseHappens () {
    // sprawdzam drugiego if'a
}

public function foo_ReturnsSomething_IfSomethingHappens () {
    // sprawdzam trzeciego if'a
}

public function foo_ReturnsSomething_IfCorrectValuesProvided () {
    // sprawdzam czy metoda zwraca to co powinna
}

Teraz jak Ci się wysra test 1 i 4 to wiesz co jest źle :)

0

Okej, dzięki panowie. Co do drugiej kwestii wszystko jest jasne, @Desu super wytłumaczył w ostatniej odpowiedzi. Zastanawiam się nadal nad pierwszą rzeczą. Nie wiem czy jest sens aż dodawać nowy bundle, pierwsza opcja z transakcją wygada całkiem spoko i zaraz wypróbuję. Chyba że ktoś jeszcze zna coś innego to chętnie zobaczę :)

0

Zacznij bez bundla. Nie próbowałem go jeszcze, bo też dopiero raczkuje jeżeli chodzi o pisanie testów, ale najlepiej jest dodawać narzędzia w miarę potrzeb :)

0

@Desu: hm, próbowałem Twojego sposobu z transakcją, ale nie działa - przy próbie wycofania pokazuje błąd ze nie ma żadnej otwartej transakcji. Wiesz może czemu tak się dzieje? Nie, na pewno nie zapomniałem jej wystartować, mam dokładnie jak w Twoim przykładzie :p

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