Upload
sparkfabrik
View
325
Download
0
Embed Size (px)
Citation preview
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
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
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?
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?
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
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