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ć.
- Rejestracja:ponad 9 lat
- Ostatnio:11 miesięcy
- Postów:1788
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

- Rejestracja:ponad 9 lat
- Ostatnio:ponad 3 lata
- Lokalizacja:Warszawa
- Postów:1264
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).
- Rejestracja:ponad 9 lat
- Ostatnio:11 miesięcy
- Postów:1788
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 :)
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ę :)
@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
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.