BDD - TDD w stylu BDD
W TDD termin „testy akceptacyjne” wprowadza w błąd. Testy akceptacyjne faktycznie reprezentują oczekiwane zachowanie systemu. W praktykach Agile kładzie się nacisk na współpracę całego zespołu oraz interakcje z klientem i innymi interesariuszami. To spowodowało konieczność stosowania terminów, które są łatwo zrozumiałe dla wszystkich zaangażowanych w projekt.
TDD sprawia, że myślisz o wymaganym Behavior dlatego termin „zachowanie” jest bardziej przydatny niż termin ‘Test’. BDD to programowanie sterowane testami ze słownictwem, które koncentruje się na zachowaniu, a nie na testach.
Mówiąc słowami Dana Northa: „Przekonałem się, że przejście od myślenia w testach do myślenia w zachowaniu jest tak głębokie, że zacząłem nazywać TDD jako BDD lub Behavior Driven Development.” TDD skupia się na tym, jak coś będzie działać, BDD skupia się na tym, dlaczego w ogóle to budujemy.
BDD odpowiada na następujące pytania, z którymi często spotykają się twórcy:
Pytanie | Odpowiedź |
---|---|
Gdzie zacząć? | od zewnątrz do wewnątrz |
Co przetestować? | Historie użytkownika |
Czego nie testować? | coś jeszcze |
Odpowiedzi te dają następującą strukturę opowieści -
Story Framework
Jak [Role]
chcę [Feature]
po to aby [Benefit]
To znaczy: „Kiedy Feature jest wykonywany, wynikowy Benefit jest dla osoby grającej Role.'
BDD dodatkowo odpowiada na następujące pytania -
Pytanie | Odpowiedź |
---|---|
Ile przetestować za jednym razem? | bardzo mało skoncentrowany |
Jak nazwać ich testy? | szablon zdania |
Jak zrozumieć, dlaczego test się nie udał | dokumentacja |
Odpowiedzi te dają przykładowe ramy w następujący sposób -
Example Framework
Given jakiś kontekst początkowy,
When zdarzenie ma miejsce,
Then zapewnić pewne wyniki.
Oznacza to: „Zaczynając od kontekstu początkowego, kiedy ma miejsce określone wydarzenie, wiemy, jakie są jego skutki should be”.
Tak więc przykład pokazuje oczekiwane zachowanie systemu. Przykłady służą do zilustrowania różnych scenariuszy działania systemu.
Historia i scenariusze
Rozważmy następującą ilustrację autorstwa Dana Northa dotyczącą systemu bankomatów.
Fabuła
As a klient,
I want do wypłaty gotówki z bankomatu,
so that Nie muszę czekać w kolejce do banku.
Scenariusze
Istnieją dwa możliwe scenariusze tej historii.
Scenario 1 - Konto jest kredytowane
Given konto jest kredytowane
And karta jest ważna
And dystrybutor zawiera gotówkę
When klient żąda gotówki
Then upewnić się, że konto zostało obciążone
And upewnić się, że wydano gotówkę
And upewnij się, że karta została zwrócona
Scenario 2 - Konto przekroczyło limit debetu
Given konto jest przekroczone
And karta jest ważna
When klient żąda gotówki
Then upewnij się, że wyświetlany jest komunikat o odrzuceniu
And upewnij się, że gotówka nie zostanie wydana
And upewnij się, że karta została zwrócona
Wydarzenie jest takie samo w obu scenariuszach, ale kontekst jest inny. Dlatego wyniki są różne.
Cykl rozwoju
Cykl rozwoju BDD to outside-in podejście.
Step 1- Napisz przykład wartości biznesowej wysokiego poziomu (na zewnątrz) (używając Cucumber lub RSpec / Capybara), który będzie czerwony. (RSpec tworzy framework BDD w języku Ruby)
Step 2 - Napisz niższy (wewnętrzny) przykład RSpec dla pierwszego kroku implementacji, który zostanie oznaczony na czerwono.
Step 3 - Zaimplementuj minimalny kod, aby przekazać ten przykład niższego poziomu, zobacz, czy będzie zielony.
Step 4 - Napisz następny przykład RSpec niższego poziomu, przechodząc do kroku 1, który staje się czerwony.
Step 5 - Powtarzaj kroki 3 i 4, aż przykład wysokiego poziomu w kroku 1 stanie się zielony.
Note - Należy pamiętać o następujących kwestiach -
Red/green stan to status pozwolenia.
Gdy testy niskiego poziomu są zielone, masz uprawnienia do pisania nowych przykładów lub refaktoryzacji istniejącej implementacji. Nie możesz, w kontekście refaktoryzacji, dodawać nowej funkcjonalności / elastyczności.
Kiedy twoje testy niskiego poziomu są czerwone, masz uprawnienia do pisania lub zmiany kodu implementacji tylko po to, aby istniejące testy stały się zielone. Musisz oprzeć się pokusie napisania kodu, aby przejść następny test, który nie istnieje, lub zaimplementować funkcje, które uważasz za dobre (klient by o to nie poprosił).