SlideShare una empresa de Scribd logo
1 de 65
Descargar para leer sin conexión
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

Más contenido relacionado

Similar a Unit testing like a pirate #wceu 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
cordoval
 
Node Security Project - LXJS 2013
Node Security Project - LXJS 2013Node Security Project - LXJS 2013
Node Security Project - LXJS 2013
Adam 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 2013
Puppet
 

Similar 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

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Último (20)

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 

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