a sweet test suite - drupalcampatlanta.com · behavior driven development with behatcontributing....

52
DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS A Sweet Test Suite

Upload: others

Post on 17-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

A Sweet Test Suite

Page 2: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Dan GurinA Sweet Test Sweet

Engineer @CivicActionsDrupal Camp Asheville OrganizerTwitter @dgurindangur on github, LinkedIn, www, Slack...

Page 3: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

1. Behavior-Driven Development (BDD) with Behat

2. Visual Regression Testing3. Unit testing with PHPUnit

Test Driven Development

Page 4: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Behat Drupal ExtensionBehavior Driven Development with Behat

● Plain language● Common scenarios● Changes & updates● Extensible extension

Page 5: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Page 6: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

TagsBehavior Driven Development with Behat

● Driver @api @javascript● Groups @database @form● Hooks

○ @beforeNodeCreate○ @AfterScenario

Page 7: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

DriversBehavior Driven Development with Behat

Blackbox No privileges

Drush @api Can run on a different server

Drupal @api More step definitions

Page 8: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

machine_name * Machine Name

Behavior Driven Development with Behat

Generated by JavaScript, so without PhantonJS & @javascript, becomes an additional required field.

Page 9: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

CommentsBehavior Driven Development with Behat

● # <- Anything on a line followed by a hashtag

● Use PhpStorm? Control or Command Slash /to comment out line(s)

Page 10: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

● Applies to allScenarios● Create manyitems

Background& Tables

Behavior Driven Development with Behat

Page 11: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

ContextsBehavior Driven Development with Behat

● Drupal - users, terms, and nodes○ DrupalRaw - functionality

● Mink - regions and forms● Markup - tags, classes, & attributes● Message - notice, warning, & error● Drush - call commands directly

Page 12: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Custom ContextsBehavior Driven Development with Behat

FeatureContext.php file CustomContext class

1. Write the step2. Run the test (it will fail)3. Copy the generated snippet

Page 13: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Custom ContextsBehavior Driven Development with Behat

Page 14: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Custom ContextsBehavior Driven Development with Behat

Page 15: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Custom ContextsBehavior Driven Development with Behat

1. Delete exception2. Add code3. Test again and see if it worked

Page 16: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

● Steps○ print current url○ print last response

● print_r($variable);

DebuggingBehavior Driven Development with Behat

Page 17: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

D8 extension extensionBehavior Driven Development with Behat

github.com/nuvoleweb/drupal-behatAutocomplete, CKEditor, Chosen, Content, Drupal, Menu, Position, Raw, Responsive, Screenshot, Select, ServiceContainer, Taxonomy, Visibility

Page 18: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Sub contextsBehavior Driven Development with Behat

● Contrib & Custom projects● Modules● Themes

Page 19: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

● Behat Drupal Extension● https://github.com/Behat/Behat/

blob/master/CONTRIBUTING.md● http://mink.behat.org/en/latest/c

ontributing.html

ContributingBehavior Driven Development with Behat

Page 20: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

1. Behavior-Driven Development (BDD) with Behat

2. Visual Regression Testing3. Unit testing with PHPUnit

Test Driven Development

Page 21: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Visual Regression Testing

Visual Regression Testing with WebdriverCSS

● Good coverage● Display changes● Great for updates

Page 22: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Visual Regression Testing

Visual Regression Testing with WebdriverCSS

Page 23: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Intersection over Union IoUVisual Regression Testing with WebdriverCSS

Page 24: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

1. Behavior-Driven Development (BDD) with Behat

2. Visual Regression Testing3. Unit testing with PHPUnit

Test Driven Development

Page 25: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Drupal 8 PHPUnit SuitesUnit Testing with PHPUnit

Name Extend State RequiresUnit UnitTestCase None Code

Kernel KernelTestBase Bootstrapped Database

Functional BrowserTestBase Booted Webserver

Javascript JavascriptTestBase Booted PhantomJS

Page 26: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

UnitUnit Testing with PHPUnit

Page 27: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

AssertionsUnit Testing with PHPUnit

● Equals● Same● True / False● PHPUnit Documentation Appendix Ahttps://phpunit.de/manual/current/en/phpunit-book.html#appendixes.assertions

Page 28: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

KernelUnit Testing with PHPUnit

● Setup● Config

Page 29: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

SetupUnit Testing with PHPUnit

● Beginning of class● Applies to all test functions● Set up the parent first

Page 30: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Install Unit Testing with PHPUnit

● Schema● Entity schema● Configuration

Page 31: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

setUp Unit Testing with PHPUnit

Page 32: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Install Fields Unit Testing with PHPUnit

● Get from configuration management● Create

○ Storage○ Field

Page 33: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Enable modulesUnit Testing with PHPUnit

Page 34: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

FunctionalUnit Testing with PHPUnit

● Enable modules● Paths!● Web assert

Page 35: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

FunctionalUnit Testing with PHPUnit

Page 36: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

JavaScriptUnit Testing with PHPUnit

● executeScript / evaluateScript● switchToIFrame● keyDown● resizeWindow● wait

Page 37: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

JavascriptTestBaseUnit Testing with PHPUnit

● createScreenshot● getDrupalSettings

Page 38: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

JavaScript AssertionsUnit Testing with PHPUnit

● assertElement(Not)Visible● assertJsCondition

Page 39: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

assertSessionUnit Testing with PHPUnit

● waitForAjaxToFinish, Button, Element(Visible), Field, Link● waitOnAutocomplete● responseContains● isVisible

Page 40: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Test DoublesUnit Testing with PHPUnit

Return a value without the object

Page 41: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Mock ObjectsUnit Testing with PHPUnit

Page 42: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

TraitsUnit Testing with PHPUnit

● Code reuse in many classes● Groups sets of methods● Can not be instantiated

Page 43: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Reflection TraitUnit Testing with PHPUnit

Test protected / private methods

Page 44: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Trait in actionUnit Testing with PHPUnit

Page 45: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Data ProvidersUnit Testing with PHPUnit

● Run same test with different datasets

Page 46: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Data ProvidersUnit Testing with PHPUnit

● Named dataset via associative array

Page 47: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

DebuggingUnit Testing with PHPUnit

● print_r($whatEver);● Screenshots● Reports● Error/failure messages

Page 48: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Running testsUnit Testing with PHPUnit

● phpunit with arguments● blt:tests phpunit● CI● @group● . = pass, E = error, F = Failure

Page 49: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

● Test failure as well as success

● expectException()○ Code, Message,

MessageRegExp

Happy & Sad PathsUnit Testing with PHPUnit

Page 50: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

● Common setups● Nested levels

Base ClassesUnit Testing with PHPUnit

Page 51: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Open Discussion

Page 52: A Sweet Test Suite - drupalcampatlanta.com · Behavior Driven Development with BehatContributing. DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS 1.Behavior-Driven

DrupalCamp Atlanta | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Thank you.