going beyond unit tests - wordcamp london 2015
TRANSCRIPT
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Because we all love to test right?
Going beyond unit tests…
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Once upon a time…
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
MEWebsite Twitter
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Most people don’t write tests
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Testing should be fun?
Otherwise we won’t test our side projects
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Unit tests scare folks…
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
So let’s not talk about them…
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
This is not a talk about BDD, DDD, ATDD or TDD Though you should check them out
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Tools, Concepts not methodology
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
So what’s Testing then?
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Dear client… To Test: Go to /form/ Enter Form Details Click Submit & the form should submit !
Any problems let me know!
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Dear Developer…
It doesn’t work!
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Dear client…
Did you try to clear your cache?
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
So what’s Testing then really?
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Codeception BDD style testing framework
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Unit Testing, Mocking, Functional, Acceptance Testing, Regression Testing and other stuff
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Acceptance Testing
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Acceptance TestingCodebase independent
Tests what client expectsBreaks things like a client
Easy to read and writeCan start straight away
Slow to runNeeds “live” end points
Infrastructure dependent
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Dear client… To Test: Go to /form/ Enter Form Details Click Submit & the form should submit !
Any problems let me know!
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php $I = new AcceptanceTester($scenario); $I->wantTo('Fill in a form'); $I->amOnPage('/form/'); $I->see('This is a form'); $I->fillField('event', 'WordCamp London'); $I->fillField('date', '22 March 2015'); $I->fillField('where', 'London Metropolitan University'); $I->click('Save'); $I->see('Form Submitted');
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Dear client… To Test login into the WordPress Dashboard: Go to /wp-login.php Enter your username and your password Click Login & you should be redirected to the dashboard !
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php $I = new AcceptanceTester($scenario); $I->wantTo('Login to WordPress Admin'); $I->amOnPage('/wp-login.php'); $I->fillField('Username', 'admin'); $I->fillField('Password','password'); $I->click('Log In'); $I->see('Dashboard');
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Trying to Login to WordPress Admin (LoginCept) Scenario: * I am on page "/wp-login.php" * I fill field "Username","admin" * I fill field "Password","password" * I click "Log In" * I see "Dashboard" * I click "Posts" PASSED
php codecept.phar run acceptance --steps
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Reporting in console, html, xml
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
WebDriver, Selenium, PhatomJS
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Webdriver Pretty fast Headless CURL based solution Doesn’t support javascript User agent not always recognised Often caught in WAFs Enabled by default
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Selenium Browser Automation Supports Firefox and Chrome Used in multiple frameworks Can operate headless with virtual frame buffer Bit of a pig to set up Codeception support a Docker container to ease setup
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
PhantomJS Headless Supports Javascript User agent not always recognised Often caught in WAFs
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Functional Testing
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Functional Testing Like Acceptance Testing Push data into end point Directly call AJAX end points No browser emulation so simple web driver Unlike unit testing not done in isolation
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Test REST like APIs…WP-API Endpoints
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php $I = new ApiTester($scenario); $I->wantTo(‘Return all posts’); $I->sendGet(‘posts’); $I->seeResponseCodeIs(200); $I->seeResponseIsJson(); $I->seeResponseContains(“content”);
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Test REST like APIs…RSS, ATOM Feeds
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php $I = new ApiTester($scenario); $I->wantTo(‘Return full Feed’); $I->sendGet(‘feed’); $I->seeResponseCodeIs(200); $I->seeResponseIsXml(); $I->seeResponseContains(“channel”);
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Test cli…WP-CLI Commands
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php $I = new CliTester($scenario); $I->runShellCommand(‘wp example'); $I->seeInShellOutput(‘Example List');
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Test Email…wp_mail();
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
MailCatcher + APITester<?php $I = new ApiTester($scenario); $I->wantTo(‘Return all emails’); $I->sendGet(‘messages’); $I->seeResponseCodeIs(200); $I->seeResponseIsJson();
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Test XML-RPC…Really???Well yes you can!
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php $I = new ApiTester($scenario); $I->wantTo(‘Return XML-RPC ’); $I->sendXMLRPCMethodCall(‘posts’); $I->seeResponseIsXMLRPC(); $I->seeResponseContains(“posts”);
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
DBs, Factories and tearing down
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
WP-Browserhttps://github.com/lucatume/wp-browser
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php $I = new AcceptanceTester($scenario); $I->wantTo('create and check for a user'); // create a subscriber user with user login and id $I->haveUserInDatabase('rincewind', 100); // check for created user $I->seeUserInDatabase(array('user_login' => 'rincewind', 'ID' => 100));
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
WP-CLI is your friend
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Wait this is all PHP…
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Class based Test Suites :)
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php class exampleCEST { /** * @before addPost * @after checkFrontpage */ public function checkLogin(\AcceptanceTester $I) { … } }
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
PageObjects & StepObjects
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php class loginPage { public static $URL = ‘/wp-login.php’; public static $usernameField = "Username"; public static $passwordField = "Password"; public static $submitButton = “Login in"; }
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php $I = new AcceptanceTester($scenario); $I->wantTo('Login to WordPress Admin'); $I->amOnPage(loginPage::URL); $I->fillField(loginPage::usernameField, 'admin'); $I->fillField(loginPage::passwordField,'password'); $I->click(loginPage::submitButton); $I->see('Dashboard');
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Helpers, modules & Addons
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
<?php namespace Codeception\Module; use Codeception\Module; class MailCatcher extends Module { protected $mailcatcher; protected $config = array('url', 'port'); !
public function _initialize() { $url = trim($this->config['url'], '/') . ':' . $this->config['port']; $this->mailcatcher = new \Guzzle\Http\Client($url); } } ....
.... /** * Messages * * Get an array of all the message objects * * @return array * @author Jordan Eldredge <[email protected]> **/ protected function messages() { $response = $this->mailcatcher->get('/messages')->send(); $messages = $response->json(); usort($messages, array($this, 'messageSortCompare')); return $messages;
MailCatcher Module
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Debuging
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
codeception run --debug !
$u = $foobard->haveUserInDatabase('rincewind', 100); $this->debugSection(‘User Creation', $u);
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Alternatives?
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Multiple Test solutions out there
PHPUnit + Selenium Behat & Mink Mocha Fitness
!
many many more…
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Testing is not just for development
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
Automated Testing of Backups
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
So about those unit tests…
COMPANY NAME PRESENTATION TITLE 12 - 12 - 2012TimNash.co.uk @tnash
My Stuff aka Plugs: My Site: timnash.co.uk My Patreon Page: patreon.com/tnash