Nykypäivän ohjelmoijat käyttävät yhä enemmän ketteriä käytäntöjä jokapäiväisessä työssään. Jopa tavanomaista ohjelmistokehityksen elinkaarta noudattavat hankkeet voivat hyötyä niiden mukauttamisesta. Automaattinen testaus ja TDD toivat lisää luottamusta työhömme, helpottivat muutosten tekemistä olemassa oleviin ominaisuuksiin ja johtivat usein parempaan koodisuunnitteluun. Mutta nyt se ei enää riitä. Meidän on vietävä testeistä saatavat hyödyt äärirajoille, ja BDD mahdollistaa sen. BDD rakentuu TDD:n päälle ja tuo sen käytäntöihin paljon lisäarvoa. Se tuo projektiin kaikkialla käytettävän kielen, mahdollistaa paremman viestinnän asiakkaan ja kehittäjien välillä. Se tarjoaa paljon projektipäälliköille ja -johtajille, mutta tekee myös kehittäjän elämästä paljon helpompaa. BDD-periaatteiden noudattaminen antaa meille selkeät vaatimukset, testit ovat helpommin ymmärrettävissä ja ne voivat toimia dokumentaationa. BDD siirtää testauskohteiden painopistettä ja antaa meille varmuuden siitä, että testaamme sitä, mitä meidän pitäisi testata - käyttäytymistä.
Jos käytät TDD:tä, BDD:n aloittaminen on helppoa - se on periaatteessa joukko parhaita käytäntöjä sitä varten. BDD:ssä on joukko yksinkertaisia sääntöjä, jotka kertovat, miten speksit kirjoitetaan ja mitä testataan. Spesifikaatiot jaetaan kolmeen osaan: Given (testausehtojen asettaminen), When (toiminnan käynnistäminen kohteessa) ja Then (väitteet). Testeillä pitäisi olla kuvaavat nimet, ja nykyiset testikehykset mahdollistavat luonnollisen kielen kaltaisten menetelmien ja väitteiden käytön - kaikki tämä yhdessä antaa testejä, jotka ovat luettavissa sekä teknisille että ei-teknisille käyttäjille. Hyvistä nimeämiskäytännöistä on hyötyä regressiotesteissä.
BDD:n mukana tulee myös joukko ohjeita testattaville. Toisin kuin TDD:ssä, siinä keskitytään toteutuksen testaamisesta käyttäytymisen testaamiseen - ja sen käyttäminen johtaa parempaan suunnitteluun ja antaa enemmän joustavuutta, kun muutoksia on tehtävä. Teknisten eritelmien pitäisi olla kuin kirjalliset ja toteutettavissa olevat asiakasvaatimukset - korkean tason eritelmien pitäisi toimia hyväksymistesteinä. Tavoitteena on kirjoittaa testit siten, että niitä tarvitsee muuttaa vain silloin, kun vaatimukset muuttuvat. BDD:n käyttö antaa varmuuden siitä, että testaamme sitä, mitä todella on testattava, ja se on TDD:tä pragmaattisempi lähestymistapa.
Jos haluat nähdä BDD:n toiminnassa, suosittelemme Rubya. Se on tehokas ja hauska kieli, ja siinä on erinomainen BDD-työkalupaketti.
Kurkku
Cucumber on suosituin kehys BDD:n toteuttamiseen Rubyssä. Se esittelee erityisen Gherkin-nimisen kielen, jolla kirjoitat testisi. Toisin kuin RSpecissä, Gherkinissä kuvatut ominaisuudet ovat pelkkää tekstiä, eivät ole koodi, ja sellaisenaan se on - ja sen pitäisi olla - kaikkien, erityisesti asiakkaan, ymmärrettävissä.
Cucumber-ominaisuus näyttää tältä (esimerkki otettu Cucumber wikistä):
Ominaisuus: Tiivis mutta kuvaava teksti siitä, mitä halutaan.
Tekstimuotoinen kuvaus tämän ominaisuuden liiketoiminnallisesta arvosta.
Ominaisuuden laajuutta säätelevät liiketoimintasäännöt
Mahdolliset lisätiedot, jotka helpottavat ominaisuuden ymmärtämistä.
Skenaario: Jokin määriteltävissä oleva liiketoimintatilanne
Annetaan jokin ennakkoehto
Ja jokin muu ennakkoehto
Kun toimijan jokin toiminta
Ja jokin muu toiminta
Ja vielä jokin muu toiminta
Silloin saavutetaan jokin testattava tulos
Ja jotain muuta, mitä voimme tarkistaa, tapahtuu myös
Skenaario: Erilainen tilanne
...
Ominaisuudet kuvataan yksityiskohtaisesti myöhemmin.
Kurkun käyttö Ruby on Rails:ssä
Asennus
Ensimmäinen askel käyttää kurkkua teidän projekti asentaa sen. Lisää vain nämä kaksi helmiä Gemfileen:
ryhmä :test do
gem 'cucumber-rails', :require => false
gem 'database_cleaner'
end
Niputa ne ajamalla nipun asennusja luo Cucumber-skriptit ja -hakemistot seuraavalla komennolla:
rails tuottaa cucumber:install
Tämä luo config/cucumber.yml, script/cucumber ja ominaisuudet/ hakemisto, joka sisältää .feature tiedostot sekä vaiheiden määritelmät ja tukitiedostot. Voit ajaa ominaisuuksiasi käyttämällä uutta rake-komentoa:
haravoi kurkkua
Ominaisuudet
Katsotaanpa tarkemmin ominaisuuksia. Ominaisuus on jotain, mitä sovelluksellasi on tai mitä se tekee - esimerkiksi lähettää säännöllisesti uutiskirjeitä tai antaa käyttäjän jakaa valokuviaan julkisesti. Yksi ominaisuus koostuu useista skenaarioista, jotka kuvaavat, miten kyseinen ominaisuus toimii eri yhteyksissä.
Osoittaaksemme Cucumberin peruskäytön Railsissa kirjoitamme ominaisuuden tyhjästä. Tämä esimerkkiominaisuus on ensimmäinen, jonka kirjoitamme sovellukseen, joka esitellään tämän artikkelin tulevassa toisessa osassa. Tämän sovelluksen avulla käyttäjä voi luoda tuotteita ja kauppoja (kaupat myyvät tuotteita) ja sitten luoda ostoslistoja.
Yksinkertaisimmassa versiossa sovellus näyttää ostoslistan laatimisen jälkeen, missä kaupoissa käyttäjän haluamat tuotteet ovat halvimpia.
Luo ensin uusi tiedosto nimeltä create_item.feature vuonna ominaisuudet/ hakemisto. Yläosassa .feature tiedostossa on Ominaisuus avainsana, jota seuraa lyhyt kuvaus siitä. Esimerkiksi:
Ominaisuus: Kohteiden luominen
Seuraavilla riveillä voit kirjoittaa liiketoimintatavoitteen, jolla tämä ominaisuus toteutetaan. Koska Cucumber jättää huomiotta ennen ensimmäistä skenaariota kirjoitetun tekstin, ei ole välttämätöntä kirjoittaa mitään, mutta se on ehdottomasti hyvä idea.
Jotta voit helposti luoda ostoslistoja, joissa on lähellä sijaitsevissa kaupoissa myytäviä tuotteita.
Käyttäjänä
Haluan lisätä tuotteita järjestelmään
Pätkässä näet yllä melko suositun mallin, jolla voit kuvata liiketoiminnan tavoitteita. Se koostuu kolmesta osasta: miksi ominaisuus on tarpeellinen, kuka sen haluaa ja mitä se on. Sinun ei tietenkään tarvitse noudattaa tätä kaavaa, mutta muista sisällyttää kuvaukseesi vastaukset näihin kolmeen kysymykseen.
Skenaariot
Seuraavaksi kirjoitamme muutamia skenaarioita. Jokainen skenaario alkaa avainsanalla "Scenario" ja sisältää useita vaiheita.
Skenaario: ainutlaatuisen kohteen luominen
Annetaan, että on olemassa tuote "Maito".
Kun menen pääsivulle
Ja luon "Leipä"-kohteen
Sitten näen "Leipä" tuotteen luettelossa.
Jos siis joku on luonut Tuotteen nimeltä Maito, on myös Leivän luominen mahdollista, ja sen seurauksena Leipä ilmestyy Tuotteiden luetteloon. Meidän ei pitäisi testata tietueen luomista tietokantaan, koska tällä seikalla ei ole todellista arvoa asiakkaalle.
Skenaarion vaiheissa käytetään kolmea tärkeintä avainsanaa:
Annettu, jotta skenaariolle voidaan antaa konteksti
Kun, toimien kuvaamiseen
Sitten, tulosten kuvaamiseksi
On tärkeää huomata, että Cucumber ei huomioi avainsanavaihetta, jolla se alkaa, ja vastaa vain myöhempää osaa. Voit siis aloittaa askeleesi sanalla "And" missä tahansa, missä se tuntuu luontevalta. Ainoa sääntö oikean avainsanan valinnassa on, että skenaarion on oltava helposti ymmärrettävä.
Vaiheen määritelmät
Cucumberin suorittaminen tuottaa nyt tämän tulosteen:
[...]
Ominaisuus: Kohteiden luominen
Jotta voit helposti luoda ostoslistoja, joissa on lähistöllä sijaitsevissa kaupoissa myytyjä esineitä
Käyttäjänä
Haluan lisätä tuotteita järjestelmään
Skenaario: ainutlaatuisen kohteen luominen # features/create_item.feature:6
On olemassa tuote "Maito" # features/create_item.feature:7.
Määrittelemätön vaihe: "on olemassa "Milk" Item" (Cucumber::Undefined)
[...]
Tämä johtuu siitä, että Cucumber ei tiedä, mitä tarkoitamme, kun sanomme "on olemassa Milk Item". Jos haluat lisätä askeleillesi merkityksen, sinun on määriteltävä ne kohdassa step_definitions hakemisto.
Suositeltava tapa järjestää askelmääritykset on jakaa ne toimialueen mukaan. Esimerkiksi suurin osa luomistamme vaiheista kuuluu Item-toimialueeseen. Näin ollen meidän pitäisi luoda tiedosto nimeltä step_definitions/item_steps.rb ja sijoita seuraava koodi sinne:
Koska "on olemassa "$name" kohde" do |name|
Fabricate :item, name: name
end
Kun "luon "$name"-esineen" do |name|
sisällä "#new_item" do
fill_in "Nimi", with: nimi
click_on "Create"
end
end
Then "Näen "$name" nimikeluettelossa" do |name|
sisällä ".items" do
expect(page).to have_content nimi
end
end
Vaiheiden määritelmät perustuvat yleensä Capybaraan. Jos Capybara ei ole sinulle tuttu, tutustu tämän artikkelin lopussa oleviin linkkeihin.
On vielä yksi vaihe, joka on määriteltävä, eikä se oikein sovi Item steps -vaiheisiin. Se voitaisiin sijoittaa main_page_steps.rb:
Kun "siirryn pääsivulle", onko
käy juuripolulla
end
Päätelmä
Tämä on hyvin yksinkertainen tarina hyvin yksinkertaisesta ominaisuudesta. Sen tarkoituksena oli havainnollistaa BDD:n keskeisiä käsitteitä, kuten niitä käytetään Cucumberissa. Hyvien tarinoiden kirjoittaminen vaatii kuitenkin hieman enemmän. Kehittäjänä sinun on muutettava ajattelutapasi täysin - unohda toteutus ja keskity sen sijaan liiketoiminnallisiin tavoitteisiin. Cucumber helpottaa tätä siirtymää käyttämällä fiksusti tavallisen tekstin tarinoita.
Lähteitä, inspiraatiota ja mielenkiintoista luettavaa: