Behaviour Driven Development con Behat & Drupal

39
1

Transcript of Behaviour Driven Development con Behat & Drupal

1

BDD with Behat & Drupal

Alessio Piazza Software Developer @SparkFabrik

(twinbit + agavee)

twitter: @alessiopiazza

I do stuff with Drupal

SPARKFABRIK

3

• Behaviour Driven Development

• a software development process that emerged from TDD (Test Driven Development)

• Behaviour driven development specifies that tests of any unit of software should be specified in terms of the desired behaviour of the unit

BDD

SPARKFABRIK

WHY BDD? or TDD?• You must test your application

• Save your self from regressions (fix one thing, break another one)

• Save your self from misunderstanding between you and your client

• Your tests become specification

4SPARKFABRIK

BDD Workflow1. Write a specification feature

2. Implement its test

3. Run test and watch it FAIL

4. Change your app to make test PASS

5. Run test and watch it PASS

6. Repat from 2-5 until all GREEN5

SPARKFABRIK

BDD: HOW IT WORKS?

6

HOW IT WORKS?

7

Write a specification feature

8

Feature: Download Drupal 8In order to use Drupal 8as a useri should be able to download it from drupal.org

Scenario: Download Drupal 8 from Drupal.orgGiven i am on the homepageWhen i Click “Download and Extend”Then I should see the link “Download Drupal 8.0.0”

Scenario: …

SPARKFABRIK

SCENARIO STRUCTURE

9

Scenario: Download Drupal 8 from Drupal.org Given I am on drupal.org homepage When I Click “Download and Extend” Then I should see the link “Download Drupal 8.0.0”

SPARKFABRIK

SCENARIO STRUCTURE

10

Given i am on drupal.org homepage

And i Click “Download and Extend”

Then I should see the link “Download Drupal 8.0.0”

Scenario: Download Drupal 8 from Drupal.org

Keyword Description

SPARKFABRIK

SCENARIO STRUCTURE

11

Given i am on drupal.org homepage

And i Click “Download and Extend”

Then I should see the link “Download Drupal 8.0.0”

Scenario: Download Drupal 8 from Drupal.org

Keyword Description

StepsGiven I am on drupal.org homepageWhen I Click “Download and Extend”Then I should see the link “Download …”

SPARKFABRIK

STEPS: Keywords

12

Given -> To put the system in a known state

Given I am an anonymous user

SPARKFABRIK

Given

STEPS: Keywords

13

When -> To describe the key action to performs

When I click on the link

SPARKFABRIK

Given

STEPS: Keywords

14

WhenThen -> To to observe outcomes

Then I should see the text “Hello”

SPARKFABRIK

Given

STEPS: Keywords

15

WhenThenAnd / But -> To make our scenario more readable

SPARKFABRIK

STEPS: Keywords

16

Scenario: Download Drupal 8 from Drupal.org Given I am on drupal.org homepage Given I am an anonymous user When I Click “Download and Extend” When I Click “Download Drupal 8.0.0” Then I should see the link “Drupal Core 8.0.0”

SPARKFABRIK

STEPS: Keywords

17

Scenario: Download Drupal 8 from Drupal.org Given I am on drupal.org homepage And I am an anonymous user When I Click “Download and Extend” And I Click “Download Drupal 8.0.0” Then I should see the link “Drupal Core 8.0.0”

SPARKFABRIK

GHERKIN• It is a Business Readable, Domain Specific

Language

• Lets you describe software’s behaviour without detailing how that behaviour is implemented.

• Gherkin is the language that BEHAT understands.

18SPARKFABRIK

BEHAT docs.behat.org/en/v3.0/

Open source Behavior Driven Development framework for PHP (5.3+)

Inspired from Cucumber (Ruby) www.cucumber.io

From version 3 BEHAT it’s an official Cucumber implementation in PHP

Let us write tests based on our scenarios

19SPARKFABRIK

HOW BEHAT READS GHERKIN?

20

Given I am an anonymous user

SPARKFABRIK

HOW BEHAT READS GHERKIN?

21

/** * @Given I am an anonymous user */ public function assertAnonymousUser() { // Verify the user is logged out. if ($this->loggedIn()) { $this->logout(); } }

Given I am an anonymous user

SPARKFABRIK

HOW BEHAT READS GHERKIN?

22

Then I should not see the text :text

SPARKFABRIK

HOW BEHAT READS GHERKIN?

23

/** * @Then I should not see the text :text */ public function assertNotTextVisible($text) { // Use the Mink Extension step definition. $this->assertPageNotContainsText($text); }

Then I should not see the text :text

SPARKFABRIK

STEP RESULTS

24

/** * @Then I should not see the text :text */ public function assertNotTextVisible($text) { // This step will fail. throw new \Exception(‘Test failed’); }

• A step FAILS when an Exception is thrown

SPARKFABRIK

STEP RESULTS

25

/** * @Then I will trigger a success */ public function triggerSuccess() { // This step will pass. print(‘Hello DrupalDay’); }

• A step PASS when no Exception are raised

SPARKFABRIK

OTHER STEP RESULTS

26

• SUCCESSFUL • FAILED

• PENDING • UNDEFINED • SKIPPED • AMBIGUOUS • REDUNDANT

SPARKFABRIK

WHERE ARE THESE STEPS?

27

• STEPS are defined inside plain PHP Object classes, called CONTEXTS

• MinkContext and DrupalContext give use a lot of pre-defined steps ready to be used

• Custom steps can be defined inside FeatureContext class

SPARKFABRIK

Sum Up

28

Give use the syntax to write features and scenarios

Our framework that reads our scenarios and run tests

Classes containing our step definitions

GHERKIN

BEHAT

CONTEXTS

SPARKFABRIK

How we integrate Behat and Drupal?

29

Behat Drupal Extension

An integration layer between Drupal and Behat

https://www.drupal.org/project/drupalextensionhttps://github.com/jhedstrom/drupalextension

SPARKFABRIK

From your project root..composer require drupal/drupal-extension

30

- Installing drupal/drupal-driver (v1.1.4) Downloading: 100%

> Drupal\Core\Composer\Composer::vendorTestCodeCleanup - Installing symfony/filesystem (v3.0.0) Downloading: 100%

> Drupal\Core\Composer\Composer::vendorTestCodeCleanup - Installing symfony/config (v2.8.0) Downloading: 100%

> Drupal\Core\Composer\Composer::vendorTestCodeCleanup - Installing behat/transliterator (v1.1.0) Loading from cache … …

> Drupal\Core\Composer\Composer::vendorTestCodeCleanup - Installing drupal/drupal-extension (v3.1.3) Downloading: 100% SPARKFABRIK

Create file behat.yml

31

1 default: 2 suites: 3 default: 4 contexts: 5 - FeatureContext 6 - Drupal\DrupalExtension\Context\DrupalContext 7 - Drupal\DrupalExtension\Context\MinkContext 8 extensions: 9 Behat\MinkExtension: 10 goutte: ~ 11 base_url: http://d8.drupalday2015.sparkfabrik.loc # Replace with your site's URL 12 Drupal\DrupalExtension: 13 blackbox: ~

see https://github.com/jhedstrom/drupalextension

SPARKFABRIK

Then --init your test suite

32

vendor/bin/behat --init

+d features - place your *.feature files here+d features/bootstrap - place your context classes here+f features/bootstrap/FeatureContext.php - place your definitions, transformations and hooks here

SPARKFABRIK

Demo!

33SPARKFABRIK

BROWSER INTERACTION• With BDD we write clear, understandable

scenario

• Our scenario often describe an interaction with the browser

34

WE NEED A BROWSER EMULATOR

SPARKFABRIK

BROWSER EMULATORS• Headless browser emulators (Goutte)

• Browser controllers (Selenium2, SAHI)

• They do basically the same thing: control or emulate browsers but they do them in different ways

• They comes with their pro and cons

35SPARKFABRIK

MINK! http://mink.behat.org/en/latest/

• MINK removes API differences between different browser emulators

• MINK provides different drivers for every browser emulator

• MINK gives you an easy way to

1. control the browser

2. traverse pages

3. manipulate page elements

4. interact with page elements

36SPARKFABRIK

37

/** * @When /^(?:|I )move forward one page$/ */ public function forward() { $this->getSession()->forward(); }

MINK! http://mink.behat.org/en/latest/

When I move forward one page

SPARKFABRIK

Wrap up

38

GHERKIN

BEHAT

CONTEXTS

MINK

Give use the syntax to write features and scenarios

Our framework that reads our scenarios and run the tests

Classes containing our step definitions

Describe browser interaction without worrying about the browser

SPARKFABRIK

39