a sweet test suite - drupalcon sweet test suite nashville.pdfdrupalcon na | a sweet test suite | dan...
TRANSCRIPT
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Dan GurinA Sweet Test Suite
Twitter @dgurindangur @ D.O, GitHub, LinkedIn...Organizer @ Drupal Camp AshevilleEngineer @CivicActions
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Test Driven Development
Test Driven Development
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
BalanceTest Driven Development
● High quality● Burn out
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
1. Visual Regression Testing2. Behavior-Driven
Development (BDD) with Behat
3. Unit testing with PHPUnit
Test Driven DevelopmentA Sweet Test Suite
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Visual Regression TestingVisual Regression Testing with WebdriverCSS
● Good coverage● Display changes● Great for updates
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Visual Regression TestingVisual Regression Testing with WebdriverCSS
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Intersection over Union IoUVisual Regression Testing with WebdriverCSS
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Partial Page Comparison
Visual Regression Testing with WebdriverCSS
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
1. Visual Regression Testing
2. Behavior-Driven Development (BDD) with Behat
3. Unit testing with PHPUnit
Test Driven DevelopmentA Sweet Test Suite
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Behat Drupal ExtensionBehavior Driven Development with Behat
● Plain language● Common step definitions● Extensible extension
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
TagsBehavior Driven Development with Behat
● Driver @api @javascript● Groups @database @form● Hooks
○ @beforeNodeCreate○ @AfterScenario
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
DriversBehavior Driven Development with Behat
Blackbox No privileges
Drupal @api More step definitions
Drush @api Can run on a different server
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
ConfigurationBehavior Driven Development with Behat
● behat.yml default:extensions:Drupal\DrupalExtension
● api_driver
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
DrushBehavior Driven Development with Behat
● SSH● profile:extension:drush:alias:elia
s● Given I run drush cache-rebuild● behat -p elias
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
machine_name * Machine Name
Behavior Driven Development with Behat
● Completed by JavaScript● w/o PhantonJS & @javascript● incomplete required field
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Chrome Dev ToolsBehavior Driven Development with Behat
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Turn off JSBehavior Driven Development with Behat
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
CommentsBehavior Driven Development with Behat
● # on a line followed by a hashtag● Syntax aware editor?Control or Command + Slash /to comment out line(s)
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
● All Scenarios● Many items
Background& Tables
Behavior Driven Development with Behat
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Tables
Behavior Driven Development with Behat
DrupalCon NA | 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
DrupalCon NA | 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
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Custom ContextsBehavior Driven Development with Behat
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Custom ContextsBehavior Driven Development with Behat
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Custom ContextsBehavior Driven Development with Behat
1. Delete exception2. Add code3. Test again
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Args in Custom ContextsBehavior Driven Development with Behat
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Args in Step DefinitionsBehavior Driven Development with Behat
Given I am logged in as a user with the
'Administrator' role
When I create a webform
"a_test_webform"
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Custom ContextsBehavior Driven Development with Behat
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Custom ComboBehavior Driven Development with Behat
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Custom ComboBehavior Driven Development with Behat
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
● Steps○ print current url○ print last response
● print_r($variable);● Screenshots / Page source code● behat :99
DebuggingBehavior Driven Development with Behat
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Sub contextsBehavior Driven Development with Behat
● Contrib & Custom projects● Modules● Themes
DrupalCon NA | 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
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
1. Visual Regression Testing
2. Behavior-Driven Development (BDD) with Behat
3. Unit testing with PHPUnit
Test Driven DevelopmentA Sweet Test Suite
DrupalCon NA | 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
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
UnitUnit Testing with PHPUnit
DrupalCon NA | 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
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
KernelUnit Testing with PHPUnit
● API● Decoupled● Setup● Config
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Enable modulesUnit Testing with PHPUnit
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
SetupUnit Testing with PHPUnit
● Top of the class● Applies to all test functions● Set up the parent first
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Install DB & ConfigUnit Testing with PHPUnit
● (Entity) Schema● Configuration
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
setUp Unit Testing with PHPUnit
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Install Fields Unit Testing with PHPUnit
● Get from configuration management● Create n’ Save
○ Storage○ Field
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
FunctionalUnit Testing with PHPUnit
● Enable modules● Paths!● Web assert
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Functional ExampleUnit Testing with PHPUnit
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
JavaScript Phantom JSUnit Testing with PHPUnit
● executeScript / evaluateScript● switchToIFrame● keyDown● resizeWindow● wait
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
JavascriptTestBaseUnit Testing with PHPUnit
● createScreenshot● getDrupalSettings
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
JavaScript AssertionsUnit Testing with PHPUnit
● assertJsCondition● assertElement(Not)Visible
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
assertSessionUnit Testing with PHPUnit
● waitForAjaxToFinish, Button, Element(Visible), Field, Link● waitOnAutocomplete● responseContains● isVisible
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Test DoublesUnit Testing with PHPUnit
Return a value without the object
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Mock ObjectsUnit Testing with PHPUnit
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
● Common setups● Nested levels
Base ClassesUnit Testing with PHPUnit
DrupalCon NA | 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
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Reflection TraitUnit Testing with PHPUnit
Test protected / private methods
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Trait in actionUnit Testing with PHPUnit
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Data ProvidersUnit Testing with PHPUnit
● Run same test with different datasets
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Named Data ProvidersUnit Testing with PHPUnit
● Named dataset via associative array
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
DebuggingUnit Testing with PHPUnit
● print_r($whatEver);● Screenshots● Reports● Error/failure messages
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
Running testsUnit Testing with PHPUnit
● phpunit --options arguments● blt:tests phpunit● CI● @group● . = pass, E = error, F = Failure
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS
● Test failure as well as success
● expectException()○ Code, Message,
MessageRegExp
Happy & Sad PathsUnit Testing with PHPUnit