Upgrade to Pro — share decks privately, control downloads, hide ads and more …

T3CON13: Web application development using Behaviour Driven Development

T3CON13: Web application development using Behaviour Driven Development

License: CC BY-SA

While Test-Driven Development (TDD) has already emerged as a widely accepted standard in agile software development over the past decade, the relatively young concept of Behaviour-Driven Development (BDD) tries to apply TDD principles to bridge the gap between developers and domain experts.

This talk aims at illustrating the basic principles of Behaviour Driven Development and will introduce appropriate tools that can be used for automated acceptance testing of web applications, like Cucumber, Behat and Mink.

The talk will include some real-life examples from Mittwald’s software development department. It will discuss the costs and benefits of BDD and how BDD can improve your software quality and ease both the developer’s and product owner’s mind.

Martin Helmich

October 30, 2013
Tweet

More Decks by Martin Helmich

Other Decks in Programming

Transcript

  1. Requirements

    View full-size slide

  2. Requirements

    View full-size slide

  3. Product
    Owner
    Development
    Team
    Product
    Backlog
    writes
    stories
    Sprint
    Backlog
    Selected
    by

    View full-size slide

  4. Another
    (also

    View full-size slide

  5. Failing
    test
    Passing
    test
    Refactor
    Test-Driven

    View full-size slide

  6. Introducing
    Gherkin
    CC

    View full-size slide

  7. class MyTest extends PHPUnit_Extensions_Selenium2TestCase
    {
    protected function setUp()
    {
    $this->setBrowser('*firefox');
    $this->setBrowserUrl('http://login.mittwald.de/');
    }
    public function testLoginWithCorrectCredentialsWorksCorrectly()
    {
    $this->url('login.html');
    $this->byXPath('//input[@id="login_username"]')->value('123456');
    $this->byXPath('//input[@id="login_password"]')->value('supersecret');
    $this
    ->byXPath('//input[@type="submit" and @name="login_password"]')
    ->clickAndWait();
    $this->frame(0);
    $this->assertContains(
    'Welcome to the customer center',
    $this->byXPath('//body')->text()
    );
    }
    }
    ?>
    Scenario: User login
    Given I am on "login.mittwald.de"
    When I fill in "123456" for "username"
    And fill in "supersecret" for "password"
    And press "log in"
    Then I should see "Welcome to the customer center"
    24 6
    Lines

    View full-size slide

  8. Cucumber Behat
    Decym92,

    View full-size slide

  9. Behat Mink
    Goutte
    Driver
    Selenium
    Driver
    Web
    Driver
    Sahi
    Driver
    Zombie
    Driver
    Selenium
    Sahi
    Zombie

    View full-size slide

  10. Scenario: Registration form
    Given I am on "index.php?id=512"
    When I follow "register now!"
    And I fill in "user_name" with "Max Mustermann"
    And I fill in "user_email" with "[email protected]"
    And I attach the file "/Users/mmustermann/max.jpeg"
    to "user_image"
    And I press "submit registration"
    Then I should be on "index.php?id=514"
    And the response should contain "Thank you ..."
    And the mailbox "m15273" should contain an email with
    subject "Your registration"

    View full-size slide

  11. Scenario: Registration form
    Given I am on "index.php?id=512"
    When I follow "register now!"
    And I fill in "user_name" with "Max Mustermann"
    And I fill in "user_email" with "[email protected]"
    And I attach the file "/Users/mmustermann/max.jpeg"
    to "user_image"
    And I press "submit registration"
    Then I should be on "index.php?id=514"
    And the response should contain "Thank you ..."
    And the mailbox "m15273" should contain an email with
    subject "Your registration"
    This

    View full-size slide

  12. Better!
    Feature: Online registration
    In order to use the site's personalized features
    As an anonymous user
    I want to register to the page.
    Scenario: Registration is confirmed
    Given I am on the registration page
    And I fill in the following:
    | Full name | Max Mustermann |
    | Email address | [email protected] |
    And I upload an image of myself
    And submit the registration
    Then I should see a confirmation message
    And I should receive a confirmation email

    View full-size slide

  13. Feature: Online registration
    In order to use the site's personalized features
    As an anonymous user
    I want to register to the page.
    Scenario: Registration is confirmed
    Given I am on the registration page
    And I fill in the following:
    | Full name | Max Mustermann |
    | Email address | [email protected] |
    And I upload an image of myself
    And submit the registration
    Then I should see a confirmation message
    And I should receive a confirmation email
    Who

    View full-size slide

  14. Then /^(?:I| ) should receive a confirmation e?mail$/ do
    # Connect to mailbox and see if mail is actually there.
    # Throw exception otherwise.
    end
    class FeatureContext extends Context
    {
    /**
    * @Then /^(?:|I )should receive a confirmation e?mail$/
    */
    public function assertRegistrationMailWasReceived()
    {
    // Connect to mailbox and see if mail is actually there.
    // Throw exception otherwise.
    }
    }

    View full-size slide

  15. Product
    Owner
    Stories

    View full-size slide

  16. References
    Gärtner,

    View full-size slide