Using Behat for Behavioral Driven Development (BDD) in Drupal

How to get this done in Drupal

Using Behat for Behavioral Driven Development (BDD) in Drupal

What is BDD

BDD allows you to write human readable stories that describe the behavior of your website. These stories are written from an end user’s perspective, and can then be tested against your application to see if they pass or fail. This allow you to define functionality easily and up front, and often make sense in an agile environment, or where you are making constant changes to your application and you want some sort of re-assurance it is working as intended (i.e. regression tests).

Behat and Gherkin

Behat is a tool that make BDD possible. The language that behat stories are written in is called Gherkin. Gherkin is a line-oriented language that uses indentation to define structure. The start of each line is usually a special keyword, these all mean something in Gherkin.

Feature: Some terse yet descriptive text of what is desired
  In order to realize a named business value
  As an explicit system actor
  I want to gain some beneficial outcome which furthers the goal

  Scenario: Some determinable business situation
    Given some precondition
      And some other precondition
     When some action by the actor
      And some other action
      And yet another action
     Then some testable outcome is achieved
      And something else we can check happens too

  Scenario: A different situation
  ...

A more concrete example, is the UNIX ls command. A stakeholder may say to you:

Feature: ls
  In order to see the directory structure
  As a UNIX user
  I need to be able to list the current directory's contents

  Scenario: List 2 files in a directory
    Given I am in a directory "test"
      And I have a file named "foo"
      And I have a file named "bar"
     When I run "ls"
     Then I should get:
       """
       bar
       foo
       """

The Gherkin documentation can be found online.

PHPUnit and behat

Because of their very different approaches to testing, PHPUnit and Behat actually complement each other very well. A growing number of enterprise-level PHP projects are using a combination of both to achieve the best-possible test coverage.

Key things to keep in mind when writing tests

To help write good behat tests, here are some good guidelines to keep in mind.

Focus on business value

When defining features (or stories) ensure that you are focusing on delivering an item of value. If you only have a few tests for your application, ensure the features that give the most business value are created first.

Focus on the user

A critical component of Gherkin style dictates that you speak with language that the target user can reasonably be expected to understand. This user-centric focus means that everyone will be drawn back from their domains of expertise to think about what the target user of the feature needs. There’s a wide variety of users, too. Features intended for a site visitor may differ from those intended for site administrators, editors, or moderators. As the user varies, it’s possible the language used in a scenario will vary as well.

Integration with Drupal

So you have some BDD features written, and now you want to implement them. There is a Drupal module that will help with the creation of nodes, users, vocabularies and taxonomy terms.

There are 3 drivers available in the drupal behat extension, all with different pros and cons:

The most fully featured driver is the Drupal API driver, it has the limitation that it must be run on the same server that the website is run on.

Continuous integration

So now you have your Behat tests set up and running on your development environment, the next step is to automate the Behat tests so that they execute automatically on a dedicated testing server after a new commit is pushed. There are a number of ways to do this:

Drupal 8 and behat

There is an issue open at the moment that aims to get Drupal 8 core tested with behat - this aims to introduce a new module called ‘behat’ and build in JavaScript automated testing for Drupal (at the moment this is all manual).

Resources

There is a lot of information out in the Drupal community around Behat that I would encourage you to read and watch:

Comments

If you have any further information that can be added, feel free to let me know in the comments.