Upload
robert-kaszubowski
View
82
Download
0
Embed Size (px)
Citation preview
BDD & JBehave
Robert Kaszubowski
Agenda
● Czym jest BDD
● Czym jest JBehave
● Praca z JBehave
● Podsumowanie
Agenda
● Czym jest BDD
● Czym jest JBehave
● Praca z JBehave
● Podsumowanie
Zaczerpnięte z http://www.slideshare.net/wakaleo/bdd-in-action-principles-practices-and-realworld-application
Zaczerpnięte z http://www.slideshare.net/wakaleo/bdd-in-action-principles-practices-and-realworld-application
BDD
● Behaviour Driven Development
● Dan North
● Zwinne metodyki
● TDD + DDD = BDD
● Tworzenie oprogramowania przez opisywanie jego zachowania, z perspektywy jego udziałowców.
BDD kładzie nacisk na:
● Zrozumienie potrzeb klienta
● Poznanie jego języka
● Poznanie sposobu, w jaki opisuje jak oprogramowanie ma się zachowywać
3 zasady BDD
I. Enough is enough
● Analiza i projektowanie tyle ile naprawdę trzeba
● Nie specyfikujemy od razy całego zakresu projektu
● Robimy tyle ile trzeba
„Nadgorliwość gorsza jest od faszyzmu” :)
3 zasady BDD
II. Deliver stakeholder value
● Wszystko co robimy ma nieść za sobą realną wartość biznesową
● Jeśli robimy coś co tej wartości nie przynosi, warto zająć się czymś innym
● Jeżeli funkcjonalność pojawia się w projekcie, to znaczy, że jest ona wartościowa
3 zasady BDD
III. It's all behaviour
● Potrzeba mówienia „wszechobecnym językiem”
● Wszyscy uczestnicy projektu powinni odwoływać się i myśleć o systemie w ten sam sposób
● Dzięki temu zmniejszana jest bariera komunikacyjna między „nietechnicznymi” klientami, a „technicznymi” programistami
● Wymagania definiujemy w formie historyjek użytkownika
Podsumowując
● liczy się przede wszystkim zachowanie
● minimalizacja formalizmów, maksymalizacja zrozumienia
● naturalny język zrozumiały dla każdego
● nazwy metod testowych powinny być zdaniami
● łatwiejsze czytanie kodu i interpretacja testów
● kod stanowi dokumentację
Historyjki użytkownika
● Historyjka jest spisanym wymaganiem klienta
Każda historyjka składa się z kilku części:
● tytułu,
● narracji,
● kryteriów akceptacji
W narracji powinniśmy zawrzeć:
● Opis funkcjonalności
● Korzyści jakie płyną z danej funkcjonalności
● Osobę (rolę), która będzie czerpać te korzyści
Przykład:
Zakładanie nowego konta użytkownika w systemie xxx.
Jako użytkownik.
Chcę założyć nowe konto w systemie xxx.
Aby móc korzystać z systemu.
Historyjki ciąg dalszy
● Kryteria akceptacji określają moment, w którym historyjka jest kompletna. Spisywane są w postaci scenariuszy, których pozytywne przejście gwarantuje osiągnięcie celu.
Zwykle scenariusze składają się z trzech bloków:
● Given – określający kontekst
● When – określający zdarzenie
● Then – określający rezultat
Przykład historyjki (BDD)
Scenariusz: Wypłata środków z konta. (Tytuł)
Zakładając, że na koncie jest odpowiednia ilość środków (Given)
Oraz, że karta jest poprawna (Given)
Oraz, że w kasecie są pieniądze (Given)
Jeżeli klient zażąda wypłaty gotówki (When)
Wtedy konto zostanie obciążone (Then)
Oraz pieniądze zostaną wypłacone (Then)
Oraz karta zostanie zwrócona klientowi (Then)
Kluczowa sprawa
● Kluczem do sukcesu jest spowodowanie, by kryteria akceptacji poszczególnych historyjek były wykonywalne, dzięki temu da się je zautomatyzować.
Agenda
● Czym jest BDD
● Czym jest JBehave
● Praca z JBehave
● Podsumowanie
JBehave
Wykorzystuje słowa kluczowe:
● SCENARIO
● GIVEN
● WHEN
● THEN
● AND
● NARRATIVE
● EXAMPLES
Oraz annotacje:
● @GIVEN
● @WHEN
● @THEN
● @ALIAS
● @ALLIASES
● @PENDING
● Framework dla BDD wykorzystujący podobny format jak ten opisujący historyjki użytkownika.
Bez BDD
public void login(String username,String password) {driver.get("http://www.dummy.website.com");driver.findElement(By.name("username")).sendKeys(username);driver.findElement(By.name("password")).sendKeys(password);driver.findElement(By.name("update")).click();
}
@Testpublic void testLoginWorksForCorrectCredentials() {
login("bob","password");assertTrue(driver.getPageSource().contains("Welcome"));
}
@Testpublic void testLoginFailsForWrongPassword() {
login("bob","messerschmidt");assertFalse(driver.getPageSource().contains("Welcome"));
}
Agenda
● Czym jest BDD
● Czym jest JBehave
● Praca z JBehave
● Podsumowanie
1. Napisz historyjki
Scenario: Test the login works with valid credentials
Given the login pageWhen the user logs in with username: bob and password: passwordThen the word: Welcome should be on the page
Scenario: Test login fails with wrong password
Given the login pageWhen the user logs in with username: bob and password: blahThen the word: Invalid should be on the page
2. Zmapuj historyjki do Javy
@Given("the login page")public void gotoLoginPage() {
driver.get("http://www.dummy.website.com");}
@When("the user logs in with username: $username and password: $password")public void login(String username, String password) {
driver.findElement(By.name("username")).sendKeys(username);driver.findElement(By.name("password")).sendKeys(password);driver.findElement(By.name("update")).click();
}
@Then("the word: $matchWord should be on the page")public void findWordInPage(@Named("matchWord") String matchWord){
assertThat(driver.getPageSource(),containsString(matchWord));}
Data Tables i DDT
Scenario: Test login with valid and invalid data
Given the login pageWhen the user logs in with <username> and <password>Then the <matchWord> should be on the page
Examples:|username |password |matchWord ||bob |password |Welcome ||bob |blah |Invalid |… … ...
3. Skonfiguruj narzędzie
● Embedder – klasa pełniąca punkt wejściowy konfiguracji JBehave
● Z Embeddera korzystają Embeddable – klasy uruchamiające historyjki
● JBehave dostarcza implementacji JUnit Runnera
● http://jbehave.org/reference/stable/developing-stories.html#configuring
4. Uruchom testy
● Można uruchamiać je jako testy Junit
● Maven, Ant
● Można uruchamiać historyjki lokalne jak i zdalne
4. Uruchom testypublic class TraderStoryRunner { @Test public void runClasspathLoadedStoriesAsJUnit() { // Embedder defines the configuration and candidate steps Embedder embedder = new TraderEmbedder(); List<String> storyPaths = ... // use StoryFinder to look up paths embedder.runStoriesAsPaths(storyPaths); } @Test public void runURLLoadedStoriesAsJUnit() { // Embedder defines the configuration and candidate steps Embedder embedder = new URLTraderEmbedder(); List<String> storyPaths = ... // use StoryFinder to look up paths embedder.runStoriesAsPaths(storyPaths); } }● TradeEmbedder / URLTradeEmbedder – definiują konfigurację używając
wczytywania z classpath i zasobu URL
4. Uruchom testy
public class YourStory extends JUnitStory/Stories {
@org.testng.annotations.Test
public void run() throws Throwable {
super.run();
}
}
5. Obejrzyj raport
Obecnie wspierane formaty raportów:
● ConsoleOutput
● IdeOnlyConsoleOutput
● TxtOutput
● HtmlOutput
● HtmlTemplateOutput
● XmlOutput
● PostStoryStatisticCollector
● DelegatingStoryReporter
● Klasa StoryReportBuilder pozwala na konfigurowanie raportowania w kilku formatach na raz: CONSOLE, TXT, HTML, HTML_TEMPLATE oraz XML.
5. Obejrzyj raport
5. Obejrzyj raport
Agenda
● Czym jest BDD
● Czym jest JBehave
● Praca z JBehave
● Podsumowanie
Inne narzędzia do BDD
Dla Javy:
● Cucumber JVM
● Concordion
● EasyB
● JDave
● Inne:
● Jasmine (JavaScript)
● Behat (PHP)
● MSpec
JBehave vs CucumberPodobne:
● Czysta Java
● Wsparcie dla Junit
● Szybkie
● Łatwe w użyciu
Wady/Zalety Cucumber:
● wspiera features
● większa możliwość konfiguracji raportów (ładny konsolowy output, dodatkowe formaty)
● nie wspiera równoległych testy w JUnit
● słaba dokumentacja
Wady/Zalety JBehave:
● bardzo dobra dokumentacja
● całkiem dobre formatowanie HTML dla raportów
● wspiera równoległe testy w JUnit
● wspiera tylko stories a nie features