Tänapäeva programmeerijad kasutavad oma igapäevatöös üha enam agiilset praktikat. Isegi standardset tarkvaraarenduse elutsüklit järgivad projektid võivad nende kohandamisest kasu saada. Automaatne testimine ja TDD tõid meie töösse rohkem kindlustunnet, hõlbustasid olemasolevate funktsioonide muudatuste rakendamist ja viisid meid sageli parema koodidisaini juurde. Kuid nüüd ei piisa sellest. Me peame testidest saadava kasu piirini välja ajama ja BDD võimaldab seda. BDD tugineb TDD-le ja lisab selle tavadele palju väärtust. See toob projektile igakülgse keele, võimaldab paremat suhtlust kliendi ja arendajate vahel. See pakub palju projektijuhtidele ja -juhtidele, kuid teeb ka arendaja elu palju lihtsamaks. BDD põhimõtete järgimine annab meile selged nõuded, testid on kergemini mõistetavad ja need võivad olla dokumentatsiooniks. BDD nihutab testimise teemade fookust ja annab meile kindlustunde, et me testime seda, mida peaksime testima - käitumist.
Kui kasutate TDD-d, on BDD-ga alustamine lihtne - see on põhimõtteliselt selle parimate tavade kogum. BDD-l on hulk lihtsaid reegleid, mis ütlevad, kuidas kirjutada spetsifikatsioone ja mida testida. Spetsifikatsioonid on jagatud kolmeks osaks: Given (testitingimuste seadmine), When (tegevuse kutsumine subjektile) ja Then (väited). Testidel peaksid olema kirjeldavad nimed ja olemasolevad testimisraamistikud võimaldavad kasutada meetodeid ja väiteid, mis sarnanevad loomulikule keelele - kõik see kokku annab meile testid, mis on loetavad nii tehnilistele kui ka mitte-tehnilistele kasutajatele. Head nimetamiskonventsioonid osutuvad kasulikuks regressioonitestide ajal.
BDD sisaldab ka suuniseid testitavate isikute jaoks. Erinevalt TDD-st nihutab see fookuse rakendamise testimisest käitumise testimisele - ja selle kasutamine viib parema disaini ja annab suurema paindlikkuse, kui tuleb teha muudatusi. Spetsifikaadid peaksid olema nagu kirjalikud ja täidetavad kliendi nõuded - kõrgtasemelised peaksid toimima vastuvõtutestidena. Eesmärk on kirjutada testid nii, et neid oleks vaja muuta ainult siis, kui nõuded muutuvad. BDD kasutamine annab meile kindluse, et me testime seda, mida tegelikult vaja katta, ja see on pragmaatilisem lähenemine kui TDD.
Kui soovite näha BDD-d praktikas, siis soovitame Ruby't. See on võimas ja lõbus keel ning sellel on suurepärane BDD tööriistakomplekt.
Kurgi
Cucumber on kõige populaarsem raamistik BDD jaoks Ruby's. See tutvustab spetsiaalset keelt nimega Gherkin, milles te kirjutate oma testid. Erinevalt RSpecist on Gherkinis kirjeldatud funktsioonid tavaline tekst, mitte koodning sellisena võib ja peaks seda mõistma igaüks, eelkõige klient.
Cucumberi funktsioon näeb välja selline (näide võetud Cucumberi wikist):
Funktsioon: Mõni lühike, kuid kirjeldav tekst selle kohta, mida soovitakse.
Selle funktsiooni ärilise väärtuse tekstiline kirjeldus.
Ärieeskirjad, mis reguleerivad funktsiooni ulatust
Mis tahes lisateave, mis muudab funktsiooni arusaadavamaks.
Stsenaarium: Mingi määratletav ärisituatsioon
Arvestades mõnda eeltingimust
Ja mõni muu eeltingimus
Kui toimija mingi tegevus
Ja mingi muu tegevus
Ja veel üks tegevus
Siis saavutatakse mingi kontrollitav tulemus
Ja juhtub ka midagi muud, mida me saame kontrollida
Stsenaarium: Teistsugune olukord
...
Funktsioone kirjeldatakse üksikasjalikult hiljem.
Kurgi kasutamine Ruby on Railss
Paigaldamine
Esimene samm, et kasutada kurki oma projekt on selle paigaldamine. Lihtsalt lisage need kaks pärlit oma Gemfile'i:
rühm :test do
gem 'cucumber-rails', :require => false
gem 'database_cleaner'
end
Koondage need, käivitades komplekti paigaldaminening genereeri Cucumberi skriptid ja kataloogid järgmise käsuga:
rails generate cucumber:install
See loob config/cucumber.yml, script/cucumber ja funktsioonid/ kataloog, mis sisaldab .feature failid, samuti sammude määratlused ja toetavad failid. Funktsioonide käivitamiseks kasutage uut rake käsku:
kurgi harali
Omadused
Vaatame lähemalt funktsioone. Funktsioon on midagi, mis teie rakendusel on või mida see teeb - näiteks saadab perioodiliselt uudiskirju või võimaldab kasutajal oma fotosid avalikult jagada. Üks funktsioon koosneb mitmest stsenaariumist, mis kirjeldab, kuidas see funktsioon erinevates kontekstides töötab.
Cucumber'i põhilise kasutamise demonstreerimiseks Railsis kirjutame funktsiooni nullist. See näitefunktsioon on esimene, mille kirjutame rakenduses, mida näidatakse selle artikli tulevas teises osas. See rakendus võimaldab kasutajal luua esemeid ja kauplusi (kauplused müüvad esemeid) ning seejärel luua ostunimekirju.
Kõige lihtsamas versioonis näitab rakendus pärast ostunimekirja koostamist, millistes kauplustes on kasutaja soovitud kaubad kõige odavamad.
Kõigepealt looge uus fail nimega create_item.feature aastal funktsioonid/ kataloogi. Üleval on .feature faili on olemas Funktsioon märksõna, millele järgneb selle lühikirjeldus. Näiteks:
Funktsioon: Esemete loomine
Järgnevatel ridadel saate kirjutada ärieesmärgi, mis rakendab seda funktsiooni. Kuna Cucumber ignoreerib enne esimest Scenario't kirjutatud teksti, ei ole vaja midagi kirjutada, kuid see on kindlasti hea mõte.
Selleks, et hõlpsasti luua ostunimekirju lähedalasuvates kauplustes müüdavate kaupadega.
Kasutajana
Soovin lisada süsteemi kaupu
Väljalõikes näete eespool üsna populaarset mustrit, millega saab kirjeldada ärieesmärke. See koosneb kolmest osast: miks on funktsioon vajalik, kes seda tahab ja mis see on. Loomulikult ei pea te seda formaati järgima, kuid lisage kindlasti oma kirjeldusse vastused nendele kolmele küsimusele.
Stsenaariumid
Seejärel kirjutame mõned stsenaariumid. Iga stsenaarium algab märksõnaga "Scenario" ja sisaldab mitu sammu.
Stsenaarium: unikaalse eseme loomine
Arvestades, et on olemas kirje "Milk".
Kui ma lähen pealehele
Ja ma loen kirje "Leib"
Siis näen "Leiba" esemete nimekirjas.
Seega, kui keegi on loonud elemendi nimega Piim, siis on võimalik luua Leib ja selle tulemusel ilmub Leib elemendi loendisse. Me ei peaks testima andmebaasi kirje loomist, kuna sellel faktil ei ole kliendi jaoks tegelikku väärtust.
Stsenaariumi sammud kasutavad kolme peamist märksõna:
Antud, et anda stsenaariumile konteksti
Kui, tegevuste kirjeldamiseks
Siis, tulemuste kirjeldamiseks
Oluline on märkida, et Cucumber ignoreerib märksõna sammu, millega ta alustab, ja vastab ainult hilisemale osale. Seega võite oma samme alustada sõnaga "And", kus iganes see tundub loomulik. Ainus reegel õige võtmesõna valimiseks on, et Stsenaarium peab olema kergesti arusaadav.
Etappide määratlused
Cucumber'i käivitamine annab nüüd järgmise tulemuse:
[...]
Funktsioon: Esemete loomine
Selleks, et hõlpsasti luua ostunimekirju lähedalasuvates kauplustes müüdavate esemetega
Kasutajana
Soovin lisada süsteemi esemeid
Stsenaarium: unikaalse eseme loomine # features/create_item.feature:6
Antud on "Milk" Item # features/create_item.feature:7
Määratlemata samm: "on olemas kirje "Milk" Item" (Cucumber::Undefined)
[...]
Seda seetõttu, et Cucumber ei tea, mida me mõtleme, kui me ütleme "on olemas Milk Item". Et lisada oma sammudele mingi tähendus, tuleb need defineerida dokumendis step_definitions kataloogi.
Soovitatav viis oma sammude määratluste korrastamiseks on jagada need domeeni järgi. Näiteks enamik meie loodud sammudest kuulub Item-domeeni. Seega peaksime looma faili nimega step_definitions/item_steps.rb ja paigutage sinna järgmine kood:
Arvestades "on olemas "$name" Item" do |nimi|
Fabricate :item, name: name
end
Kui "ma loome "$name" eseme" do |nimi|
jooksul "#new_item" do
fill_in "nimi", koos: nimi
click_on "Create"
end
end
Then "Ma näen "$name" objektide nimekirjas" do |name|
within ".items" do
expect(page).to have_content name
end
end
Sammude määratlused põhinevad tavaliselt Capybaral. Kui te ei ole Capybaraga tuttav, vaadake kindlasti käesoleva artikli lõpus olevaid linke.
On veel üks samm, mis vajab määratlemist ja see ei mahu tegelikult punktide hulka. Selle võiks panna sisse main_page_steps.rb:
Kui "ma lähen pealehele" ei
külastada root_path
end
Kokkuvõte
See on väga lihtne lugu väga lihtsa funktsiooni jaoks. Selle eesmärk oli demonstreerida BDD põhimõisteid, nagu neid kasutatakse Cucumberis. Heade lugude kirjutamine nõuab siiski veidi rohkem. Arendajana peate oma mõtteviisi täielikult muutma - unustage rakendamine ja keskenduge selle asemel ärieesmärkidele. Cucumber teeb selle ülemineku lihtsamaks oma nutika lihtkirjalugude kasutamise abil.