BDD with Behat¶
Behat is an open source behavior-driven development (BDD) tool for PHP. You can use Behat to build and run automated tests for site functionality on your Drupal sites.
1. Requirements¶
From your vagrant machine on your drupal project folder, you must add the Drupal extension for Behat:
composer require --dev drupal/drupal-extension
Selenium2 is needed to test javascript session. Selenium2 gives you the ability to take full control of a real browser with a clean consistent proxy API.
First ensure that you have the Java Runtime Environment (JRE) installed on your host machine, which is required to run Selenium. You may already have it installed, but can check with:
java -version
If you need to install or update, Google is your friend.
From your host download the Selenium Server and place it wherever you like:
# check for the latest version at http://docs.seleniumhq.org/download/ curl -O http://selenium-release.storage.googleapis.com/3.4/selenium-server-standalone-3.4.0.jar mv selenium-server-standalone-3.4.0.jar /wherever/you/like/folder
We also need to download the browser drivers to make Selenium deal with them:
# download chrome driver # check for the latest version at https://sites.google.com/a/chromium.org/chromedriver/downloads curl -L -O https://chromedriver.storage.googleapis.com/2.30/chromedriver_mac64.zip # uncompress it unzip chromedriver_mac64.zip # move it on exec folder and give exec permission chmod +x chromedriver sudo mv chromedriver /usr/local/bin # download firefox driver # check for the latest version at https://github.com/mozilla/geckodriver/releases curl -L -O https://github.com/mozilla/geckodriver/releases/download/v0.18.0/geckodriver-v0.18.0-macos.tar.gz # uncompress it tar -zxvf geckodriver-v0.18.0-macos.tar.gz # move it on exec folder and give exec permission chmod +x geckodriver sudo mv geckodriver /usr/local/bin
2. Setup Behat¶
From your vagrant machine, on your drupal project folder, the following steps will help you get your first Behat tests up and running!
If your project already have the file behat.yml in your drupal docroot then skip this and jump directly to Run your first Behat test.
Create a behat.yml file inside the docroot of your site (e.g. create this file alongside the rest of the Drupal codebase at /var/www/drupalvm/drupal/behat.yml), with the following contents:
chrome: autoload: '': %paths.base%/features/bootstrap suites: web_features: paths: [ %paths.base%/features/web ] contexts: - WebContext - Drupal\DrupalExtension\Context\DrupalContext - Drupal\DrupalExtension\Context\MinkContext - Drupal\DrupalExtension\Context\MessageContext - Drupal\DrupalExtension\Context\DrushContext extensions: Behat\MinkExtension: goutte: ~ javascript_session: 'selenium2' selenium2: wd_host: http://10.0.2.2:4444/wd/hub browser: 'chrome' base_url: http://drupalvm.dev browser_name: 'chrome' Drupal\DrupalExtension: blackbox: ~ api_driver: 'drupal' drupal: drupal_root: '/var/www/drupalvm/drupal/web' region_map: content: "#content" firefox: autoload: '': %paths.base%/features/bootstrap suites: web_features: paths: [ %paths.base%/features/web ] contexts: - WebContext - Drupal\DrupalExtension\Context\DrupalContext - Drupal\DrupalExtension\Context\MinkContext - Drupal\DrupalExtension\Context\MessageContext - Drupal\DrupalExtension\Context\DrushContext extensions: Behat\MinkExtension: goutte: ~ javascript_session: 'selenium2' selenium2: wd_host: http://10.0.2.2:4444/wd/hub browser: 'firefox' base_url: http://drupalvm.dev browser_name: 'firefox' Drupal\DrupalExtension: blackbox: ~ api_driver: 'drupal' drupal: drupal_root: '/var/www/drupalvm/drupal/web' region_map: content: "#content" safari: autoload: '': %paths.base%/features/bootstrap suites: web_features: paths: [ %paths.base%/features/web ] contexts: - WebContext - Drupal\DrupalExtension\Context\DrupalContext - Drupal\DrupalExtension\Context\MinkContext - Drupal\DrupalExtension\Context\MessageContext - Drupal\DrupalExtension\Context\DrushContext extensions: Behat\MinkExtension: goutte: ~ javascript_session: 'selenium2' selenium2: wd_host: http://10.0.2.2:4444/wd/hub browser: 'safari' base_url: http://drupalvm.dev browser_name: 'safari' Drupal\DrupalExtension: blackbox: ~ api_driver: 'drupal' drupal: drupal_root: '/var/www/drupalvm/drupal/web' region_map: content: "#content"
and edit the base_url and drupal_root parameters of the three profile (chrome - firefox - safari) with your parameters.
To initialize the Behat features folder, where you will place test cases, you must run:
./vendor/bin/behat --init
the features folder must be created on your Drupal docroot.
3. Run your first Behat test¶
Open up the new features/web folder Behat just created. Inside that folder, create HomeContent.feature file with the following contents:
Feature: Test DrupalContext In order to prove Behat is working correctly in Drupal VM As a developer I need to run a simple interface test @javascript Scenario: Viewing content in a region Given I am on the homepage Then I should see "No front page content has been created yet" in the "content"
Note
The @javascript is needed to run javascript session, otherwise the tests will run in a headless browser.
From your host machine, move to the folder where you previously placed the Selenium Server and run it up:
cd /my/selenium/server/standalone/folder java -jar selenium-server-standalone-3.4.0.jar
Now you can finally run your Behat test and see the browser in action. From your vagrant machine on drupal docroot folder run:
# to run test on chrome ./vendor/bin/behat -v -c behat.yml -p chrome # to run test on firefox ./vendor/bin/behat -v -c behat.yml -p firefox # to run test on safari ./vendor/bin/behat -v -c behat.yml -p safari
Run with Safari
To make it works with safari browser you must enable, from safari browser, the Allow Remote Automation under Develop menu.
If everything worked out, you’ll see Selenium open up a new instance of the selected browser profile and drive it through the test suites.