a sweet test suite - drupalcon sweet test suite nashville.pdfdrupalcon na | a sweet test suite | dan...

67
DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS A Sweet Test Suite

Upload: others

Post on 17-Jun-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

A Sweet Test Suite

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

Test Driven Development

DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

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

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

DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Open Discussion

DrupalCon NA | A Sweet Test Suite | Dan Gurin | @dgurin | @CIVICACTIONS

Thank you.