Mam więc moduł uwierzytelniania, który napisałem jakiś czas temu. Teraz widzę błędy na mojej drodze i piszę dla nich testy jednostkowe. Podczas pisania testów jednostkowych trudno mi wymyślić dobre nazwiska i dobre obszary do przetestowania. Na przykład mam takie rzeczy
- Wymaga Logowania_ powinien być_redirect_when_not_logged_in
- Wymaga Logowania_powinna_przejść_przejście_w momencie_logowania_w
- Login_should_work_when_given_proper_credentials
Osobiście uważam, że jest to trochę brzydkie, chociaż wydaje się „właściwe”. Mam również problemy z rozróżnieniem testów, po prostu skanując je (muszę przynajmniej dwukrotnie przeczytać nazwę metody, aby wiedzieć, co się nie udało)
Pomyślałem więc, że może zamiast pisać testy, które czysto testują funkcjonalność, może napisz zestaw testów obejmujących scenariusze.
Na przykład jest to testowy odcinek, który wymyśliłem:
public class Authentication_Bill
{
public void Bill_has_no_account()
{ //assert username "bill" not in UserStore
}
public void Bill_attempts_to_post_comment_but_is_redirected_to_login()
{ //Calls RequiredLogin and should redirect to login page
}
public void Bill_creates_account()
{ //pretend the login page doubled as registration and he made an account. Add the account here
}
public void Bill_logs_in_with_new_account()
{ //Login("bill", "password"). Assert not redirected to login page
}
public void Bill_can_now_post_comment()
{ //Calls RequiredLogin, but should not kill request or redirect to login page
}
}
Czy to słyszy się wzór? Widziałem historie akceptacji i takie tam, ale jest to zupełnie inna sytuacja. Duża różnica polega na tym, że wymyślam scenariusze „wymuszenia” testów. Zamiast ręcznie próbować wymyślić możliwe interakcje, które będę musiał przetestować. Wiem też, że zachęca to do testów jednostkowych, które nie testują dokładnie jednej metody i klasy. Myślę, że to jest OK. Wiem też, że spowoduje to problemy przynajmniej dla niektórych środowisk testowych, ponieważ zwykle zakładają, że testy są od siebie niezależne i kolejność nie ma znaczenia (gdzie to by było w tym przypadku).
W każdym razie, czy jest to w ogóle wskazany wzór? Czy byłoby to idealne dopasowanie do testów integracyjnych mojego interfejsu API, a nie jako testów „jednostkowych”? To tylko osobisty projekt, więc jestem otwarty na eksperymenty, które mogą się nie udać.
_test
dołączonym i używam komentarzy, aby zanotować oczekiwane wyniki. Jeśli jest to projekt osobisty, znajdź styl, w którym czujesz się komfortowo i trzymaj się tego.