SlideShare uma empresa Scribd logo
1 de 65
Baixar para ler offline
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

Mais conteúdo relacionado

Semelhante a 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
 

Semelhante a 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
 

Último

Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkPixlogix Infotech
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...itnewsafrica
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Kaya Weers
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 

Último (20)

Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App Framework
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 

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