Behaviour Testing and Continuous Integration with Drupal

Preview:

Citation preview

Behaviour Testing and Continuous Integration with Drupal

Smith Milner

October 6th 2013

Pacific Northwest Drupal Summit

https://github.com/affinitybridge/pnwds_behat

Feel free to ask questions during the talk

Working Example

http://affinitybridge.com

The Problem

● Large Complicated Project● Multiple Clients using the same codebase● Multiple Combinations of features installed● Many Deployments● Breakage would happen in other areas then

the newest code being released

http://affinitybridge.com

Enter Behat.From Stage Right

http://affinitybridge.com

Jonathan Hedstrom and Melissa Anderson's

session on

Quality Assurance using Behat and the Drupal Extension?

http://affinitybridge.com

What is Behat?

● Behaviour Driven Development (BDD)● The framework is written in PHP● Write Tests fast● Human Readable

http://affinitybridge.com

The Rest of the Stack

● Mink● Browser Drivers used by Mink (goutte)● Drupal Extension

http://affinitybridge.com

Drupal Extension

● Drupal Specific Step Definitions● 3 Different Drivers

● blackbox● drupal● drush

● Cleans up● In Active Development

http://affinitybridge.com

Scenario: anonymous users can't see user profiles.

Given I am an anonymous user

When I am viewing a "profile" node

Then I should see "Access Denied"

The Tests

http://affinitybridge.com

Scenario: Short description of the tests goal

Given some known state

When I perform an action

Then I expect a result

Gherkin

http://affinitybridge.com

Where are the tests?

● The tests are broken up into sets called Features (yup another one).

● They live in /features at the root of your testing stack.

● Don’t let your .features get too big.

http://affinitybridge.com

Annotations

Tag feature sets or individual scenarios

● @javascript● @api● @drush● @reinstall (custom)

http://affinitybridge.com

@javascript

Scenario: Short description of the test goal

Given some known state

When I perform an action with javascript

Then I expect a result

Annotations

http://affinitybridge.com

What Powers the Steps?Where the HAL is the code?

http://affinitybridge.com

Lives in the same directory as in:

test_root/features/bootstrap/FeatureContext.php

● Feature Context is a object created for each scenario.● Allows sharing of variables between steps● It extends a Context provided by Drupal Extension

The Context Class: FeatureContext.php

http://affinitybridge.com

class FeatureContext extends DrupalContext {

/**

* @Given /^I run cron$/

*/

public function iRunCron() {

$this->getDriver()->runCron();

}

}

The Context Class: FeatureContext.php

http://affinitybridge.com

YAY We have Tests!

http://affinitybridge.com

Uh OhThey Always Fail

http://affinitybridge.com

● Run them often

● Make sure to capture the fragile functionality

● Take a look at broken tests right away

Stay on Your Tests

http://affinitybridge.com

● The tests break all the time!

● Other developers don’t run my tests!

● It can take a long time!

But It’s So Hard!

http://affinitybridge.com

Enter Travis CI.From Stage Left

http://affinitybridge.com

● Continuous Integration service● Integrates with Github post commit hooks● Runs a build of your project every commit● Reports Results (email, chat client, etc)

What is Travis CI?

http://affinitybridge.com

Where did the name Travis originate?

Bob the Builder

http://affinitybridge.com

A configuration file is located in the project root.

The .travis.yml file tells Travis CI how to set up an environment and how to run the tests.

Every build runs from scratch on a fresh VM.

How to Travis CI

http://affinitybridge.com

Setup Tasks Include

http://affinitybridge.com

● Create a MySQL Database● Downloading Drush● Building test framework with composer● Setup Drupal with Drush Make● Adding a files directory and settings.php● Setup Selenium Standalone Server● Install drupal (drush site-install)● Run a server (drush runserver)● Start your tests!

Initial Hurdles

http://affinitybridge.com

● Running javascript in a headless environment● Extensive use of 3rd party libraries● Testing configuration on Travis can take a

long time

Travis CI Reports Directly into our Chat Client

Immediate announcement of how good you are at coding

http://affinitybridge.com

Travis CI Build History

Lets you quickly review status of your build.

http://affinitybridge.com

This is me now

http://affinitybridge.com

Example Time!Make it go

http://affinitybridge.com

http://affinitybridge.com

Questions?

http://affinitybridge.com

Thank You!

Recommended