SlideShare une entreprise Scribd logo
1  sur  65
Télécharger pour lire hors ligne
UNIT TESTING
likea
cPirate
WordCamp Europe 2013
with
pirate dunbar
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
YES,
I am a Pirate.
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
nAPP Platform
WordPress as a
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
nAPP Platform
WordPress as a
Video chat marketplace
for experts to monetize
their know-how.
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
nAPP Platform
WordPress as a
“I think WordPress is going in a
direction that isn’t well framed or
described by any existing alternatives
or historical platforms.”
— Matt Mullenweghttp://jakegoldman.me/2013/09/wordpress-app-platform/
Saturday, October 5, 13
“Plugins represent the
heartbeat of
WordPress.”
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
• sdsdsd
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
“The result is that a lot of the
plugins are written in poor code
and turn out to be poorly
compatible with other plugins.”
— Yoast
http://yoast.com/plugin-future/
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Manual Testing
Saturday, October 5, 13
• sdsdsd
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Problems of manual testing
1. Ad-hoc ☹
Saturday, October 5, 13
• sdsdsd
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Problems of manual testing
1. Ad-hoc ☹
2. Slow & Error Prone ☹
Saturday, October 5, 13
• sdsdsd
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Problems of manual testing
1. Ad-hoc ☹
2. Slow & Error Prone ☹
3. High risk that I missed something ☹
Saturday, October 5, 13
• sdsdsd
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what we need
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what we need
• Fast & Instant feedback
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what we need
• Fast & Instant feedback
• Reusable and organized
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what we need
• Fast & Instant feedback
• Reusable and organized
• Verify that I didn’t break anything.
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
Unit Testing Series
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
Unit Testing Series
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
1. Unit Testing like a Pirate
2. Buccaneering the high seas with PHPUnit
3. Mo’ plugins mo’ problems
4. Steering clear of wreckages and skulls
5. Avast! TDD for sailors and salty dogs
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what is unit testing
“An automated piece of code that
invokes your application code to
check a single assumption.”
— Pirate Dunbar
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what is unit testing
“Separating
the application
design &
implementation
process.”
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what is PHPUNIT
“A command line
tool that runs
unit tests &
reports their
results.”
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what is PHPUNIT
$>phpunit
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what is PHPUNIT
Time: 1 sec, Memory: 8.75Mb
OK (200 tests, 355 assertions)
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what is PHPUNIT
There was 1 failure:
1) WPSkeletonPluginTestAutoloadTest::testThatItsTestingTime
What time is it? - it's testing time! :D
/Users/ptah/Sites/wp.t/public/content/mu-plugins/wp-
skeleton-plugin/tests/WPSkeletonPluginTest/AutoloadTest.php:
9
FAILURES!
Tests: 2, Assertions: 1, Failures: 1.
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what is PHPUNIT
Test Case
a set of conditions or
variables that you set
up in order to assert an
expected outcome.
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
what is PHPUNIT
Test SUITE
A collection of test cases.
Saturday, October 5, 13
<?php
class SubscriptionTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testHasAccessWithPassDueCustomerBlocksAccess()
{
// AAA
}
public function testAddSubscriptionWithInvalidCustIdReturnsWPError()
{
// AAA
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Assertions
“a way of explicitly checking the
assumptions that your code
makes”
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
n• $this->assertTrue();
• $this->assertEquals();
• $this->assertContains();
• $this->assertGreaterThan();
• $this->assertNotNull();
• $this->assertFalse();
• $this->assertNotEquals();
• $this->assertContainsOnly();
• $this->assertLessThan();
• $this->assertType();
Assertions Appendix:
http://phpunit.de/manual/3.7/en/appendixes.assertions.html
common Assertions
Saturday, October 5, 13
“How do I actually write
out the test cases?”
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
http://www.flickr.com/photos/mutsmuts/4695658106
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Anatomy of a test case
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Anatomy of a test case
1. a
2. A
3. A
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Anatomy of a test case
1. A
2. A
3. Assert(check for the expected value)
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Anatomy of a test case
1. A
2. Act(call the method/trigger the action)
3. Assert(check for the expected value)
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Anatomy of a test case
1. arrange (the context)
2. Act(call the method/trigger the action)
3. Assert(check for the expected value)
Saturday, October 5, 13
<?php
class CalculatorTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testAddReturnsSumOfTwoPositiveIntegers()
{
// Arrange
// Act
// Assert
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
int Calculator::add(int $a, int $b);
Saturday, October 5, 13
<?php
class CalculatorTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testAddReturnsSumOfTwoPositiveIntegers()
{
// Arrange
// Act
// Assert
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class CalculatorTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testAddReturnsSumOfTwoPositiveIntegers()
{
// Arrange
// Act
// Assert
$this->assertEquals(3, $result);
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class CalculatorTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testAddReturnsSumOfTwoPositiveIntegers()
{
// Arrange
// Act
$result = $calculator->add($a, $b);
// Assert
$this->assertEquals(3, $result);
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class CalculatorTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testAddReturnsSumOfTwoPositiveIntegers()
{
// Arrange
$calculator = new Calculator();
$a = 1;
$b = 2;
// Act
$result = $calculator->add($a, $b);
// Assert
$this->assertEquals(3, $result);
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class CalculatorTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testAddReturnsSumOfTwoPositiveIntegers()
{
// Arrange
$calculator = new Calculator();
$a = 1;
$b = 2;
// Act
$result = $calculator->add($a, $b);
// Assert
$this->assertEquals(3, $result);
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Time: 148 ms, Memory: 2.75Mb
OK (1 test, 1 assertions)
Saturday, October 5, 13
<?php
class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testSetWithNewDataPersistsToCache()
{
// Arrange
// Act
// Assert
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
bool Cache::set(string $key);
Saturday, October 5, 13
<?php
class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testSetWithNewDataPersistsToCache()
{
// Arrange
// Act
// Assert
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testSetWithNewDataPersistsToCache()
{
// Arrange
// Act
// Assert
$this->assertSame( [ 1, 2, 3 ], $cache->get(‘user_ids’) );
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testSetWithNewDataPersistsToCache()
{
// Arrange
// Act
$cache->add(‘user_ids’, [ 1, 2, 3 ]);
// Assert
$this->assertSame( [ 1, 2, 3 ], $cache->get(‘user_ids’) );
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testSetWithNewDataPersistsToCache()
{
// Arrange
$cache = new LiveNinjaStorageCache();
// Act
$cache->add(‘user_ids’, [ 1, 2, 3 ]);
// Assert
$this->assertSame( [ 1, 2, 3 ], $cache->get(‘user_ids’) );
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testSetWithNewDataPersistsToCache()
{
// Arrange
$cache = new LiveNinjaStorageCache();
// Act
$cache->add(‘user_ids’, [ 1, 2, 3 ]);
// Assert
$this->assertSame( [ 1, 2, 3 ], $cache->get(‘user_ids’) );
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Time: 125 ms, Memory: 2.35Mb
OK (1 test, 1 assertions)
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields()
{
// Arrange
// Act
// Assert
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
object|WP_Error UserService::persist(User $user);
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields()
{
// Arrange
// Act
// Assert
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields()
{
// Arrange
// Act
// Assert
$this->assertInstanceOf(‘WP_Error’, $user);
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields()
{
// Arrange
// Act
$user = $service->persist($inCompleteUserObject);
// Assert
$this->assertInstanceOf(‘WP_Error’, $user);
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields()
{
// Arrange
$service = new LiveNinjaUserService;
$inCompleteUserObject = new LiveNinjaUserEntity(...);
// Act
$user = $service->persist($inCompleteUserObject);
// Assert
$this->assertInstanceOf(‘WP_Error’, $user);
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields()
{
// Arrange
$service = new LiveNinjaUserService;
$inCompleteUserObject = new LiveNinjaUserEntity(...);
// Act
$user = $service->persist($inCompleteUserObject);
// Assert
$this->assertInstanceOf(‘WP_Error’, $user);
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Time: 85 ms, Memory: 1.25Mb
OK (1 test, 1 assertions)
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testGetNinjasWithBlackBeltSubscriptionQuery()
{
// Arrange
// Act
// Assert
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
array|WP_Error UserService::get_ninjas(array $args);
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testGetNinjasWithBlackBeltSubscriptionQuery()
{
// Arrange
// Act
// Assert
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testGetNinjasWithBlackBeltSubscriptionQuery()
{
// Arrange
// Act
// Assert
$this->assertContains($expected, $service->getLastResultAsSQL());
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testGetNinjasWithBlackBeltSubscriptionQuery()
{
// Arrange
// Act
$service->get_ninjas([‘plan’ => ‘blackbelt’]);
// Assert
$this->assertContains($expected, $service->getLastResultAsSQL());
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testGetNinjasWithBlackBeltSubscriptionQuery()
{
// Arrange
$expected = “SELECT * FROM ninjas WHERE ...”;
$service = new LiveNinjaUserService;
// Act
$service->get_ninjas([‘plan’ => ‘blackbelt’]);
// Assert
$this->assertSame($expected, $service->getLastResultAsSQL());
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Saturday, October 5, 13
<?php
class UserServiceTest extends PHPUnit_Framework_TestCase
{
// test cases ...
public function testGetNinjasWithBlackBeltSubscriptionQuery()
{
// Arrange
$expected = “SELECT * FROM ninjas WHERE ...”;
$service = new LiveNinjaUserService;
// Act
$service->get_ninjas([‘plan’ => ‘blackbelt’]);
// Assert
$this->assertContains($expected, $service->getLastResultAsSQL());
}
}
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Time: 101 ms, Memory: 1.55Mb
OK (1 test, 1 assertions)
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
nWAYS TO TEST CODE
• test if/else conditionals
• test all cases in switch
• verify loops contain proper
data.
• Check for expected state
• Check return value type
• Pass unexpected data
• Verify correct amount
• assertContains for SQL
Queries
• Verify that third party
method was called.
• $this->assertType();
• etc...
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
nWAYS TO kickstart your brain
• write out list of requirements for
each feature
• do the UI first
Saturday, October 5, 13
cwp skeleton plugin
https://github.com/ptahdunbar/wp-skeleton-plugin/
Saturday, October 5, 13
UNIT TESTING like A PIRATE — @ptahdunbar #wceu
Thank you!
Slides - http://ptahdunbar.com/
cPirate Dunbar
Saturday, October 5, 13

Contenu connexe

Similaire à Unit testing like a pirate #wceu 2013

Building scalable applications while scaling your infrastructure by rhommel l...
Building scalable applications while scaling your infrastructure by rhommel l...Building scalable applications while scaling your infrastructure by rhommel l...
Building scalable applications while scaling your infrastructure by rhommel l...Puppet
 
Using Orchestration in Puppet Enterprise 3 - PuppetConf 2013
Using Orchestration in Puppet Enterprise 3 - PuppetConf 2013Using Orchestration in Puppet Enterprise 3 - PuppetConf 2013
Using Orchestration in Puppet Enterprise 3 - PuppetConf 2013Puppet
 
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...Pablo Godel
 
What Is This Continuous Delivery Thing Anyway? - PuppetConf 2013
What Is This Continuous Delivery Thing Anyway? - PuppetConf 2013What Is This Continuous Delivery Thing Anyway? - PuppetConf 2013
What Is This Continuous Delivery Thing Anyway? - PuppetConf 2013Puppet
 
Specking Interactors with PHPSpec and YOLO (DDD) at PHPConference Argentina 2013
Specking Interactors with PHPSpec and YOLO (DDD) at PHPConference Argentina 2013Specking Interactors with PHPSpec and YOLO (DDD) at PHPConference Argentina 2013
Specking Interactors with PHPSpec and YOLO (DDD) at PHPConference Argentina 2013cordoval
 
Ab(Using) the MetaCPAN API for Fun and Profit v2013
Ab(Using) the MetaCPAN API for Fun and Profit v2013Ab(Using) the MetaCPAN API for Fun and Profit v2013
Ab(Using) the MetaCPAN API for Fun and Profit v2013Olaf Alders
 
Automated Unit Testing
Automated Unit TestingAutomated Unit Testing
Automated Unit TestingMike Lively
 
Node Tools For Your Grails Toolbox - Gr8Conf 2013
Node Tools For Your Grails Toolbox - Gr8Conf 2013Node Tools For Your Grails Toolbox - Gr8Conf 2013
Node Tools For Your Grails Toolbox - Gr8Conf 2013zanthrash
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkJeremy Kendall
 
Releasing Puppet: Automating Packaging for Many Platforms or 'Make all the th...
Releasing Puppet: Automating Packaging for Many Platforms or 'Make all the th...Releasing Puppet: Automating Packaging for Many Platforms or 'Make all the th...
Releasing Puppet: Automating Packaging for Many Platforms or 'Make all the th...Puppet
 
Cooking an Omelette with Chef
Cooking an Omelette with ChefCooking an Omelette with Chef
Cooking an Omelette with Chefctaintor
 
Testing Drupal with Ghosts and Gherkin
Testing Drupal  with Ghosts and GherkinTesting Drupal  with Ghosts and Gherkin
Testing Drupal with Ghosts and GherkinPhase2
 
Apache TomEE, Java EE 6 Web Profile on Tomcat - David Blevins
Apache TomEE, Java EE 6 Web Profile on Tomcat - David BlevinsApache TomEE, Java EE 6 Web Profile on Tomcat - David Blevins
Apache TomEE, Java EE 6 Web Profile on Tomcat - David Blevinsjaxconf
 
Node Security Project - LXJS 2013
Node Security Project - LXJS 2013Node Security Project - LXJS 2013
Node Security Project - LXJS 2013Adam Baldwin
 
Forging Great Modules: Standards, Tools and Patterns - PuppetConf 2013
Forging Great Modules: Standards, Tools and Patterns - PuppetConf 2013Forging Great Modules: Standards, Tools and Patterns - PuppetConf 2013
Forging Great Modules: Standards, Tools and Patterns - PuppetConf 2013Puppet
 
Scaling PHP to 40 Million Uniques
Scaling PHP to 40 Million UniquesScaling PHP to 40 Million Uniques
Scaling PHP to 40 Million UniquesJonathan Klein
 
Automated Testing in WordPress, Really?!
Automated Testing in WordPress, Really?!Automated Testing in WordPress, Really?!
Automated Testing in WordPress, Really?!Ptah Dunbar
 
A Big Look at MiniTest
A Big Look at MiniTestA Big Look at MiniTest
A Big Look at MiniTestMark
 
Corpus collapsum: Partition tolerance of Galera put to test
Corpus collapsum: Partition tolerance of Galera put to testCorpus collapsum: Partition tolerance of Galera put to test
Corpus collapsum: Partition tolerance of Galera put to testRaghavendra Prabhu
 
Teaching Programming Online
Teaching Programming OnlineTeaching Programming Online
Teaching Programming OnlinePamela Fox
 

Similaire à Unit testing like a pirate #wceu 2013 (20)

Building scalable applications while scaling your infrastructure by rhommel l...
Building scalable applications while scaling your infrastructure by rhommel l...Building scalable applications while scaling your infrastructure by rhommel l...
Building scalable applications while scaling your infrastructure by rhommel l...
 
Using Orchestration in Puppet Enterprise 3 - PuppetConf 2013
Using Orchestration in Puppet Enterprise 3 - PuppetConf 2013Using Orchestration in Puppet Enterprise 3 - PuppetConf 2013
Using Orchestration in Puppet Enterprise 3 - PuppetConf 2013
 
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
 
What Is This Continuous Delivery Thing Anyway? - PuppetConf 2013
What Is This Continuous Delivery Thing Anyway? - PuppetConf 2013What Is This Continuous Delivery Thing Anyway? - PuppetConf 2013
What Is This Continuous Delivery Thing Anyway? - PuppetConf 2013
 
Specking Interactors with PHPSpec and YOLO (DDD) at PHPConference Argentina 2013
Specking Interactors with PHPSpec and YOLO (DDD) at PHPConference Argentina 2013Specking Interactors with PHPSpec and YOLO (DDD) at PHPConference Argentina 2013
Specking Interactors with PHPSpec and YOLO (DDD) at PHPConference Argentina 2013
 
Ab(Using) the MetaCPAN API for Fun and Profit v2013
Ab(Using) the MetaCPAN API for Fun and Profit v2013Ab(Using) the MetaCPAN API for Fun and Profit v2013
Ab(Using) the MetaCPAN API for Fun and Profit v2013
 
Automated Unit Testing
Automated Unit TestingAutomated Unit Testing
Automated Unit Testing
 
Node Tools For Your Grails Toolbox - Gr8Conf 2013
Node Tools For Your Grails Toolbox - Gr8Conf 2013Node Tools For Your Grails Toolbox - Gr8Conf 2013
Node Tools For Your Grails Toolbox - Gr8Conf 2013
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro framework
 
Releasing Puppet: Automating Packaging for Many Platforms or 'Make all the th...
Releasing Puppet: Automating Packaging for Many Platforms or 'Make all the th...Releasing Puppet: Automating Packaging for Many Platforms or 'Make all the th...
Releasing Puppet: Automating Packaging for Many Platforms or 'Make all the th...
 
Cooking an Omelette with Chef
Cooking an Omelette with ChefCooking an Omelette with Chef
Cooking an Omelette with Chef
 
Testing Drupal with Ghosts and Gherkin
Testing Drupal  with Ghosts and GherkinTesting Drupal  with Ghosts and Gherkin
Testing Drupal with Ghosts and Gherkin
 
Apache TomEE, Java EE 6 Web Profile on Tomcat - David Blevins
Apache TomEE, Java EE 6 Web Profile on Tomcat - David BlevinsApache TomEE, Java EE 6 Web Profile on Tomcat - David Blevins
Apache TomEE, Java EE 6 Web Profile on Tomcat - David Blevins
 
Node Security Project - LXJS 2013
Node Security Project - LXJS 2013Node Security Project - LXJS 2013
Node Security Project - LXJS 2013
 
Forging Great Modules: Standards, Tools and Patterns - PuppetConf 2013
Forging Great Modules: Standards, Tools and Patterns - PuppetConf 2013Forging Great Modules: Standards, Tools and Patterns - PuppetConf 2013
Forging Great Modules: Standards, Tools and Patterns - PuppetConf 2013
 
Scaling PHP to 40 Million Uniques
Scaling PHP to 40 Million UniquesScaling PHP to 40 Million Uniques
Scaling PHP to 40 Million Uniques
 
Automated Testing in WordPress, Really?!
Automated Testing in WordPress, Really?!Automated Testing in WordPress, Really?!
Automated Testing in WordPress, Really?!
 
A Big Look at MiniTest
A Big Look at MiniTestA Big Look at MiniTest
A Big Look at MiniTest
 
Corpus collapsum: Partition tolerance of Galera put to test
Corpus collapsum: Partition tolerance of Galera put to testCorpus collapsum: Partition tolerance of Galera put to test
Corpus collapsum: Partition tolerance of Galera put to test
 
Teaching Programming Online
Teaching Programming OnlineTeaching Programming Online
Teaching Programming Online
 

Dernier

Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DaySri Ambati
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 

Dernier (20)

Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 

Unit testing like a pirate #wceu 2013

  • 1. UNIT TESTING likea cPirate WordCamp Europe 2013 with pirate dunbar Saturday, October 5, 13
  • 2. UNIT TESTING like A PIRATE — @ptahdunbar #wceu YES, I am a Pirate. Saturday, October 5, 13
  • 3. UNIT TESTING like A PIRATE — @ptahdunbar #wceu nAPP Platform WordPress as a Saturday, October 5, 13
  • 4. UNIT TESTING like A PIRATE — @ptahdunbar #wceu nAPP Platform WordPress as a Video chat marketplace for experts to monetize their know-how. Saturday, October 5, 13
  • 5. UNIT TESTING like A PIRATE — @ptahdunbar #wceu nAPP Platform WordPress as a “I think WordPress is going in a direction that isn’t well framed or described by any existing alternatives or historical platforms.” — Matt Mullenweghttp://jakegoldman.me/2013/09/wordpress-app-platform/ Saturday, October 5, 13
  • 6. “Plugins represent the heartbeat of WordPress.” UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 7. • sdsdsd UNIT TESTING like A PIRATE — @ptahdunbar #wceu “The result is that a lot of the plugins are written in poor code and turn out to be poorly compatible with other plugins.” — Yoast http://yoast.com/plugin-future/ Saturday, October 5, 13
  • 8. UNIT TESTING like A PIRATE — @ptahdunbar #wceu Manual Testing Saturday, October 5, 13
  • 9. • sdsdsd UNIT TESTING like A PIRATE — @ptahdunbar #wceu Problems of manual testing 1. Ad-hoc ☹ Saturday, October 5, 13
  • 10. • sdsdsd UNIT TESTING like A PIRATE — @ptahdunbar #wceu Problems of manual testing 1. Ad-hoc ☹ 2. Slow & Error Prone ☹ Saturday, October 5, 13
  • 11. • sdsdsd UNIT TESTING like A PIRATE — @ptahdunbar #wceu Problems of manual testing 1. Ad-hoc ☹ 2. Slow & Error Prone ☹ 3. High risk that I missed something ☹ Saturday, October 5, 13
  • 12. • sdsdsd UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 13. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what we need Saturday, October 5, 13
  • 14. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what we need • Fast & Instant feedback Saturday, October 5, 13
  • 15. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what we need • Fast & Instant feedback • Reusable and organized Saturday, October 5, 13
  • 16. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what we need • Fast & Instant feedback • Reusable and organized • Verify that I didn’t break anything. Saturday, October 5, 13
  • 17. UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 18. UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 19. Unit Testing Series UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 20. Unit Testing Series UNIT TESTING like A PIRATE — @ptahdunbar #wceu 1. Unit Testing like a Pirate 2. Buccaneering the high seas with PHPUnit 3. Mo’ plugins mo’ problems 4. Steering clear of wreckages and skulls 5. Avast! TDD for sailors and salty dogs Saturday, October 5, 13
  • 21. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what is unit testing “An automated piece of code that invokes your application code to check a single assumption.” — Pirate Dunbar Saturday, October 5, 13
  • 22. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what is unit testing “Separating the application design & implementation process.” Saturday, October 5, 13
  • 23. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what is PHPUNIT “A command line tool that runs unit tests & reports their results.” Saturday, October 5, 13
  • 24. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what is PHPUNIT $>phpunit Saturday, October 5, 13
  • 25. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what is PHPUNIT Time: 1 sec, Memory: 8.75Mb OK (200 tests, 355 assertions) Saturday, October 5, 13
  • 26. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what is PHPUNIT There was 1 failure: 1) WPSkeletonPluginTestAutoloadTest::testThatItsTestingTime What time is it? - it's testing time! :D /Users/ptah/Sites/wp.t/public/content/mu-plugins/wp- skeleton-plugin/tests/WPSkeletonPluginTest/AutoloadTest.php: 9 FAILURES! Tests: 2, Assertions: 1, Failures: 1. Saturday, October 5, 13
  • 27. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what is PHPUNIT Test Case a set of conditions or variables that you set up in order to assert an expected outcome. Saturday, October 5, 13
  • 28. UNIT TESTING like A PIRATE — @ptahdunbar #wceu what is PHPUNIT Test SUITE A collection of test cases. Saturday, October 5, 13
  • 29. <?php class SubscriptionTest extends PHPUnit_Framework_TestCase { // test cases ... public function testHasAccessWithPassDueCustomerBlocksAccess() { // AAA } public function testAddSubscriptionWithInvalidCustIdReturnsWPError() { // AAA } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 30. UNIT TESTING like A PIRATE — @ptahdunbar #wceu Assertions “a way of explicitly checking the assumptions that your code makes” Saturday, October 5, 13
  • 31. UNIT TESTING like A PIRATE — @ptahdunbar #wceu n• $this->assertTrue(); • $this->assertEquals(); • $this->assertContains(); • $this->assertGreaterThan(); • $this->assertNotNull(); • $this->assertFalse(); • $this->assertNotEquals(); • $this->assertContainsOnly(); • $this->assertLessThan(); • $this->assertType(); Assertions Appendix: http://phpunit.de/manual/3.7/en/appendixes.assertions.html common Assertions Saturday, October 5, 13
  • 32. “How do I actually write out the test cases?” UNIT TESTING like A PIRATE — @ptahdunbar #wceu http://www.flickr.com/photos/mutsmuts/4695658106 Saturday, October 5, 13
  • 33. UNIT TESTING like A PIRATE — @ptahdunbar #wceu Anatomy of a test case Saturday, October 5, 13
  • 34. UNIT TESTING like A PIRATE — @ptahdunbar #wceu Anatomy of a test case 1. a 2. A 3. A Saturday, October 5, 13
  • 35. UNIT TESTING like A PIRATE — @ptahdunbar #wceu Anatomy of a test case 1. A 2. A 3. Assert(check for the expected value) Saturday, October 5, 13
  • 36. UNIT TESTING like A PIRATE — @ptahdunbar #wceu Anatomy of a test case 1. A 2. Act(call the method/trigger the action) 3. Assert(check for the expected value) Saturday, October 5, 13
  • 37. UNIT TESTING like A PIRATE — @ptahdunbar #wceu Anatomy of a test case 1. arrange (the context) 2. Act(call the method/trigger the action) 3. Assert(check for the expected value) Saturday, October 5, 13
  • 38. <?php class CalculatorTest extends PHPUnit_Framework_TestCase { // test cases ... public function testAddReturnsSumOfTwoPositiveIntegers() { // Arrange // Act // Assert } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu int Calculator::add(int $a, int $b); Saturday, October 5, 13
  • 39. <?php class CalculatorTest extends PHPUnit_Framework_TestCase { // test cases ... public function testAddReturnsSumOfTwoPositiveIntegers() { // Arrange // Act // Assert } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 40. <?php class CalculatorTest extends PHPUnit_Framework_TestCase { // test cases ... public function testAddReturnsSumOfTwoPositiveIntegers() { // Arrange // Act // Assert $this->assertEquals(3, $result); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 41. <?php class CalculatorTest extends PHPUnit_Framework_TestCase { // test cases ... public function testAddReturnsSumOfTwoPositiveIntegers() { // Arrange // Act $result = $calculator->add($a, $b); // Assert $this->assertEquals(3, $result); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 42. <?php class CalculatorTest extends PHPUnit_Framework_TestCase { // test cases ... public function testAddReturnsSumOfTwoPositiveIntegers() { // Arrange $calculator = new Calculator(); $a = 1; $b = 2; // Act $result = $calculator->add($a, $b); // Assert $this->assertEquals(3, $result); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 43. <?php class CalculatorTest extends PHPUnit_Framework_TestCase { // test cases ... public function testAddReturnsSumOfTwoPositiveIntegers() { // Arrange $calculator = new Calculator(); $a = 1; $b = 2; // Act $result = $calculator->add($a, $b); // Assert $this->assertEquals(3, $result); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Time: 148 ms, Memory: 2.75Mb OK (1 test, 1 assertions) Saturday, October 5, 13
  • 44. <?php class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase { // test cases ... public function testSetWithNewDataPersistsToCache() { // Arrange // Act // Assert } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu bool Cache::set(string $key); Saturday, October 5, 13
  • 45. <?php class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase { // test cases ... public function testSetWithNewDataPersistsToCache() { // Arrange // Act // Assert } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 46. <?php class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase { // test cases ... public function testSetWithNewDataPersistsToCache() { // Arrange // Act // Assert $this->assertSame( [ 1, 2, 3 ], $cache->get(‘user_ids’) ); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 47. <?php class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase { // test cases ... public function testSetWithNewDataPersistsToCache() { // Arrange // Act $cache->add(‘user_ids’, [ 1, 2, 3 ]); // Assert $this->assertSame( [ 1, 2, 3 ], $cache->get(‘user_ids’) ); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 48. <?php class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase { // test cases ... public function testSetWithNewDataPersistsToCache() { // Arrange $cache = new LiveNinjaStorageCache(); // Act $cache->add(‘user_ids’, [ 1, 2, 3 ]); // Assert $this->assertSame( [ 1, 2, 3 ], $cache->get(‘user_ids’) ); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 49. <?php class LiveNinjaCacheTest extends PHPUnit_Framework_TestCase { // test cases ... public function testSetWithNewDataPersistsToCache() { // Arrange $cache = new LiveNinjaStorageCache(); // Act $cache->add(‘user_ids’, [ 1, 2, 3 ]); // Assert $this->assertSame( [ 1, 2, 3 ], $cache->get(‘user_ids’) ); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Time: 125 ms, Memory: 2.35Mb OK (1 test, 1 assertions) Saturday, October 5, 13
  • 50. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields() { // Arrange // Act // Assert } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu object|WP_Error UserService::persist(User $user); Saturday, October 5, 13
  • 51. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields() { // Arrange // Act // Assert } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 52. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields() { // Arrange // Act // Assert $this->assertInstanceOf(‘WP_Error’, $user); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 53. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields() { // Arrange // Act $user = $service->persist($inCompleteUserObject); // Assert $this->assertInstanceOf(‘WP_Error’, $user); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 54. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields() { // Arrange $service = new LiveNinjaUserService; $inCompleteUserObject = new LiveNinjaUserEntity(...); // Act $user = $service->persist($inCompleteUserObject); // Assert $this->assertInstanceOf(‘WP_Error’, $user); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 55. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testPersistReturnsWPErrorIfItDoesntContainRequiredFields() { // Arrange $service = new LiveNinjaUserService; $inCompleteUserObject = new LiveNinjaUserEntity(...); // Act $user = $service->persist($inCompleteUserObject); // Assert $this->assertInstanceOf(‘WP_Error’, $user); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Time: 85 ms, Memory: 1.25Mb OK (1 test, 1 assertions) Saturday, October 5, 13
  • 56. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testGetNinjasWithBlackBeltSubscriptionQuery() { // Arrange // Act // Assert } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu array|WP_Error UserService::get_ninjas(array $args); Saturday, October 5, 13
  • 57. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testGetNinjasWithBlackBeltSubscriptionQuery() { // Arrange // Act // Assert } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 58. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testGetNinjasWithBlackBeltSubscriptionQuery() { // Arrange // Act // Assert $this->assertContains($expected, $service->getLastResultAsSQL()); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 59. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testGetNinjasWithBlackBeltSubscriptionQuery() { // Arrange // Act $service->get_ninjas([‘plan’ => ‘blackbelt’]); // Assert $this->assertContains($expected, $service->getLastResultAsSQL()); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 60. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testGetNinjasWithBlackBeltSubscriptionQuery() { // Arrange $expected = “SELECT * FROM ninjas WHERE ...”; $service = new LiveNinjaUserService; // Act $service->get_ninjas([‘plan’ => ‘blackbelt’]); // Assert $this->assertSame($expected, $service->getLastResultAsSQL()); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Saturday, October 5, 13
  • 61. <?php class UserServiceTest extends PHPUnit_Framework_TestCase { // test cases ... public function testGetNinjasWithBlackBeltSubscriptionQuery() { // Arrange $expected = “SELECT * FROM ninjas WHERE ...”; $service = new LiveNinjaUserService; // Act $service->get_ninjas([‘plan’ => ‘blackbelt’]); // Assert $this->assertContains($expected, $service->getLastResultAsSQL()); } } UNIT TESTING like A PIRATE — @ptahdunbar #wceu Time: 101 ms, Memory: 1.55Mb OK (1 test, 1 assertions) Saturday, October 5, 13
  • 62. UNIT TESTING like A PIRATE — @ptahdunbar #wceu nWAYS TO TEST CODE • test if/else conditionals • test all cases in switch • verify loops contain proper data. • Check for expected state • Check return value type • Pass unexpected data • Verify correct amount • assertContains for SQL Queries • Verify that third party method was called. • $this->assertType(); • etc... Saturday, October 5, 13
  • 63. UNIT TESTING like A PIRATE — @ptahdunbar #wceu nWAYS TO kickstart your brain • write out list of requirements for each feature • do the UI first Saturday, October 5, 13
  • 65. UNIT TESTING like A PIRATE — @ptahdunbar #wceu Thank you! Slides - http://ptahdunbar.com/ cPirate Dunbar Saturday, October 5, 13