Chtěl jsem to napsat už u toho popisu u Clojure. Kdysi jsem si Gherkin v rámci kurzu Ruby zkoušel (docela dost, byly to desítky testů) a i když to na první pohled vypadá bombasticky, nejsem si jist, že všechna ta práce kolem navíc vyváží zlepšenou čitelnost pro laiky. Testy stejně většinou píší programátoři a není problém je uvést scénářem. Výsledek je velice podobný, pokud se dodrží určitá kultura. Osobně dávám přednost stručným table testům, tak jak se používají v Go. Když se udělají dobře, jsou jednoduché a přehledné. Nakonec i jednoduché BDD frameworky ve stylu Jasmine/Mocha jsou docela přehledné. A to, že se Gherkin příliš nerozšířil, to podle mne jen potvrzuje.
Ono asi záleží na konkrétním jazyku. Ruby u nás prakticky nepoužíváme, tak nevím, ale třeba pro Javu je Gherkin/Cucumber mnohem lepší, než se snažit lidem s doménovou znalostí nacpat přímo zdrojáky s testy. Protože ti lidi Javu znají maximálně tak že ji brali na škole v jednom semestru.
To se bavím hlavně o backendu, frontend jde bohudík ḿimo mě :-) Ale mrknul jsem na ten Mocha a i když JS znám, tak je to stále dost nečitelný (z wiki):
var assert = require("assert") describe('Foo', function(){ describe('#getBar(value)', function(){ it('should return 100 when value is negative') // placeholder it('should return 0 when value is positive', function(){ assert.equal(0, Foo.getBar(10)); }) }) })
U Cucumberu, pardon Gherkinu je pěkný i to, že když už test spadne, je přesně jasnej řádek, takže to dohledá i associate QA a dokáže se zorientovat co a jak.
řekl bych, že strašně záleží na konkrétním způsobu použití. Pokud je celý tým a projekt konzistentní, tedy psaný v jednom nebo dvou jazycích (dva pro typickou webovku), tak nemusí být výhoda DSL tak zřejmá. Ve chvíli, kdy je to projekt založený na mikroslužbách (a třeba u nás je každá psaná v něčem jiném), tak to integrovat přes DSL, třeba zrovna přes Gherkin, mi připadne jako fajn řešení. Ale možná je to tím, že mám rád dobře navržené DSL a Gherkin do této skupiny IMHO patří :-)
Gherkin se prave snazi bojovat se situaci kdy vetsinu testu pisi programatori, cilem je umoznit sirsimu osazestvu definovat testy, precist si co za testy existuje a vymyslet co neni pokryto atd. Zkratka udelat test specifikaci pristupnou vice lidem, napriklad tem co definuji jak by produk mel fungovat v pripade ze nejde o developera.
jj je pravda, že je tam nějaká práce navíc, ale řekl bych, že ve chvíli, kdy je testovaný "stavový prostor" velký, se už ta investice vyplatí. Příkladem může být, když se napíše testovací krok s 2-3 proměnnými; takový krok se klidně v testech může volat 10x-100x, a takovéto testy dokážou napsat i lidi, kteří to nemají v hlavním popisu práce.
U nás je tým rozdělen asi trošku netypicky - jedno QA na cca 15-20 vývojářů (pořád to trošku rotuje :-). A ti vývojáři píšou různé části aplikace: front end, back end, datové pumpy apod., je tam spousta API a celé je to dost složité. Takže role QA je udělat kostru pro BDD, tj. napsat ty jednotlivé kroky. A vývojáři sami jsou potom na základě change requestů schopni rozšířit .features bez nutnosti znát "střeva" kroků. Tady Gherkin udělá svoji práci, protože na .feature dokáže šáhnout jak skalní front-endista, tak i back-endista nebo člobrda se znalostí domény a již řekněme menší znalostí programování :-)
Je pravda ze se hodne pouzivaji na Akceptacni testy, ktere obvykle definuje nekdo jiny nez developer. Ale neznamena to ze nemuzete stejnym spusobem psat unittesty. Oproti unittestum to nema zadnou vyhodu, krome jednoduche citelnosti a toho ze popis/definice testu je i zaklad dokumentace testu a je z nej jasne co je a co neni otestovano (to spousta lidi u unittestu zanedbava).
BDD se používají na jiné úrovni než unit testy a taky je typicky píše někdo jiný z týmu (někdy je upravuje přímo zákazník se znalostí domény). Zatímco unit testy si píšou (ok měli by psát :-) sami vývojáři a jsou součástí běžných změn (v syncu se změnami v kódu), tak BDD scénáře popisují chování systému například na úrovni business logiky.
Ten příklad s add byl blíž k úrovni unit testů (aby se ukázaly základní možnosti jazyka Gherkin), ale názornější budou další příklady založené například na testování REST API nebo web UI se Seleniem. Nebo vůbec obecný popis logiky, který se nijak těsně neváže na kód, ale pouze na očekávané chování.
(tady jsem chtěl napsat příklad, ale byl - nevím proč - vyhodnocen jako spam a nějak jsem nezjistil, které slovo vadí :/)
Pěkně je důvod vzniku BDD popsán přímo na Wikipedii:
https://en.wikipedia.org/wiki/Behavior-driven_development#History