Download - Hello BDD @ WebConf/2013
hello BDDÉn, mint előadóElmondom, hogy miért nagyszerű a BDDÍgy a jelenlévők is megismerhetik azt
Forgatókönyv: sikeres előadás :] Amennyiben elhangzott az előadás És a hallgatók megértik az elhangzottakat Majd hasznosítják azt a mindennapi munkájukban Akkor ezáltal boldogabbak lesznek És örömükben meghívják az előadót 1-2 sörre
Forgatókönyv: sikertelen előadás :[ Amennyiben elhangzott az előadás És a hallgatók unalmukban elaludtak Majd az előadás végén felébrednek Akkor megdobálják az előadót tojással De az biztos, hogy nem hívják meg 1-2 sörre
hello BDDTDD, BDD és sok egyéb xBR
SZÁSZ ZOLTÁNzoltan at szasz.me
@szaszz
/in/zoltanszasz
BEMUTATKOZÁS10+ éve dev bizniszbenÖnjelölt Clean CoderDev & Ops, többnyire DevAgile / Scrum / Kanban / XP
kedvelőTDD & automata teszt hívőSymfony2 fanPHP Meetup alapító & szervező2 gyermek büszke apukája
BUSINESSDRIVEN DEVELOPMENT
VSBEHAVIORDRIVEN DEVELOPMENT
BUSINESSDRIVEN DEVELOPMENT
=BEHAVIORDRIVEN DEVELOPMENT
TÖRTÉNETFELTALÁLÓK
Dan North
Chris Matts
Liz Keogh
@tastapod
@papachrismatts
@lunivore
FELTALÁLTÁKBehavior Driven Development
MEGCSINÁLTÁKRBehave » RSpecJBehave
TESZTELÉS~ISMÉTLÉS A TUDÁS ATYJA~
MIÉRT TESZTELJÜNK?helyességteljességrobusztusságregressziók
kizárásahibák
megelőzésestb.
MI TÖRTÉNIK, HA
NEMTESZTELÜNK?
MIÉRTAUTOMATA TESZTELJÜNK?
úgyis tesztelszmiért csinálnád
kézzel?teszt is lehet
komplexhamar megtérülstb, stb.
TESZT ALAPOKXPminden kód unit teszteltminden kód „átmegy” a unit tesztekena tesztek felfedik a hibákata tesztek gyorsak, és gyakran futnak
+ a tesztek determinisztikusak éskoherensek
a cél továbbra is pontosan ez
TDD1. Írd meg a legegyszerűbb tesztet, és
lásd, hogy úgy fail-el, ahogy vártad2. Teljesítsd a tesztet a
legegyszerűbb kóddal3. Refaktorálj!
Ismételd, a fenti 3 lépést, míg készennem vagy
CLEAN CODESOLID
Egy osztály egy dologért felel Az osztály kiterjeszthető, de nem módosítható
Egy osztály helyett, bármely gyereke használható Ne függj olyantól, amit nem használsz. A logika kis
interface-eknek feleljen meg. A működés (logikai szinten) nem a konkréttól,
csupán az absztrakttól függ (decoupling)
SRPOCPLSPISP
DIP
„TOVÁBB IS VAN! MONDJAM MÉG?” Mindig csak a szükséges dolgokat
implementáld Mindent csak egyszer írj meg Tartsd egyszerűen
Tesztek
YAGNI
DRYKISSFIRST
AJÁNLÓMagyar Attila – Clean Code Orcsik Antal – Objektum orientált mérések a
gyakorlatban Ördög Rafael – Test driven mockery
slide video
slide videoslide video
SZUPER-ZÖLD!AVAGY A
„BETÖRT ABLAK”-ELVÓvakodj a „flaky” teszttől,meg a „skipped” teszttőlés persze az „incomplete” teszttől
is!
BDDALAPOK
FORMÁLIS SPECIFIKÁCIÓüzleti szemléletben már a 60-as
évektőltöbb paradigmatöbb leíró nyelvkötötteknem rugalmasak
INFORMÁLIS SPECIFIKÁCIÓszeretnék egy
olyat...legyen... kék!nem jó kék!nem is!... inkább
piros!
XP SPECIFIKÁCIÓUSER STORY
Felhasználók keresése #title
Mint rendszer adminisztrátor #roleSzeretnék a felhasználók közt keresni #feautreAzért, hogy megnézhessem az adataikat #benefit
ELFOGADÁSI KRITÉRIUMOK• felhasználók kereshetőek név és e-mail cím alapján• lista nézetben látom a nevét, e-mail címét, telefonszámát• lista nézetben a névre kattintva a részletes nézet jelenik meg• részletes nézetben látom minden mentett adatát csoportosítva
BDD SPECIFIKÁCIÓAmi bevált azon miért változtatnánk?
USER STORYFeature: Account Holder withdraws cash #title
As an Account Holder #roleI want to withdraw cash from an ATM #featureSo that I can get money when the bank is closed #benefit
AKKOR MI AZ ÚJ?Scenariók, mint automatán tesztelhető elfogadási
kritériumokScenario: Account has sufficient funds #title Given the account balance is $100 #context And the card is valid #context And the machine contains enough money #context When the Account Holder requests $20 #event Then the ATM should dispense $20 #outcome And the account balance should be $80 #outcome And the card should be returned #outcome
Scenario: Account has insufficient funds Given the account balance is $10 And the card is valid And the machine contains enough money When the Account Holder requests $20 Then the ATM should not dispense any money And the ATM should say there are insufficient funds And the account balance should be $10 And the card should be returned
EZ MÁR AUTOMATA TESZT?NEM! ✱ ✱De jó úton járunk :)
GHERKIN - A NYELVpontosabban DSL (domain specific language)leírja a viselkedést, az implementáció ismerete nélkül„nyakkendősök” is megértik: ügyfél, Product Owner,
Project Manager, Business Analyst, Marketingfejlesztők is megértikkötött szintaxissal, determészetes nyelven írható ( ).feature fileok (user story + scenariók)natívan: Ruby, Java, Js, .Netsok BDD eszköz alap DSL-je (pl: Behat, Behave)
~40 nyelv
USER STORYFEATURE | BUSINESS NEED | ABILITYFeature: Cucumber eating
As a hungry manI want to eat some cucumberSo that I won't be hungry
TESZT ESETSCENARIO (FORGATÓKÖNYV)
Scenario: Eat 5 out of 12 Given there are 12 cucumbers When I eat 5 cucumbers Then I should have 7 cucumbers
LÉPÉSEKGIVEN (AMENNYIBEN|ADOTT)
Given there are 12 cucumbers And 6 potato
#többsoros argumentumokGiven These vegetables are on the table: | vegetable | amount | | cucumber | 12 | | potato | 6 |
WHEN (MAJD|HA|AMIKOR)When I eat 5 cucumbers And 2 potatoes
LÉPÉSEKTHEN (AKKOR)
Then I should have 7 cucumbers And 4 potatoes
AND (ÉS), BUT (DE)Then i see cucumbers And potatoes But i do not see onion
TESZT VÁZLATSCENARIO (OUTLINE | TEMPLATE)
Scenario Outline: Eating Given there are <start> cucumbers When I eat <eat> cucumbers Then I should have <left> cucumbers
Examples: | start | eat | left | | 12 | 5 | 7 | | 20 | 5 | 15 |
ALAPVETÉSBACKGROUND (HÁTTÉR)
Background: Given there are 12 cucumbers
Scenario: Eat 5 out of 12 When I eat 5 cucumbers Then I should have 7 cucumbers
Scenario: Eat 6 out of 12 When I eat 6 cucumbers Then I should have 6 cucumbers
I18NEN
Scenario: Account has sufficient funds Given the account balance is $100 And the card is valid And the machine contains enough money When the Account Holder requests $20 Then the ATM should dispense $20 And the account balance should be $80 And the card should be returned
HU#language: huForgatókönyv: Van elég pénz a számlán Amennyiben a számlaegyenleg $100 És a kártya érvényes És az ATM-ben elegendő pénz van Amikor tulajdonos kivesz $20-t Akkor az ATM kiad $20-t És a számla egyenlege $80 És a kártyát kiadta az ATM
ESZKÖZÖKÉS KERETRENDSZEREK✱
.Net: , , Java: , , JavaScript: , PHP: , Python: , , Ruby: , , Scala: ,
NBehave NSpec ConcordionJBehave Spock Concordion
Jasmine Vows (node.js)Behat PHPUnit Story
Behave Letucce ConcordionRSpec Cucumber ConcordionScalaTest Concordion
✱a nyelvek ABC sorrendben szerepelnek
SCENARIOA teszt metódus nevek legyenek mondatokEgy kifejező teszt név nagyon hasznos, ha failel a
tesztViselkedést definiáljunk, ne tesztet írjunkA követelmény viselkedés isMindennapi (mindenki számára érthető) nyelvenAz elfogadási kritériumok legyenek futtathatókLegyen a story olvasmányosMi lenne ha?
BDD != TDDAVAGY MIT TESZTELJÜNK?
BBD » TDDTDD BDDtest exampleclass under test class we’re describingmethod under test valuable behaviourpassing / behaving working, providing valuefailing / misbehaving should it do what I’ve described?100% coverage Please, come change my code. I
believe I’ve given you enoughinformation to do this safely.
PÉLDÁUL...
SCENARIOScenario: Check generate thumbnails Given I am in a directory "img" And I have an input image "test_1024_768.png" When I create new thumbnails Then newly created thumbnail exists "test_s.png" And newly created thumbnail exists "test_m.png"
KÓD<?php// FileSystemContext extends Behat\Behat\Context\BehatContext;class ThumbnailFeatures extends FileSystemContext{ /** * @Given /̂I am in a directory "([̂""]*)"$/ * @Given /̂I go to a directory "([̂""]*)"$/ */ public function changeDirTo($directory) {}
/** * @Given /̂I have an input image "([̂""]*)"$/ */ public function readFile($file) {}
KÓD/** * @When /̂I create new thumbnails$/ */ public function createThumbnails() {}
/** * @Then /̂newly created thumbnail exists "([̂""]*)"$/ * @Then /̂file exists "([̂""]*)"$/ */ public function fileExists($file) {}}
SHAMELESS SELF PROMO
KÉRDÉSEK?Szász Zoltán
zoltan at szasz.me
@szaszz
/in/zoltanszasz
READ_IT_LATER.TXT
BusinessBehavior@tastapod @papachrismatts @lunivoreXP teszt alapokKent Beck - Extreme Programming
ExplainedTDDSOLIDSRP: Single Responsibility Principle
READ_MORE_LATER.TXTOCP: Open Closed PrincipleLSP Liskov Substitution PrincipleISP: Interface Segregation
PrincipleDIP: Dependency Inversion
PrincipleClean CodersYAGNI: You ain't gonna need itDRY: Don't Repeat YourselfKISS: Keep It Simple Stupid
READ_MORE_LATER_2.TXT
Magyar Attila - Clean Code Orcsik Antal - Objektum orientált mérések a
gyakorlatban Ördög Rafael - Test driven mockery
FIRST: Fast, Independent, Repetable, Self-validating,Timely
slide video
slide videoslide video
Robert C. Martin - Clean Code: A Handbook of AgileSoftware Craftsmanship
Robert C. Martin - Tiszta kódRobert C. Martin - The Clean Coder: A Code of
Conduct for Professional ProgrammersRobert C. Martin - Túlélőkönyv programozóknak
READ_MORE_LATER_3.TXT„Betört ablak”-elvSpecifikációformális specifikációUser Story
C3
User StoryOn Acceptance criteria for user
storiesDSLGherkin - a nyelv
READ_MORE_LATER_4.TXT
.Net: , , Java: , ,JavaScript: , PHP: , Python: , ,
Ruby: , ,
Scala: ,
Gherkin ~40 nyelvenGiven-When-Then
NBehave NSpec ConcordionJBehave Spock Concordion
Jasmine Vows (node.js)Behat PHPUnit Story
Behave LetucceConcordion
RSpec CucumberConcordion
ScalaTest Concordion
READ_MORE_LATER_5.TXT
&
Dan North - IntroducingBDD
Dan North - What’s in aStory?
BBD » TDDBehat MinkPHP Meetup Budapest@szaszz /in/zoltanszasz