Najlepsze praktyki zawsze mają cel, przyczynę. Zawsze dobrze jest wziąć pod uwagę te powody w swoim projekcie - szczególnie, gdy próbujesz zdecydować, w jaki sposób i jak trudno zastosować te najlepsze praktyki.
W tym przypadku głównym powodem, dla którego każdy test jest jednym, jest to, że jeśli pierwsza nie powiedzie się, druga nie zostanie przetestowana. Ponieważ zbyt wielu opiniotwórców wydaje się odnosić korzyści z rozbijania wszystkiego na możliwie najmniejsze bity i zawijania jak największej liczby wzdęć, zrodziło to pomysł, że każdy test powinien zawierać jedno stwierdzenie.
Nie śledź tego na ślepo. Nawet jeśli każdy test powinien przetestować jedną rzecz, powinieneś zastanowić się, jak duża lub mała powinna być każda „rzecz”. Aby to zrobić, musisz pamiętać, dlaczego chcesz, aby każdy test testował jedną rzecz - aby się upewnić błąd w pierwszej rzeczy nie pozostawia drugiej rzeczy niesprawdzonej.
Musisz więc zadać sobie pytanie - czy naprawdę potrzebuję tutaj tej gwarancji?
Powiedzmy, że jest błąd w pierwszym przypadku testowym - kod odpowiedzi HTTP nie jest 200
. Więc zacznij hakować kod, dowiedz się, dlaczego nie otrzymałeś kodu odpowiedzi, i powinieneś rozwiązać problem. I co teraz?
- Jeśli ręcznie uruchomisz test ponownie, aby sprawdzić, czy poprawka rozwiązała problem, powinieneś napotkać każdy inny problem ukryty przy pierwszej awarii.
- Jeśli nie uruchomisz go ręcznie (może dlatego, że trwa to zbyt długo?) I po prostu wepchniesz poprawkę w oczekiwaniu na uruchomienie serwera testów automatycznych, możesz chcieć umieścić różne potwierdzenia w różnych testach. Cykle w tym przypadku są bardzo długie, więc warto podjąć wysiłek, aby odkryć jak najwięcej błędów w każdym cyklu.
Jest jeszcze kilka rzeczy do rozważenia:
Zależności asercji
Wiem, że testy, które opisałeś, są tylko przykładem, a twoje rzeczywiste testy są prawdopodobnie bardziej skomplikowane - więc to, co powiem, może nie być tak ważne przy tak dużej sile w prawdziwych testach, ale nadal może być nieco skuteczne, więc może to rozważyć.
Jeśli masz usługę REST (lub dowolny inny protokół HTTP), która zwraca odpowiedzi w formacie JSON, zwykle piszesz prostą klasę klienta, która umożliwia korzystanie z metod REST, takich jak zwykłe metody zwracające zwykłe obiekty. Zakładając, że klient ma osobne testy, aby upewnić się, że działa, porzuciłbym pierwsze 3 twierdzenia i zatrzymałbym tylko 4!
Dlaczego?
- Pierwszy aser jest redundantny - klasa klienta powinna zgłosić wyjątek, jeśli kod odpowiedzi HTTP nie ma wartości 200.
- Drugie twierdzenie jest zbędne - jeśli odpowiedź jest pusta, wynikowy obiekt będzie miał wartość NULL lub inną reprezentację pustego obiektu i nie będziesz musiał nigdzie umieścić klucza X.
- Trzecie twierdzenie jest zbędne - jeśli JSON jest nieprawidłowy, dostaniesz wyjątek podczas próby jego przeanalizowania.
Nie musisz więc uruchamiać wszystkich tych testów - po prostu uruchom czwarty test, a jeśli wystąpią jakiekolwiek błędy w pierwszych trzech próbach wykrycia, test zakończy się niepowodzeniem z odpowiednim wyjątkiem, zanim jeszcze uzyskasz rzeczywiste potwierdzenie.
Jak chcesz otrzymywać raporty?
Załóżmy, że nie otrzymujesz wiadomości e-mail z serwera testowego, ale zamiast tego dział kontroli jakości przeprowadza testy i powiadamia o niepowodzeniu testów.
Jack z QA puka do twoich drzwi. Mówi, że pierwsza metoda testowa zawiodła, a metoda REST zwróciła zły kod odpowiedzi. Podziękujesz mu i zaczynasz szukać przyczyny.
Potem przychodzi Jen z kontroli jakości i mówi, że trzecia metoda testowa zawiodła - metoda REST nie zwróciła poprawnego kodu JSON w treści odpowiedzi. Mówisz jej, że już patrzysz na tę metodę, i wierzysz, że to samo, co spowodowało, że zwrócił zły kod wyjścia, spowodowało również, że zwróciła coś, co nie jest prawidłowym JSON, i wygląda bardziej jak ślad stosu wyjątku.
Wracasz do pracy, ale potem przybywa Jim z kontroli jakości, mówiąc, że czwarta metoda testowa zawiodła i nie ma klucza X w odpowiedzi ...
Nie możesz nawet poszukać przyczyny, ponieważ trudno jest patrzeć na kod, gdy nie masz ekranu komputera. Gdyby Jim był wystarczająco szybki, mógłby umknąć w czasie ...
E-maile z serwera testowego są łatwiejsze do odrzucenia, ale nadal - czy nie wolałbyś po prostu POWIADOMIĆ RAZ, że coś jest nie tak z metodą testową, i sam przejrzeć odpowiednie dzienniki testów?