Na webe JBehave.org sa dočítame, že JBehave je framework na Behavior-Driven Development (BDD). Je to spôsob vývoja aplikácií riadený testami. Integruje Test-Driven Development (TDD) a Acceptance-Test Driven Development (ATDD).
- TDD je proces vývoja softvéru, ktorý sa opiera o opakovania veľmi krátkeho vývojového cyklu. Vývoj sa začne tak, že developer najskôr napíše automatizované testovacie prípady, ktoré definujú požadované zlepšenie alebo novú funkcionalitu. Potom sa produkuje minimálne množstvo kódu, aby sa vyhovelo testom. Nakoniec sa kód refaktoruje na prijateľnú úroveň.
- ATDD je metodika vývoja založená na komunikácii medzi zákazníkom, vývojárom a testerom počas vývoja. Slúži na lepšie pochopenie potrieb zákazníka pred vlastnou implementáciou, a umožňuje zákazníkom, aby pri definícii svojich požiadaviek mohli používať vlastné vyjadrovacie prostriedky – ‘User story’.
Použitie frameworku JBehave sa dá pekne ukázať na týchto piatich jednoduchých krokoch:
- Napíšte user story
- Namapujte kroky z user story do kódu v jazyku Java
- Nakonfigurujte user story
- Spustite JBehave test
- Skontrolujte výsledky testu
Formát testovacieho scenára je teda koncipovaný tak, aby vyhovolal zákazníkovi, ktorý ho definuje. Testovacie scenáre obsahujú tri základné kroky transformované neskôr do java @anotácií. Vyzerajú zvyčajne takto:
- Given (setup)
Špecifikuje sa stav systému - When (trigger)
Akcia alebo event - Then (verification)
Stav systému po zmene alebo očakávaný výstup/výsledok
Na otestovanie mojej imaginárnej triedy “Calculator”- popísanej neskôr v texte, ktorá vykonáva aritmetické operácie s dvomi int-premennými, by ‘user story’ mohla vyzerať takto:
Scenario: for my first Behavior driven-test
Given a calculator
Given calculator A-var has value 1
Given calculator B-var has value 1
Given result has value 0
When the user do calculatePlus
Then the value of result must become 2
Testovaná trieda “Calculator.java”
package com.rhe.jbehave.demo; public class Calculator { private int iCalcA; private int iCalcB; private int imRes; public Calculator() { } public int getiCalcB() { return iCalcB; } public void setiCalcB(int iCalcB) { this.iCalcB = iCalcB; } public int getiCalcA() { return iCalcA; } public void setiCalcA(int iCalcA) { this.iCalcA = iCalcA; } public int calculatePlus() { int iRe=0; iRe=iCalcA+iCalcB; this.imRes = iRe; return iRe; } public int calculateMinus() { int iRe=0; iRe=iCalcA-iCalcB; this.imRes = iRe; return iRe; } public int calculateMultiple() { int iRe=0; iRe=iCalcA * iCalcB; this.imRes = iRe; return iRe; } public int getImRes() { return imRes; } public void setImRes(int imRes) { this.imRes = imRes; } }
Tak, a teraz poďme postupovať podľa piatich bodov, ktoré som uviedol na začiatku.
1. User story bude uložená v súbore ‚calc_value.story’. Tento súbor sa používa jednak počas písania testov na grafické zobrazenie mapovania jednotlivých implementácií do javy a aj počas behu testu ako testovací run-time scenár. Po naištácii JBehave-pluginu do Eclipse, budete mať vždy pekný prehľad nad testovanými krokmi a ich aktuálnym mapingom do testovacej triedy.
A takto napríklad vyzerá zákazníkom zadefinovaný testovací krok, ktorý ešte nie je namapovaný do testovacej triedy:
… a toto sa vypíše do konzoly pre ešte nenamapovaný krok po spustení testu. Pekné však?
Given a calculator2 (PENDING)
@Given(“a calculator2”)
@Pending
public void givenACalculator2() {
// PENDING
}
2. Namapovanie krokov z user story do kódu a 3. nakonfigurovanie testu
package com.rhe.jbehave.demo; import java.util.Arrays; import java.util.List; import org.jbehave.core.*; import org.junit.Assert; import org.junit.Test; public class JBehaveTestCalculator extends JUnitStories { private Calculator calc; private int result; @Given("a calculator") public void aCalculator() { calc = new Calculator(); } @Given("calculator A-var has value 1") public void setsValueOne() { calc.setiCalcA(1); } @Given("calculator B-var has value 1") public void setsValueTwo() { calc.setiCalcB(1); } @Given("result has value 0") public void setsResult() { this.result = 0; } @When("the user do calculatePlus") public void whenTheUserDoCalculatePlus() { this.result=calc.calculatePlus(); } @Then("the value of result must become 2") public void valueOfCalcPlusMustBecomeTwo() { Assert.assertEquals(2, this.result); } @Override public Configuration configuration() { return new MostUsefulConfiguration().useStoryLoader(new LoadFromClasspath(getClass().getClassLoader())).useStoryReporterBuilder(new StoryReporterBuilder().withFormats(Format.CONSOLE)); } @Override public List<CandidateSteps> candidateSteps() { return new InstanceStepsFactory(configuration(), this).createCandidateSteps(); } @Override protected List<String> storyPaths() { return Arrays.asList("com/rhe/jbehave/demo/calc_value.story"); } @Override @Test public void run() throws Throwable { super.run(); } }
4. Spustenie testu (v Eclipse)
Výstup testu (pri použití useStoryReporterBuilder(new StoryReporterBuilder().withFormats(Format.CONSOLE)):
5. Výsledok testu (pri použití useStoryReporterBuilder(new StoryReporterBuilder().withFormats(Format.HTML))
Detail výsledku testu
Nabudúce si predstavíme „Mockito“ – testovací framework pre Javu.