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 BDD

TDD, BDD és sok egyéb xBR



Creative Commons License

Szász Zoltán

bemutatkozás

avatar
  • 10+ éve dev bizniszben
  • Önjelölt Clean Coder
  • Dev & Ops, többnyire Dev
  • Agile / Scrum / Kanban / XP kedvelő
  • TDD & automata teszt hívő
  • Symfony2 fan
  • PHP Meetup alapító & szervező
  • 2 gyermek büszke apukája

Business

driven development

VS

Behavior

driven development

Business

driven development

=

Behavior

driven development

történet

feltalálók

  • Dan North
  • Chris Matts
  • Liz Keogh

feltalálták

  • Behavior Driven Development



megcsinálták

  • RBehave » RSpec
  • JBehave

tesztelés

~ismétlés a tudás atyja~

Miért teszteljünk?

  • helyesség
  • teljesség
  • robusztusság
  • regressziók kizárása
  • hibák megelőzése
  • stb.

Mi történik, ha

nem

tesztelünk?

TDD Cycle

Miért
automata teszteljünk?

  • úgyis tesztelsz
  • miért csinálnád kézzel?
  • teszt is lehet komplex
  • hamar megtérül
  • stb, stb.

XP teszt alapok

  • minden kód unit tesztelt
  • minden kód „átmegy” a unit teszteken
  • a tesztek felfedik a hibákat
  • a tesztek gyorsak, és gyakran futnak
  • + a tesztek determinisztikusak és koherensek
  • a cél továbbra is pontosan ez

TDD

TDD Cycle
  1. Írd meg a legegyszerűbb tesztet, és lásd, hogy úgy fail-el, ahogy vártad
  2. Teljesítsd a tesztet a legegyszerűbb kóddal
  3. Refaktorálj!


Ismételd, a fenti 3 lépést, míg készen nem vagy

clean code

SOLID

  • SRP Egy osztály egy dologért felel
  • OCP Az osztály kiterjeszthető, de nem módosítható
  • LSP Egy osztály helyett, bármely gyereke használható
  • ISP Ne függj olyantól, amit nem használsz. A logika kis interface-eknek feleljen meg.
  • DIP A működés (logikai szinten) nem a konkréttól, csupán az absztrakttól függ (decoupling)

„Tovább is van! Mondjam még?”

  • YAGNI Mindig csak a szükséges dolgokat implementáld
  • DRY Mindent csak egyszer írj meg
  • KISS Tartsd egyszerűen
  • FIRST Tesztek

Ajánló

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!

BDD
alapok

Specifikáció

formális specifikáció

  • üzleti szemléletben már a 60-as évektől
  • több paradigma
  • több leíró nyelv
  • kötöttek
  • nem 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            #role
Szeretnék a felhasználók közt keresni   #feautre
Azé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 Story


Feature: Account Holder withdraws cash              #title

As an Account Holder                                #role
I want to withdraw cash from an ATM                 #feature
So that I can get money when the bank is closed     #benefit
                        

Akkor mi az új?

Scenariók, mint automatán tesztelhető elfogadási kritériumok


Scenario: 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 :)

DSL

Gherkin - a nyelv

  • pontosabban 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, Marketing
  • fejlesztők is megértik
  • kötött szintaxissal, de
  • természetes nyelven írható (~40 nyelv)
  • .feature fileok (user story + scenariók)
  • natívan: Ruby, Java, Js, .Net
  • sok BDD eszköz alap DSL-je (pl: Behat, Behave)

User Story

Feature | Business Need | Ability


Feature: Cucumber eating

As a hungry man
I want to eat some cucumber
So that I won't be hungry
                        

Teszt Eset

Scenario (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ések

Given (Amennyiben|Adott)


Given there are 12 cucumbers
  And 6 potato
                        

#többsoros argumentumok
Given 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ések

Then (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ázlat

Scenario (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és

Background (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
                        

i18n

en


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: hu
Forgató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



a nyelvek ABC sorrendben szerepelnek

Scenario

  • A teszt metódus nevek legyenek mondatok
  • Egy kifejező teszt név nagyon hasznos, ha failel a teszt
  • Viselkedést definiáljunk, ne tesztet írjunk
  • A követelmény viselkedés is
  • Mindennapi (mindenki számára érthető) nyelven
  • Az elfogadási kritériumok legyenek futtathatók
  • Legyen a story olvasmányos
  • Mi lenne ha?

BDD != TDD

avagy mit teszteljünk?

BBD » TDD

TDDBDD
test example
class under test class we’re describing
method under test valuable behaviour
passing / behaving working, providing value
failing / misbehaving should it do what I’ve described?
100% coverage Please, come change my code. I believe I’ve given you enough information to do this safely.

például...

Behat & Mink

Scenario


Scenario: 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

PHP Meetup logo

kérdések?

avatar

read_it_later.txt

read_more_later.txt

read_more_later_2.txt

read_more_later_3.txt

read_more_later_4.txt

read_more_later_5.txt