BDD (programmering)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 20 april 2020; kontroller kräver 4 redigeringar .

BDD (förkortat från engelska  Behaviour-driven development , bokstavligen " utveckling genom beteende ") är en metod för mjukvaruutveckling som är en utlöpare av den testdrivna utvecklingsmetoden (TDD).

Huvudidén med denna metod är kombinationen av rent tekniska intressen och affärsintressen i utvecklingsprocessen, vilket gör att ledningspersonal och programmerare kan tala samma språk. För kommunikation mellan dessa grupper av personal används ett domänspecifikt språk , som är baserat på naturliga språkkonstruktioner som är förståeliga för en icke-specialist, vanligtvis uttrycker beteendet hos en mjukvaruprodukt och förväntade resultat.

Man tror att detta tillvägagångssätt är effektivt när ämnesområdet som mjukvaruprodukten verkar inom beskrivs på ett mycket komplext sätt.

Beskrivning

BDD-metodik är en förlängning av TDD i den meningen att innan du skriver något test måste du först beskriva det önskade resultatet från den tillagda funktionaliteten på ett domänspecifikt språk. Efter att detta är gjort översätts konstruktionerna av detta språk av specialister eller speciell programvara till en testbeskrivning.

BDD fokuserar på följande frågor:

Baserat på dessa frågor kräver BDD att testnamn ska vara hela meningar som börjar med ett verb i konjunktiven och följer affärsmålen. Acceptanstestbeskrivningar bör skrivas på ett flexibelt användarberättelsespråk, t.ex.

Som en [roll av en vars affärsintressen betjänas] vill jag [beskriva funktionaliteten så som den ska fungera] för att [beskriva fördelen].

Acceptanskriterierna ska beskrivas i termer av ett scenario som användaren implementerar för att uppnå resultatet.

Principer för BDD

Som redan nämnts måste tester för en mjukvara beskrivas i termer av det önskade beteendet hos den programmerbara enheten. Önskat beteende avser här ett som är av värde för verksamheten. Beskrivningen av det önskade beteendet ges med hjälp av en beteendespecifikation . 

Beteendespecifikationen är konstruerad i en semi-formell form. För närvarande har följande struktur etablerats i praktiken av BDD:

  1. Titel ( eng.  Titel ). I konjunktivform bör en beskrivning av affärsändamålet ges.
  2. Beskrivning ( Engelsk  narrativ ). I en kort och fri form bör följande frågor avslöjas:
    1. Vem är den här berättelsens intressent;
    2. Vad ingår i denna berättelse?
    3. Vilket värde ger den här historien för verksamheten.
  3. Scenarios ( eng.  Scenarios ). Det kan finnas ett eller flera scenarier i en specifikation, som var och en avslöjar en av situationerna för användarbeteende, och därigenom konkretiserar beskrivningen av specifikationen. Varje scenario är vanligtvis byggt enligt samma mönster:
    1. Initiala villkor (ett eller flera);
    2. Händelsen som utlöser starten av det här skriptet;
    3. Förväntat resultat eller resultat.

BDD tillhandahåller inga formella regler, men insisterar på att en begränsad standarduppsättning fraser ska användas som skulle inkludera alla delar av en beteendespecifikation. 2007 föreslog Dan North en specifikationsmall som blev populär och blev känd som Gherkin- språket [1] [2] .

De grundläggande fraserna i Gherkin-språket presenteras i följande tabell.

gurka språk
Nyckelord på engelska anpassning till ryska språket Beskrivning
Berättelse
( Feature [3] )
Berättelse Varje ny specifikation börjar med detta nyckelord följt av ett kolon i konjunktivformen av berättelsens namn.
Som en Hur (i en roll) Rollen för den person i affärsmodellen som är intresserad av denna funktionalitet.
För att Att uppnå Kortfattat, vad är personens mål.
jag vill jag vill Beskriv kort slutresultatet.
Scenario Scenario Varje scenario av en berättelse börjar med detta ord, varefter målet för scenariot skrivs i konjunktiv form, åtskilda av ett kolon. Om det finns flera scenarier i en berättelse, bör dess ordningsnummer skrivas efter nyckelordet.
Given Given Initialtillstånd. Om det finns flera initiala villkor läggs varje nytt villkor till från en ny rad med hjälp av nyckelordet And.
När När ( obs : något händer) Händelsen som utlöser det här skriptet. Om händelsen inte kan avslöjas i en mening, avslöjas alla efterföljande detaljer genom nyckelorden Och och Men.
Sedan Sedan Resultatet som användaren så småningom bör observera. Om resultatet inte kan avslöjas i en mening, avslöjas alla efterföljande detaljer genom nyckelorden Och och Men.
Och Och Hjälpord, analog till konjunktion .
Men Men Hjälpord, analog till negation .

Följande exempel visar en beteendespecifikation som använder Gherkin-språket.

Berättelse: Returer går till lager Som butiksägare För att hålla koll på lagret vill jag lägga tillbaka varor i lager när de returneras. Scenario 1 : Återbetalade varor ska returneras till lager med tanke på att en kund tidigare köpt en svart tröja av mig Och jag har tre svarta tröjor i lager. När de lämnar tillbaka den svarta tröjan för återbetalning borde jag ha fyra svarta tröjor i lager. Scenario 2 : Ersatta artiklar bör returneras till lager Med tanke på att en kund tidigare köpt ett blått plagg av mig Och jag har två blå plagg i lager Och tre svarta plagg i lager. När de lämnar tillbaka det blå plagget för ersättning i svart borde jag ha tre blå plagg i lager Och två svarta plagg i lager. Historik: Returnerad vara måste förvaras i lager Som butiksägare För att hålla reda på varulagret i lagret vill jag återställa register över varor som returneras till lagret. Scenario 1 : Returnerade varor måste läggas i lager Med tanke på att en kund tidigare köpt en svart tröja av mig OCH jag redan har tre identiska i lager. När kunden returnerar den köpta tröjan Då ska jag se att det nu finns 4 svarta tröjor i lager. Scenario 2 : Ersatta artiklar måste returneras till lagret Med tanke på att en kund köpt ett blått plagg av mig OCH jag har två av dessa artiklar i blått OCH tre artiklar i svart på mitt lager. När en kund returnerar ett blått plagg som ska ersättas med ett liknande men svart Då ska jag se att det nu finns tre artiklar i lager för det blå plagget OCH två artiklar för det svarta plagget.

Sätt att implementera BDD-konceptet

Det semiformella beteendespecifikationsformatet kräver användning av en begränsad uppsättning förslag som ledningspersonal och utvecklare måste komma överens om i förväg. Baserat på detta byggs ramverk för att stödja BDD enligt följande principer:

Ramverk som JBehave och RBehave, som är baserade på Gherkin-språket, bygger på denna princip. Vissa ramverk är byggda på liknande sätt, som CBehave och Cucumber.

Implementering med JBehave-exempel

Anta att vi utvecklar en motor för spelet "Life" och vi behöver lägga till möjligheten att initialt placera levande celler på fältet. Anta att när användaren väljer någon ledig punkt i fältet, visas en levande cell på den. Om användaren väljer en fältpunkt som redan är upptagen av en cell, försvinner cellen och fältpunkten blir ledig. Fältkoordinaterna anges i formatet (x,y), där x är det horisontella punktnumret och y är det vertikala punktnumret. Referenspunkten för båda koordinaterna börjar från det övre vänstra hörnet, från en.

Om vi ​​för enkelhets skull utelämnar beskrivningen av beteendespecifikationen kan vi skriva ett sådant skript i Gherkin.

Givet ett 5 gånger 5 spel När jag växlar cellen vid ( 3 , 4 ) ska rutnätet se ut som ..... ..... ..... ..X.. ..... När jag växla cellen vid ( 3 , 5 ) ska rutnätet se ut som ..... ..... ..... ..X.. ..X.. När jag växlar cellen vid ( 3 , 4 ) ) ska rutnätet se ut som ..... ..... ..... ..... ..X..

JBehave-ramverket är skrivet i Java, så tester översätts till Java-kod. För JBehave-ramverket skickas detta skript som en vanlig textfil, som läses rad för rad. Allt en utvecklare behöver är att tillhandahålla funktioner som JBehave ska anropa när den hoppar till nästa rad. Till exempel kan en testimplementering se ut så här:

privat spelspel ; _ privat StringRenderer ; _ @Given ( "ett $width by $height-spel" ) public void theGameIsRunning ( int width , int height ) { game = new Game ( width , height ); renderer = new StringRenderer (); spel . setObserver ( renderare ); } @When ( "Jag växlar cellen vid ($column, $row)" ) public void iToggleTheCellAt ( int kolumn , int rad ) { game . toggleCellAt ( kolumn , rad ); } @Then ( "rutnätet ska se ut som $grid" ) public void theGridShouldLookLike ( String grid ) { assertThat ( renderer . asString (), equalTo ( grid )); }

För att entydigt mappa en funktion till ett Gherkin-förslag används Java-kommentarer, som tillhandahålls av JBehave-ramverket. Till exempel när motorns parser når någon av meningarna som

När jag växlar cellen vid (n, n)

JBehave-motorn kommer att beräkna från anteckningen att metoden måste anropas

void iToggleTheCellAt ( int kolumn , int rad )

dessutom är anteckningen skriven på ett sådant sätt att motorn "förstår" att vissa delar av meningen måste fångas och skickas till funktionen som input (i detta exempel är dessa koordinaterna för fältpunkten). Därefter anropar funktionen funktionerna i själva "Life"-spelet, och utvecklaren kontrollerar spelmotorns beteende med de vanliga TDD-verktygen.

Exempel på BDD-ramverk

C/C++
  • Fånga
  • CBete sig
rubin
  • Ruppför sig
  • rspec
Pytonorm .NETTO
  • NBete sig
  • MSpec/Machine.Specifications
  • Specflöde
  • Ättiksgurka
  • Concordion.NET
  • fspec
  • naturspec
  • tickspec
  • underspec
Java
  • Juppför dig
  • Jnario
  • JGiven
  • Vividus Framework
JavaScript / TypeScript
  • Jasmin
Lua
  • Avslöjad
Perl
  • Test::BDD::Gurka [8]
  • Test::Gurka::Tiny [9]
  • Test::Cukes [10]
  • Test::Pcuke [11]
PHP
  • Behat
  • Meddeception
  • Gingko
1C
  • Vanessa automationsdriven utveckling
Cross-platform
  • Gurka
  • squish
  • Yulup

Litteratur

  • Carlos Solis , Xiaofeng Wang. Översikt över BDD-konceptet  (engelska)  = A Study of the Characteristics of Behavior Driven Development // IEEE 2011 37:e EUROMICRO-konferensen om mjukvaruteknik och avancerade applikationer: en samling. - Uleåborg, Finland, 2011. - 3 november. - s. 383-387 . — ISBN 978-1-4577-1027-8 . — ISSN 1089-6503 . - doi : 10.1109/SEAA.2011.76 .

Anteckningar

  1. Norr .
  2. Strängt taget är Gherkin ett beteendespecifikationsspråk för Cucumbers BDD-ramverk, men på grund av detta ramverks popularitet kallas allt som liknar denna specifikation Gherkin.
  3. Gurka. Gherkin Referens .
  4. Bete sig dokumentation . MetaCPAN (26 februari 2019). Hämtad 26 februari 2019. Arkiverad från originalet 26 februari 2019.
  5. Ramverk för salladspython bdd . MetaCPAN (26 februari 2019). Hämtad 26 februari 2019. Arkiverad från originalet 1 november 2020.
  6. Rädisa ramverk - python bdd ramverk . MetaCPAN (26 februari 2019). Hämtad 26 februari 2019. Arkiverad från originalet 26 februari 2019.
  7. Robot ramverk - python bdd ramverk . MetaCPAN (26 februari 2019). Hämtad 26 februari 2019. Arkiverad från originalet 27 februari 2019.
  8. Testa::BDD::Gurka - Funktionsfullständig testning av gurkaliknande i Perl . MetaCPAN (21 april 2018). Hämtad 1 november 2018. Arkiverad från originalet 1 november 2018.
  9. Test::Gurka::Tiny - Testning av gurka i perl . MetaCPAN (14 februari 2014). Hämtad 1 november 2018. Arkiverad från originalet 1 november 2018.
  10. Test::Cukes - Ett BBD-testverktyg inspirerat av Cucumber . MetaCPAN (12 december 2010). Hämtad 1 november 2018. Arkiverad från originalet 1 november 2018.
  11. Test::Pcuke::Manual - är en protomanual för Test::Pcuke-paketet . MetaCPAN (3 december 2011). Hämtad 1 november 2018. Arkiverad från originalet 1 november 2018.

Länkar

  • Bellware, Scott. Beteendedriven utveckling  . www.codemag.com _ Tillträdesdatum: 24 september 2018.
  • Tharayil, Ranjith. Beteendedriven utveckling : Förenkla det komplexa problemutrymmet  . www.solutionsiq.com (4 april 2018). Tillträdesdatum: 24 september 2018.
  • Norr, Dan. Vi presenterar RBehave  . dannorth.net (17 juni 2007). Tillträdesdatum: 24 september 2018.
  • Gherkin Reference  (engelska)  (länk ej tillgänglig) . docs.cucumber.io _ Hämtad 25 september 2018. Arkiverad från originalet 9 februari 2019.