BDD to modne pojęcie, które robi coraz większą karierę. Behavior-Driven Development to zwinny proces wytwarzania oprogramowania, który w założeniu zespołowi developerskiemu ułatwia komunikację i współpracę z biznesem, a przedstawicielom biznesu zapewnia kontrolę nad projektem. Czy tak jest w praktyce? W tekście wyjaśniam, czym jest Behavior-Driven Development, czym różni się od TDD oraz jakie są najczęstsze błędy z nim związane. 

Czym jest Behavior-Driven Development?

BBD, czyli Behavior-Driven Development, to zwinny proces rozwoju oprogramowania determinowany zachowaniem, ukierunkowany na spełnienie określonych wymagań. BDD jest procesem wytwarzania oprogramowania, w którym dokumentacja i testy są pisane w języku naturalnym. W idealnym świecie BDD powinno być integralną częścią całego cyklu wytwarzania oprogramowania. Funkcjonalności powinny być opisane w służącym do tego celu języku Gherkin jeszcze na etapie zbierania wymagań i analizy, a następnie wykorzystywane (ewentualnie rozwijane) w fazie projektowania i implementacji. Rozpoczynając testy manualne, tester opiera się na istniejącej dokumentacji, która w jasny sposób pokazuje mu warunki początkowe, wszystkie niezbędne akcje i ich finał. Następnie na jej podstawie tworzone są testy automatyczne z zachowaniem języka naturalnego. Tester otrzymuje zadanie do przetestowania manualnego / napisania testu automatycznego i dzięki czytelnej formie zapisu wie, czym ma się zająć, a interpretacja zadania nie powinna być problemem. Czy zawsze tak jest? Postaram się odpowiedzieć na to pytanie w dalszej części.

TDD vs. BDD

Behavior-Driven Development często jest porównywany do podejścia TDD. Test-Driven Development także jest zwinnym procesem testowania oprogramowania. Opiera się na powtarzaniu cyklu Red – Green – Refactoring. Rozwój oprogramowania opiera się tu na testach napisanych dla jeszcze nieistniejących funkcjonalności. Podstawową różnicą między BDD od TDD jest wykorzystanie w BDD zrozumiałego dla wszystkich – nawet osób bez wiedzy technicznej – języka, co pokazuje przykład poniżej.

Keep it simple, czyli zalety BDD

Oto fragment wymagań, które są równocześnie prawdziwym (nie pseudo-) kodem:

Scenario: User add article

Given: User is logged in

When: User add new article

Then: Article should be displayed

Zalety takiego podejścia widać od razu.

Tak skonstruowana dokumentacja, wykorzystująca język naturalny, jest dostępna dla wszystkich w projekcie i wspiera rozwój aplikacji na różnych etapach. Członkowie zespołu mogą omawiać ją na spotkaniach przed implementacją i w jej trakcie, a następnie wykorzystać w testach automatycznych i raportach (jeżeli są generowane), aby czytelnie zobrazować stan aplikacji. Także osoby niemające wiedzy technicznej, np. przedstawiciele biznesu, mogą mieć wgląd w to, jakie ścieżki biznesowe są pokryte przez testy automatyczne. Dzięki temu mogą sprawdzić, czy aplikacja od samego początku jest wytwarzana zgodnie z celem biznesowym.

Jednak w rzeczywistości może to wyglądać zupełnie inaczej.

Ciemna strona mocy, czyli BDD w praktyce

Przejdźmy teraz od teorii do praktyki. Czasem założenie projektowe co do stosowania BDD rozmija się z realizacją. Przykładowo dzieje się tak, gdy podejście BDD jest wykorzystywane tylko w przypadku testów. W rezultacie BDD przestaje być procesem wytwarzania oprogramowania, stając się jedynie formą pisania testów automatycznych. Jak unikać takich sytuacji i jakie są najczęstsze przyczyny błędów w wykorzystaniu Behavior-Driven Development?

Najczęstsze błędy w wykorzystaniu BDD

  • Biznes nie dostarcza gotowych scenariuszy w formie „Given, When, Then”

Powody są różne: potrzebny jest dodatkowy czas, a więc koszt, brakuje chęci lub kompetencje odpowiedzialnych osób są niewystarczające. Product Owner zazwyczaj dostarcza wymagania w języku najbardziej zrozumiałym dla niego, a późniejsze tłumaczenie na Gherkin schodzi na dalszy plan. W takiej sytuacji tester nie ma możliwości skopiowania tekstu i wykorzystania go bezpośrednio w kodzie. Praca, która powinna była być wykonana na dużo wcześniejszym etapie projektowym, spada na testera. Zamiast skupić się na testowaniu, musi on zająć się przepisywaniem wymagań.

  • Scenariusz testów jest tworzony po czasie

Podobnie jak w TDD, tak i w BDD testy powinny prowadzić wytwarzanie oprogramowania. Nie można jednak tego osiągnąć, gdy scenariusz jest tworzony po czasie, a nie, zgodnie ze sztuką, przed napisaniem danej funkcjonalności. Problemem jest również brak równoległej pracy testera i developera. Jeżeli scenariusz nie został dostarczony wcześniej, tester tworzy go częściowo na podstawie dokumentacji, a częściowo na podstawie tego, co stworzył programista. W rezultacie testy dopracowywane są dopiero na końcu, przed zamknięciem Sprintu, a testerzy dwoją się i troją, aby przetestować funkcjonalność i zamknąć wszystkie zadania.

  • Biznes nie jest zainteresowany treścią testów

Pisałem o tym, że silnym argumentem, który przemawia za stosowaniem BDD, jest możliwość czytania takich testów przez osoby niemające wiedzy technicznej. W praktyce nigdy nie spotkałem się z tym, aby biznes był zainteresowany treścią testów. Przedstawiciele biznesu chętniej zaglądają do raportów i kolorowych wykresów. Zazwyczaj Product Owner pyta zespół o stan aplikacji, o to, czy dana funkcjonalność jest gotowa, czy są jakieś błędy, które należy poprawić. Pełna treść raportów z testów jest znana tylko testerom, tylko oni je monitorują, utrzymują, rozwijają. Gdyby osoby bez wiedzy technicznej chętniej czytały testy, komunikacja w projekcie rzeczywiście byłaby łatwiejsza. Dodatkowo, takie osoby zyskałyby wiedzę, jak przekazywać wymagania w bardziej przystępny dla testerów sposób, co umożliwiłoby szybszy start projektu.

Czytamy test

Załóżmy jednak czysto teoretycznie, że ktoś bez znajomości programowania chciałby zobaczyć, co w testach piszczy. Czy na pewno pełna forma BDD jest jedynym wyjściem? Poniżej fragment kodu zapisany w Javie z wykorzystaniem frameworku Serenity BDD (jednak bez wykorzystania jego możliwości pracy z językiem Gherkin):

@Test
public void itShouldBePossibleToAddNewArticle () {
    // Given
    loginPageSteps.signInUser(testUser);
    navBarSectionSteps.clickNewPost();
    // When
    editorPageSteps.addArticle(defaultArticle);
    // Then
    articlePageSteps.articleShouldBeDisplayed(defaultArticle);
}

Jak widać, nie potrzeba wiedzy programistycznej, aby z tych kilku linijek kodu zrozumieć, że potrzebne jest logowanie, dodanie artykułu oraz sprawdzenie jego widoczności. Poniżej raport, jaki został wygenerowany. Zauważmy, że metody jak np. „clickNewPost()” są automatycznie przetwarzane na tekst „Click new post”: 

Testy BDD

Zwykły kod, jeśli jest odpowiednio przygotowany, również może być w łatwy sposób analizowany przez osoby bez znajomości programowania. Nie mówiąc o narzędziach, takich jak Serenity BDD czy Allure, które pomagają wygenerować raporty. Teoretycznie, jeśli biblioteka kroków jest dobrze rozbudowana, to nawet osoba bez wiedzy programistycznej mogłaby dodawać kolejne testy. Ten argument jest jednak trudny do spełnienia, ponieważ zazwyczaj trzeba dodać także nowe metody ponad te, które już istnieją. Zwykle można wesprzeć się częściowo istniejącą implementacją, ale tu już jest niezbędna znajomość programowania.

BDD a czas

Pisałem o tym, jak ważne jest, aby podejście BDD stosować wyłącznie całościowo, na każdym etapie. Jest jeszcze jeden bardzo ważny argument, który w mojej ocenie przemawia na niekorzyść stosowania BDD w samych testach – czas. BDD nakłada kolejną warstwę abstrakcji w tworzonym kodzie, a to z kolei wymaga poświęcenia dodatkowego czasu na jej zrozumienie, stworzenie i utrzymanie. Trzeba więc albo dodatkowych osób w projekcie, albo testerzy, zamiast tworzyć nowe testy oraz na bieżąco utrzymywać istniejące, zajmują się pielęgnacją BDD, tak aby testy były czytelne dla osób… które w rzeczywistości ich nie czytają.

BDD: tak czy nie?

BDD stało się hasłem modnym, szeroko reklamowanym i obecnie Internet pęka w szwach od treści zachwalających to podejście. Decyzja o wykorzystaniu BDD (czy jakiegokolwiek innego podejścia) w projekcie nie powinna być jednak podejmowana z powodu chęci podążania za modą, ale na podstawie dogłębnej analizy. Problemem może być również sytuacja, gdy metodologia BDD jest stosowana częściowo. BDD spełni swoje zadania, jeśli będzie implementowane właściwie w całościowym procesie wytwarzania oprogramowania, zatem już od momentu zbierania wymagań. Jeżeli chcemy z niego korzystać tylko w automatyzacji testów, bez przeprowadzenia dogłębnej analizy, BDD niekoniecznie musi okazać się dobrym rozwiązaniem w każdym projekcie. W dużym uproszczeniu, jeżeli celem testów ma być poruszanie myszką i wpisywanie tekstu, z łatwością można znaleźć inne narzędzia, które zrobią to równie dobrze, oszczędzając przy tym sporo czasu. To moja prywatna opinia zebrana w czasie różnych doświadczeń w karierze testera. Wierzę jednak, że nie brakuje przykładów poprawnej implementacji BDD, a mój tekst także przyczyni się do wzrostu świadomości w tym zakresie.

Pact Consumer Driven Contract Testing

Poznaj Pact Consumer Driven Contract Testing
Przeczytaj artykuł i dowiedz się, jak skutecznie testować systemy stworzone we frameworku Spring WebFlux.
Przeczytaj artykuł
Autorem wpisu jest:
Test Automation Engineer

Tomasz zajmuje się automatyzacją testów aplikacji webowych oraz mobilnych. Jest absolwentem Politechniki Krakowskiej, na kierunku budownictwo, oraz Uniwersytetu Jagiellońskiego – studiów podyplomowych w zakresie informatyki. Prywatnie mąż wspaniałej kobiety.

Dodaj komentarz

Skontaktuj się z nami

Chcesz dowiedzieć się więcej o naszych usługach? Napisz do nas – odpowiemy na każdą wiadomość.

    Niniejszym wyrażam zgodę na przetwarzanie przez JCommerce Sp. z o.o. moich danych osobowych (dalej „dane osobowe”), takich jak: imię i nazwisko, adres e-mail, nr telefonu, firma, w celach handlowych.
    Niniejszym wyrażam zgodę na przetwarzanie przez JCommerce Sp. z o.o. moich danych osobowych (dalej „dane osobowe”), takich jak: imię i nazwisko, adres e-mail, nr telefonu, firma, w celach marketingowych.
    Niniejszym wyrażam zgodę na przetwarzanie przez JCommerce Sp. z o.o. moich danych osobowych (dalej „dane osobowe”), takich jak: imię i nazwisko, adres e-mail, nr telefonu, firma w celach rekrutacyjnych.
    Niniejszym wyrażam zgodę na przetwarzanie przez JCommerce Sp. z o.o. moich danych osobowych (dalej „dane osobowe”), takich jak: imię i nazwisko, adres e-mail, nr telefonu, firma na potrzeby przyszłych rekrutacji.
    W związku z obowiązującymi przepisami dotyczącymi ochrony danych osobowych tj. Ustawą o ochronie danych osobowych z dnia 10 maja 2018 roku, jak również treścią Rozporządzenia Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (RODO), informujemy, że: 1. Administratorem danych osobowych jest JCommerce Sp. z o.o. z siedzibą w Katowicach, ul. Ściegiennego 3, 40-114 Katowice (KRS: 00007393418).
    2. Powyższe dane osobowe przetwarzane będą przez JCommerce Sp. z o.o. – w zależności od udzielonych przez Panią/Pana zgód (podstawa prawna przetwarzania: art. 6 ust. 1 pkt a) RODO):
    • w celach handlowych,
    • w celach marketingowych,
    • w celach rekrutacyjnych;
    • w celach przyszłych rekrutacji.
    3. Podanie powyższych danych osobowych nie jest wymogiem ustawowym, umownym lub warunkiem zawarcia umowy. Nie jest Pan/Pani zobowiązany/a do podania powyższych danych osobowych, jednak brak ich podania uniemożliwi realizacje ww. celu.
    4. Posiada Pan/ Pani prawo dostępu do treści swoich danych, w tym otrzymania ich kopii i ich sprostowania, usunięcia, ograniczenia przetwarzania, prawo do przenoszenia danych, prawo do sprzeciwu wobec przetwarzania, prawo do cofnięcia zgody w dowolnym momencie, jeśli została udzielona. Wycofanie zgody nie wpływa jednak na zgodność z prawem przetwarzania, którego dokonano na podstawie zgody przed jej wycofaniem; oświadczenie o cofnięciu zgody na przetwarzanie danych osobowych należy złożyć w siedzibie JCommerce Sp. z o.o. lub przesłać na adres mailowy zgody@jcommerce.pl. Cofnięcie zgody na przetwarzanie danych osobowych skutkuje brakiem możliwości realizacji ww. celów przetwarzania;
    5. Dane osobowe są udostępniane przez JCommerce Sp. z o.o. upoważnionym pracownikom i osobom współpracującym z JCommerce Sp. z o.o. na podstawie umów cywilnoprawnych, przez których realizowany jest cel przetwarzania;
    6. Wszelkie pytania dotyczące ochrony danych osobowych oraz realizacje przysługujących praw, prosimy kierować na adres odo@jcommerce.pl;
    7. W zależności od udzielonej zgody, dane osobowe będą przetwarzane przez czas niezbędny do realizacji ww. celów przetwarzania. W przypadku wniesienia sprzeciwu, JCommerce Sp. z o.o. przestanie przetwarzać Pani/Pana dane w ww. celu, chyba że będzie w stanie wykazać, że w stosunku do tych danych istnieją ważne prawnie uzasadnione podstawy, które są nadrzędne wobec Pana/Pani interesów, praw i wolności, lub niezbędne do ewentualnego ustalenia, dochodzenia lub obrony roszczeń;
    8. Nie przekazujemy Pani/Pana danych poza teren Europejskiego Obszaru Gospodarczego oraz do organizacji międzynarodowych.
    9. Pani/Pana dane osobowe nie podlegają zautomatyzowanemu podejmowaniu decyzji, w tym profilowaniu.
    10. Ma Pani/Pan prawo wniesienia skargi do organu nadzorczego gdy uzna Pan/Pani, iż przetwarzanie ww. danych osobowych narusza przepisy ogólnego rozporządzenia o ochronie danych osobowych z dnia 27 kwietnia 2016 r.
    Niniejszym wyrażam zgodę na przetwarzanie przez JCommerce Sp. z o.o. moich danych osobowych (dalej „dane osobowe”), takich jak: imię i nazwisko, adres e-mail, nr telefonu, firma, w celach handlowych.
    Niniejszym wyrażam zgodę na przetwarzanie przez JCommerce Sp. z o.o. moich danych osobowych (dalej „dane osobowe”), takich jak: imię i nazwisko, adres e-mail, nr telefonu, firma, w celach marketingowych.
    Niniejszym wyrażam zgodę na przetwarzanie przez JCommerce Sp. z o.o. moich danych osobowych (dalej „dane osobowe”), takich jak: imię i nazwisko, adres e-mail, nr telefonu, firma w celach rekrutacyjnych.
    Niniejszym wyrażam zgodę na przetwarzanie przez JCommerce Sp. z o.o. moich danych osobowych (dalej „dane osobowe”), takich jak: imię i nazwisko, adres e-mail, nr telefonu, firma na potrzeby przyszłych rekrutacji.
    W związku z obowiązującymi przepisami dotyczącymi ochrony danych osobowych tj. Ustawą o ochronie danych osobowych z dnia 10 maja 2018 roku, jak również treścią Rozporządzenia Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (RODO), informujemy, że: 1. Administratorem danych osobowych jest JCommerce Sp. z o.o. z siedzibą w Katowicach, ul. Ściegiennego 3, 40-114 Katowice (KRS: 00007393418).
    2. Powyższe dane osobowe przetwarzane będą przez JCommerce Sp. z o.o. – w zależności od udzielonych przez Panią/Pana zgód (podstawa prawna przetwarzania: art. 6 ust. 1 pkt a) RODO):
    • w celach handlowych,
    • w celach marketingowych,
    • w celach rekrutacyjnych;
    • w celach przyszłych rekrutacji.
    3. Podanie powyższych danych osobowych nie jest wymogiem ustawowym, umownym lub warunkiem zawarcia umowy. Nie jest Pan/Pani zobowiązany/a do podania powyższych danych osobowych, jednak brak ich podania uniemożliwi realizacje ww. celu.
    4. Posiada Pan/ Pani prawo dostępu do treści swoich danych, w tym otrzymania ich kopii i ich sprostowania, usunięcia, ograniczenia przetwarzania, prawo do przenoszenia danych, prawo do sprzeciwu wobec przetwarzania, prawo do cofnięcia zgody w dowolnym momencie, jeśli została udzielona. Wycofanie zgody nie wpływa jednak na zgodność z prawem przetwarzania, którego dokonano na podstawie zgody przed jej wycofaniem; oświadczenie o cofnięciu zgody na przetwarzanie danych osobowych należy złożyć w siedzibie JCommerce Sp. z o.o. lub przesłać na adres mailowy zgody@jcommerce.pl. Cofnięcie zgody na przetwarzanie danych osobowych skutkuje brakiem możliwości realizacji ww. celów przetwarzania;
    5. Dane osobowe są udostępniane przez JCommerce Sp. z o.o. upoważnionym pracownikom i osobom współpracującym z JCommerce Sp. z o.o. na podstawie umów cywilnoprawnych, przez których realizowany jest cel przetwarzania;
    6. Wszelkie pytania dotyczące ochrony danych osobowych oraz realizacje przysługujących praw, prosimy kierować na adres odo@jcommerce.pl;
    7. W zależności od udzielonej zgody, dane osobowe będą przetwarzane przez czas niezbędny do realizacji ww. celów przetwarzania. W przypadku wniesienia sprzeciwu, JCommerce Sp. z o.o. przestanie przetwarzać Pani/Pana dane w ww. celu, chyba że będzie w stanie wykazać, że w stosunku do tych danych istnieją ważne prawnie uzasadnione podstawy, które są nadrzędne wobec Pana/Pani interesów, praw i wolności, lub niezbędne do ewentualnego ustalenia, dochodzenia lub obrony roszczeń;
    8. Nie przekazujemy Pani/Pana danych poza teren Europejskiego Obszaru Gospodarczego oraz do organizacji międzynarodowych.
    9. Pani/Pana dane osobowe nie podlegają zautomatyzowanemu podejmowaniu decyzji, w tym profilowaniu.
    10. Ma Pani/Pan prawo wniesienia skargi do organu nadzorczego gdy uzna Pan/Pani, iż przetwarzanie ww. danych osobowych narusza przepisy ogólnego rozporządzenia o ochronie danych osobowych z dnia 27 kwietnia 2016 r.