SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
Welcome!

  New Features in PHPUnit 3.3




         Sebastian Bergmann
    http://sebastian-bergmann.de/




           June 14th 2008
Who I am


           ●   Sebastian Bergmann
           ●   Involved in the
               PHP Project since 2000
           ●   Developer of PHPUnit
           ●   Author, Consultant,
               Coach, Trainer
PHPUnit


●   Test Framework
    –   Member of the xUnit family of test frameworks
    –   Mock Objects
    –   DbUnit
●   Integration
    –   Selenium RC
    –   phpUnderControl, CruiseControl, ...
●   Even More Cool Stuff :-)
    –   Code Coverage, Software Metrics, and “Mess Detection”
    –   Test Database
    –   Mutation Testing (GSoC07 project)
Unit Tests with PHPUnit

<?php
require_once 'PHPUnit/Framework/TestCase.php';


class BowlingGameTest extends PHPUnit_Framework_TestCase
{




}
Unit Tests with PHPUnit

<?php
require_once 'PHPUnit/Framework/TestCase.php';


class BowlingGameTest extends PHPUnit_Framework_TestCase
{
    public function testScoreForOneSpareAnd3Is16()
    {




    }
}
Unit Tests with PHPUnit

<?php
require_once 'PHPUnit/Framework/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameTest extends PHPUnit_Framework_TestCase
{
    public function testScoreForOneSpareAnd3Is16()
    {
        $game = new BowlingGame;




    }
}
Unit Tests with PHPUnit

<?php
require_once 'PHPUnit/Framework/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameTest extends PHPUnit_Framework_TestCase
{
    public function testScoreForOneSpareAnd3Is16()
    {
        $game = new BowlingGame;

        $game->roll(5);
        $game->roll(5);
        $game->roll(3);

        for ($i = 4; $i <= 20; $i++) {
            $game->roll(0);
        }


    }
}
Unit Tests with PHPUnit

<?php
require_once 'PHPUnit/Framework/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameTest extends PHPUnit_Framework_TestCase
{
    public function testScoreForOneSpareAnd3Is16()
    {
        $game = new BowlingGame;

        $game->roll(5);
        $game->roll(5);
        $game->roll(3);

        for ($i = 4; $i <= 20; $i++) {
            $game->roll(0);
        }

        $this->assertEquals(16, $this->game->score());
    }
}
Unit Tests with PHPUnit



    sb@vmware ~ % phpunit BowlingGameTest
    PHPUnit 3.3.0 by Sebastian Bergmann.

    .

    Time: 0 seconds


    OK (1 test, 1 annotation)
Annotations
@assert
          <?php
          class Calculator
          {
              /**
               * @assert (1, 2) == 3
               */
              public function add($a, $b)
              {
                  return $a + $b;
              }

              /**
               * @assert (2, 1) == 1
               */
              public function sub($a, $b)
              {
                  return $a - $b;
              }
          }
Annotations
@assert



          sb@vmware ~ % phpunit Calculator
          PHPUnit 3.3.0 by Sebastian Bergmann.

          ..

          Time: 0 seconds


          OK (2 tests, 2 annotations)
Annotations
@expectedException



<?php
class ExceptionTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException InvalidArgumentException
     */
    public function testException()
    {
    }
}
Annotations
@expectedException



    sb@vmware ~ % phpunit ExceptionTest
    PHPUnit 3.3.0 by Sebastian Bergmann.

    F

    Time: 0 seconds

    There was 1 failure:

    1) testException(ExceptionTest)
    Expected exception InvalidArgumentException

    FAILURES!
    Tests: 1, Assertions: 0, Failures: 1.
Annotations
@dataProvider
   <?php
   class DataTest extends PHPUnit_Framework_TestCase
   {
       /**
         * @dataProvider providerMethod
         */
       public function testAdd($a, $b, $c)
       {
            $this->assertEquals($c, $a + $b);
       }

       public static function providerMethod()
       {
           return array(
              array(0, 0, 0),
              array(0, 1, 1),
              array(1, 1, 3),
              array(1, 0, 1)
           );
       }
   }
Annotations
@dataProvider


sb@vmware ~ % phpunit DataTest
PHPUnit 3.3.0 by Sebastian Bergmann.

..F.

Time: 0 seconds

There was 1 failure:

1) testAdd(DataTest) with data (1, 1, 3)
Failed asserting that <integer:2> matches expected
value <integer:3>.
/home/sb/DataTest.php:19

FAILURES!
Tests: 4, Assertions:4, Failures: 1.
Annotations
@group
  <?php
  class SomeTest extends PHPUnit_Framework_TestCase
  {
      /**
       * @group specification
       */
      public function testSomething()
      {
      }

      /**
       * @group regresssion
       * @group bug2204
       */
      public function testSomethingElse()
      {
      }
  }
Annotations
@group
    sb@vmware ~ % phpunit SomeTest
    PHPUnit 3.3.0 by Sebastian Bergmann.

    ..

    Time: 0 seconds


    OK (2 tests, 2 annotations)


    sb@vmware ~ % phpunit --group bug2204 SomeTest
    PHPUnit 3.3.0 by Sebastian Bergmann.

    .

    Time: 0 seconds


    OK (1 test, 1 annotation)
Annotations
@test
<?php
class Specification extends PHPUnit_Framework_TestCase
{
    /**
     * @test
     */
    public function shouldDoSomething()
    {
    }

    /**
     * @test
     */
    public function shouldDoSomethingElse()
    {
    }
}
Annotations
@test




    sb@vmware ~ % phpunit --testdox Specification
    PHPUnit 3.3.0 by Sebastian Bergmann.

    Specification
     [x] Should do something
     [x] Should do something else
Behaviour-Driven Development


●   Extreme Programming originally had the rule to
    test everything that could possibly break
●   Now, however, the practice of testing in
    Extreme Programming has evolved into
    Test-Driven Development
●   But the tools still force developers to think in terms
    of tests and assertions instead of specifications
    A New Look At Test-Driven Development,
    Dave Astels.
    http://blog.daveastels.com/files/BDD_Intro.pdf
Behaviour-Driven Development

<?php
require_once 'PHPUnit/Extensions/Story/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
{




}
Behaviour-Driven Development

<?php
require_once 'PHPUnit/Extensions/Story/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
{
    /**
     * @scenario
     */
    public function scoreForOneSpareAnd3Is16()
    {




    }

    // ...
}
Behaviour-Driven Development

<?php
require_once 'PHPUnit/Extensions/Story/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
{
    /**
     * @scenario
     */
    public function scoreForOneSpareAnd3Is16()
    {
        $this->given('New game')




    }

    // ...
}
Behaviour-Driven Development

<?php
require_once 'PHPUnit/Extensions/Story/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
{
    /**
     * @scenario
     */
    public function scoreForOneSpareAnd3Is16()
    {
        $this->given('New game')
             ->when('Player rolls', 5)



    }

    // ...
}
Behaviour-Driven Development

<?php
require_once 'PHPUnit/Extensions/Story/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
{
    /**
     * @scenario
     */
    public function scoreForOneSpareAnd3Is16()
    {
        $this->given('New game')
             ->when('Player rolls', 5)
             ->and('Player rolls', 5)


    }

    // ...
}
Behaviour-Driven Development

<?php
require_once 'PHPUnit/Extensions/Story/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
{
    /**
     * @scenario
     */
    public function scoreForOneSpareAnd3Is16()
    {
        $this->given('New game')
             ->when('Player rolls', 5)
             ->and('Player rolls', 5)
             ->and('Player rolls', 3)

    }

    // ...
}
Behaviour-Driven Development

<?php
require_once 'PHPUnit/Extensions/Story/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
{
    /**
     * @scenario
     */
    public function scoreForOneSpareAnd3Is16()
    {
        $this->given('New game')
             ->when('Player rolls', 5)
             ->and('Player rolls', 5)
             ->and('Player rolls', 3)
             ->then('Score should be', 16);
    }

    // ...
}
Behaviour-Driven Development

<?php
require_once 'PHPUnit/Extensions/Story/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
{
    // ...

    public function runGiven(&$world, $action, $arguments)
    {
        switch($action) {
            case 'New game': {
                $world['game'] = new BowlingGame;
                $world['rolls'] = 0;
            }
            break;

            default: {
                return $this->notImplemented($action);
            }
        }
    }
}
Behaviour-Driven Development

<?php
require_once 'PHPUnit/Extensions/Story/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
{
    // ...

    public function runWhen(&$world, $action, $arguments)
    {
        switch($action) {
            case 'Player rolls': {
                $world['game']->roll($arguments[0]);
                $world['rolls']++;
            }
            break;

            default: {
                return $this->notImplemented($action);
            }
        }
    }
}
Behaviour-Driven Development

<?php
require_once 'PHPUnit/Extensions/Story/TestCase.php';
require_once 'BowlingGame.php';

class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
{
    // ...

    public function runThen(&$world, $action, $arguments)
    {
        switch($action) {
            case 'Score should be': {
                for ($i = $world['rolls']; $i < 20; $i++) {
                    $world['game']->roll(0);
                }

               $this->assertEquals($arguments[0], $world['game']->score());
            }
            break;

            default: {
                return $this->notImplemented($action);
            }
        }
    }
}
Behaviour-Driven Development

sb@vmware ~ % phpunit --story BowlingGameSpec
PHPUnit 3.3.0 by Sebastian Bergmann.

BowlingGameSpec
 - Score for one spare and 3 is 16 [successful]

  Given   New game
   When   Player rolls   5
    and   Player rolls   5
    and   Player rolls   3
   Then   Score should   be 16

Scenarios: 1, Failed: 0, Skipped: 0, Incomplete: 0.



sb@vmware ~ % phpunit --testdox BowlingGameSpec
PHPUnit 3.3.0 by Sebastian Bergmann.

BowlingGameSpec
 [x] Score for one spare and 3 is 16
Generating Code from Tests

<?php
class BowlingGameTest extends PHPUnit_Framework_TestCase {
    protected $game;

    protected function setUp() {
        $this->game = new BowlingGame;
    }

    protected function rollMany($n, $pins) {
        for ($i = 0; $i < $n; $i++) {
            $this->game->roll($pins);
        }
    }

    public function testScoreForGutterGameIs0() {
        $this->rollMany(20, 0);
        $this->assertEquals(0, $this->game->score());
    }
}
Generating Code from Tests

sb@vmware ~ % phpunit --skeleton-class BowlingGameTest
PHPUnit 3.3.0 by Sebastian Bergmann.

Wrote skeleton for quot;BowlingGamequot; to quot;BowlingGame.phpquot;.


<?php
class BowlingGame
{
    /**
     * @todo Implement roll().
     */
    public function roll()
    {
        // Remove the following line when you implement this method.
        throw new RuntimeException('Not yet implemented.');
    }

     /**
      * @todo Implement score().
      */
     public function score()
     {
         // Remove the following line when you implement this method.
         throw new RuntimeException('Not yet implemented.');
     }
}
?>
Generating Code from Tests

<?php
class BowlingGameTest extends PHPUnit_Framework_TestCase {
    protected $game;

    protected function setUp() {
        $this->game = new BowlingGame;
    }

    protected function rollMany($n, $pins) {
        for ($i = 0; $i < $n; $i++) {
            $this->game->roll($pins);
        }
    }

    public function testScoreForGutterGameIs0() {
        $this->rollMany(20, 0);
        $this->assertEquals(0, $this->game->score());
    }
}
Generating Code from Tests

<?php
class BowlingGameTest extends PHPUnit_Framework_TestCase {
    protected $game;

    protected function setUp() {
        $this->game = new BowlingGame;
    }

    protected function rollMany($n, $pins) {
        for ($i = 0; $i < $n; $i++) {
            $this->game->roll($pins);
        }
    }

    public function testScoreForGutterGameIs0() {
        $this->rollMany(20, 0);
        $this->assertEquals(0, $this->game->score());
    }
}
Generating Code from Tests

<?php
class BowlingGameTest extends PHPUnit_Framework_TestCase {
    protected $game;

    protected function setUp() {
        $this->game = new BowlingGame;
    }

    protected function rollMany($n, $pins) {
        for ($i = 0; $i < $n; $i++) {
            $this->game->roll($pins);
        }
    }

    public function testScoreForGutterGameIs0() {
        $this->rollMany(20, 0);
        $this->assertEquals(0, $this->game->score());
    }
}
Generating Code from Tests

<?php
class BowlingGameTest extends PHPUnit_Framework_TestCase {
    protected $game;

    protected function setUp() {
        $this->game = new BowlingGame;
    }

    protected function rollMany($n, $pins) {
        for ($i = 0; $i < $n; $i++) {
            $this->game->roll($pins);
        }
    }

    public function testScoreForGutterGameIs0() {
        $this->rollMany(20, 0);
        $this->assertEquals(0, $this->game->score());
    }
}
Generating Code from Tests

<?php
class BowlingGameTest extends PHPUnit_Framework_TestCase {
    protected $game;

    protected function setUp() {
        $this->game = new BowlingGame;
    }

    protected function rollMany($n, $pins) {
        for ($i = 0; $i < $n; $i++) {
            $this->game->roll($pins);
        }
    }

    public function testScoreForGutterGameIs0() {
        $this->rollMany(20, 0);
        $this->assertEquals(0, $this->game->score());
    }
}
Mock Objects
returnArgument()
<?php
class StubTest extends PHPUnit_Framework_TestCase
{
    public function testReturnArgumentStub()
    {
        $stub = $this->getMock(
           'SomeClass', array('doSomething')
        );

        $stub->expects($this->any())
             ->method('doSomething')
             ->will($this->returnArgument(1));

        // $stub->doSomething('foo') returns 'foo'
        // $stub->doSomething('bar') returns 'bar'
    }
}
Mock Objects
returnCallback()
<?php
class StubTest extends PHPUnit_Framework_TestCase
{
    public function testReturnCallbackStub()
    {
        $stub = $this->getMock(
           'SomeClass', array('doSomething')
        );

        $stub->expects($this->any())
             ->method('doSomething')
             ->will($this->returnCallback('callback'));

        // $stub->doSomething() returns callback(...)
    }
}

function callback() {
    $args = func_get_args();
    // ...
}
TextUI Testrunner
Counting of assertions
sb@vmware ~ % phpunit BowlingGameTest
PHPUnit 3.3.0 by Sebastian Bergmann.

.

Time: 0 seconds


OK (1 test, 1 assertions)
TextUI Testrunner
Colours!
sb@vmware ~ % phpunit --ansi BowlingGameTest
PHPUnit 3.3.0 by Sebastian Bergmann.

.

Time: 0 seconds


            1
OK (1 test, 0 assertions)
TextUI Testrunner
Counting of assertions
sb@vmware ~ % phpunit BowlingGameTest
PHPUnit 3.3.0 by Sebastian Bergmann.

.F

Time: 0 seconds

There was 1 failure:

1) testAllOnes(BowlingGameTest)
Failed asserting that <integer:0> matches expected value <integer:20>.
/home/sb/BowlingGameTest.php:25

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.
TextUI Testrunner
Colours!
sb@vmware ~ % phpunit --ansi BowlingGameTest
PHPUnit 3.3.0 by Sebastian Bergmann.

.F

Time: 0 seconds

There was 1 failure:

1) testAllOnes(BowlingGameTest)
Failed asserting that <integer:0> matches expected value <integer:20>.
/home/sb/BowlingGameTest.php:25

FAILURES!
Tests: 1, Failures: 1.2, Failures: 1.
       2, Assertions:
PHPUnit 3.3
Other new features


●   New assertions
    –   assertXmlFileTag(), assertXmlFileNotTag()
    –   assertXmlStringTag(), assertXmlStringNotTag()
    –   assertXmlFileSelect(), assertXmlStringSelect()
    –   assertEqualXMLStructure()
●   Changes to existing assertions
    –   EOL canonicalization for
         ●   assertEquals(), assertNotEquals(),
         ●   assertFileEquals(), assertFileNotEquals()
●   PHPUnit_Util_ErrorHandler::getErrorStack()
PHPUnit 3.3
Other new features


●   Mock Objects are faster
●   SeleniumTestCase supports verify*()
●   Feature and Memory Performance
    improvements for the code coverage
    reporting
PHPUnit 3.3
Backwards Compatibility Breaking Changes


●   Removed PHPUnit_Extensions_ExceptionTestCase
    –   Functionality had been merged into
        PHPUnit_Framework_TestCase in PHPUnit 3.2
    –   Marked as deprecated in PHPUnit 3.2
●   Removed PHPUnit_Extensions_TestSetup
    –   Functionality had been merged into
        PHPUnit_Framework_TestSuite in PHPUnit 3.2
    –   Marked as deprecated in PHPUnit 3.2
The End


●   Thank you for your interest!
●   These slides will be available shortly on
    http://sebastian-bergmann.de/talks/.
License

    This presentation material is published under the Attribution-Share Alike 3.0 Unported
    license.
    You are free:
      ✔   to Share – to copy, distribute and transmit the work.
      ✔   to Remix – to adapt the work.
    Under the following conditions:
      ●   Attribution. You must attribute the work in the manner specified by the author or
          licensor (but not in any way that suggests that they endorse you or your use of the
          work).
      ●   Share Alike. If you alter, transform, or build upon this work, you may distribute the
          resulting work only under the same, similar or a compatible license.
    For any reuse or distribution, you must make clear to others the license terms of this
    work.
    Any of the above conditions can be waived if you get permission from the copyright
    holder.
    Nothing in this license impairs or restricts the author's moral rights.

Contenu connexe

Tendances

Unit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDDUnit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDDPaweł Michalik
 
Unit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitUnit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitMichelangelo van Dam
 
Unit Testing Presentation
Unit Testing PresentationUnit Testing Presentation
Unit Testing Presentationnicobn
 
Mocking Dependencies in PHPUnit
Mocking Dependencies in PHPUnitMocking Dependencies in PHPUnit
Mocking Dependencies in PHPUnitmfrost503
 
Unit Testng with PHP Unit - A Step by Step Training
Unit Testng with PHP Unit - A Step by Step TrainingUnit Testng with PHP Unit - A Step by Step Training
Unit Testng with PHP Unit - A Step by Step TrainingRam Awadh Prasad, PMP
 
EPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur PurnamaEPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur PurnamaEnterprise PHP Center
 
Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)ENDelt260
 
Effective testing with pytest
Effective testing with pytestEffective testing with pytest
Effective testing with pytestHector Canto
 
Test Driven Development With Python
Test Driven Development With PythonTest Driven Development With Python
Test Driven Development With PythonSiddhi
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Michelangelo van Dam
 
UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013Michelangelo van Dam
 
Keep your repo clean
Keep your repo cleanKeep your repo clean
Keep your repo cleanHector Canto
 
How to test models using php unit testing framework?
How to test models using php unit testing framework?How to test models using php unit testing framework?
How to test models using php unit testing framework?satejsahu
 
Testing the frontend
Testing the frontendTesting the frontend
Testing the frontendHeiko Hardt
 

Tendances (20)

Unit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDDUnit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDD
 
Unit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitUnit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnit
 
PHPUnit
PHPUnitPHPUnit
PHPUnit
 
Unit Testing Presentation
Unit Testing PresentationUnit Testing Presentation
Unit Testing Presentation
 
Phpunit testing
Phpunit testingPhpunit testing
Phpunit testing
 
Mocking Dependencies in PHPUnit
Mocking Dependencies in PHPUnitMocking Dependencies in PHPUnit
Mocking Dependencies in PHPUnit
 
Unit Testng with PHP Unit - A Step by Step Training
Unit Testng with PHP Unit - A Step by Step TrainingUnit Testng with PHP Unit - A Step by Step Training
Unit Testng with PHP Unit - A Step by Step Training
 
Unit testing
Unit testingUnit testing
Unit testing
 
EPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur PurnamaEPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur Purnama
 
Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)
 
PHPUnit testing to Zend_Test
PHPUnit testing to Zend_TestPHPUnit testing to Zend_Test
PHPUnit testing to Zend_Test
 
Effective testing with pytest
Effective testing with pytestEffective testing with pytest
Effective testing with pytest
 
Test Driven Development With Python
Test Driven Development With PythonTest Driven Development With Python
Test Driven Development With Python
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013
 
UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013
 
Php Debugger
Php DebuggerPhp Debugger
Php Debugger
 
Laravel Unit Testing
Laravel Unit TestingLaravel Unit Testing
Laravel Unit Testing
 
Keep your repo clean
Keep your repo cleanKeep your repo clean
Keep your repo clean
 
How to test models using php unit testing framework?
How to test models using php unit testing framework?How to test models using php unit testing framework?
How to test models using php unit testing framework?
 
Testing the frontend
Testing the frontendTesting the frontend
Testing the frontend
 

Similaire à New Features PHPUnit 3.3 - Sebastian Bergmann

Php Unit With Zend Framework Zendcon09
Php Unit With Zend Framework   Zendcon09Php Unit With Zend Framework   Zendcon09
Php Unit With Zend Framework Zendcon09Michelangelo van Dam
 
Quality Assurance in PHP projects - Sebastian Bergmann
Quality Assurance in PHP projects - Sebastian BergmannQuality Assurance in PHP projects - Sebastian Bergmann
Quality Assurance in PHP projects - Sebastian Bergmanndpc
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Michelangelo van Dam
 
Beginning PHPUnit
Beginning PHPUnitBeginning PHPUnit
Beginning PHPUnitJace Ju
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Michelangelo van Dam
 
Unit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentUnit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentMark Niebergall
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownpartsBastian Feder
 
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnitinternational PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnitsmueller_sandsmedia
 
13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboards13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboardsDenis Ristic
 
Introduction to Protractor
Introduction to ProtractorIntroduction to Protractor
Introduction to ProtractorJie-Wei Wu
 
Getting started with TDD - Confoo 2014
Getting started with TDD - Confoo 2014Getting started with TDD - Confoo 2014
Getting started with TDD - Confoo 2014Eric Hogue
 
MT_01_unittest_python.pdf
MT_01_unittest_python.pdfMT_01_unittest_python.pdf
MT_01_unittest_python.pdfHans Jones
 
PHPunit and you
PHPunit and youPHPunit and you
PHPunit and youmarkstory
 
Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Mark Niebergall
 

Similaire à New Features PHPUnit 3.3 - Sebastian Bergmann (20)

Php Unit With Zend Framework Zendcon09
Php Unit With Zend Framework   Zendcon09Php Unit With Zend Framework   Zendcon09
Php Unit With Zend Framework Zendcon09
 
TDD, a starting point...
TDD, a starting point...TDD, a starting point...
TDD, a starting point...
 
Quality Assurance in PHP projects - Sebastian Bergmann
Quality Assurance in PHP projects - Sebastian BergmannQuality Assurance in PHP projects - Sebastian Bergmann
Quality Assurance in PHP projects - Sebastian Bergmann
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12
 
Beginning PHPUnit
Beginning PHPUnitBeginning PHPUnit
Beginning PHPUnit
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
 
Unit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentUnit Testing from Setup to Deployment
Unit Testing from Setup to Deployment
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
 
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnitinternational PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
 
13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboards13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboards
 
PHPSpec BDD Framework
PHPSpec BDD FrameworkPHPSpec BDD Framework
PHPSpec BDD Framework
 
Phpunit
PhpunitPhpunit
Phpunit
 
Php unit (eng)
Php unit (eng)Php unit (eng)
Php unit (eng)
 
Introduction to Protractor
Introduction to ProtractorIntroduction to Protractor
Introduction to Protractor
 
Test driven development_for_php
Test driven development_for_phpTest driven development_for_php
Test driven development_for_php
 
Getting started with TDD - Confoo 2014
Getting started with TDD - Confoo 2014Getting started with TDD - Confoo 2014
Getting started with TDD - Confoo 2014
 
MT_01_unittest_python.pdf
MT_01_unittest_python.pdfMT_01_unittest_python.pdf
MT_01_unittest_python.pdf
 
PHPunit and you
PHPunit and youPHPunit and you
PHPunit and you
 
Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023
 
Unit testing zend framework apps
Unit testing zend framework appsUnit testing zend framework apps
Unit testing zend framework apps
 

Plus de dpc

ezComponents - Derick Rethans
ezComponents - Derick RethansezComponents - Derick Rethans
ezComponents - Derick Rethansdpc
 
Software And The Taste Of Mayo - Marco Tabini
Software And The Taste Of Mayo - Marco TabiniSoftware And The Taste Of Mayo - Marco Tabini
Software And The Taste Of Mayo - Marco Tabinidpc
 
Deployment With Subversion - Lorna Mitchell
Deployment With Subversion - Lorna MitchellDeployment With Subversion - Lorna Mitchell
Deployment With Subversion - Lorna Mitchelldpc
 
Best Practices with Zend Framework - Matthew Weier O'Phinney
Best Practices with Zend Framework - Matthew Weier O'PhinneyBest Practices with Zend Framework - Matthew Weier O'Phinney
Best Practices with Zend Framework - Matthew Weier O'Phinneydpc
 
State Of PHP - Zeev Suraski
State Of PHP - Zeev SuraskiState Of PHP - Zeev Suraski
State Of PHP - Zeev Suraskidpc
 
Symfony 1.1 - Fabien Potencier
Symfony 1.1 - Fabien PotencierSymfony 1.1 - Fabien Potencier
Symfony 1.1 - Fabien Potencierdpc
 
Advanced PHP: Design Patterns - Dennis-Jan Broerse
Advanced PHP: Design Patterns - Dennis-Jan BroerseAdvanced PHP: Design Patterns - Dennis-Jan Broerse
Advanced PHP: Design Patterns - Dennis-Jan Broersedpc
 
PHP 5.3 and PHP 6; a look ahead - Stefan Priebsch
PHP 5.3 and PHP 6; a look ahead - Stefan PriebschPHP 5.3 and PHP 6; a look ahead - Stefan Priebsch
PHP 5.3 and PHP 6; a look ahead - Stefan Priebschdpc
 
An Infrastructure for Team Development - Gaylord Aulke
An Infrastructure for Team Development - Gaylord AulkeAn Infrastructure for Team Development - Gaylord Aulke
An Infrastructure for Team Development - Gaylord Aulkedpc
 
Enterprise PHP Development - Ivo Jansch
Enterprise PHP Development - Ivo JanschEnterprise PHP Development - Ivo Jansch
Enterprise PHP Development - Ivo Janschdpc
 
DPC2008 Intro - Ivo Jansch
DPC2008 Intro - Ivo JanschDPC2008 Intro - Ivo Jansch
DPC2008 Intro - Ivo Janschdpc
 
DPC 2007 My First Mashup (Cal Evans)
DPC 2007 My First Mashup (Cal Evans)DPC 2007 My First Mashup (Cal Evans)
DPC 2007 My First Mashup (Cal Evans)dpc
 
DPC2007 CodeGear, Delphi For PHP (Pawel Glowacki)
DPC2007 CodeGear, Delphi For PHP (Pawel Glowacki)DPC2007 CodeGear, Delphi For PHP (Pawel Glowacki)
DPC2007 CodeGear, Delphi For PHP (Pawel Glowacki)dpc
 
DPC2007 Zend Framework (Gaylord Aulke)
DPC2007 Zend Framework (Gaylord Aulke)DPC2007 Zend Framework (Gaylord Aulke)
DPC2007 Zend Framework (Gaylord Aulke)dpc
 
DPC2007 Objects Of Desire (Kevlin Henney)
DPC2007 Objects Of Desire (Kevlin Henney)DPC2007 Objects Of Desire (Kevlin Henney)
DPC2007 Objects Of Desire (Kevlin Henney)dpc
 
DPC2007 Symfony (Stefan Koopmanschap)
DPC2007 Symfony (Stefan Koopmanschap)DPC2007 Symfony (Stefan Koopmanschap)
DPC2007 Symfony (Stefan Koopmanschap)dpc
 
DPC2007 PHP And Oracle (Kuassi Mensah)
DPC2007 PHP And Oracle (Kuassi Mensah)DPC2007 PHP And Oracle (Kuassi Mensah)
DPC2007 PHP And Oracle (Kuassi Mensah)dpc
 
DPC2007 Case Study Surfnet (Herman Van Dompseler)
DPC2007 Case Study Surfnet (Herman Van Dompseler)DPC2007 Case Study Surfnet (Herman Van Dompseler)
DPC2007 Case Study Surfnet (Herman Van Dompseler)dpc
 
DPC2007 Case Study Zoom & Webwereld (Sander vd Graaf)
DPC2007 Case Study Zoom & Webwereld (Sander vd Graaf)DPC2007 Case Study Zoom & Webwereld (Sander vd Graaf)
DPC2007 Case Study Zoom & Webwereld (Sander vd Graaf)dpc
 
DPC2007 PDO (Lukas Kahwe Smith)
DPC2007 PDO (Lukas Kahwe Smith)DPC2007 PDO (Lukas Kahwe Smith)
DPC2007 PDO (Lukas Kahwe Smith)dpc
 

Plus de dpc (20)

ezComponents - Derick Rethans
ezComponents - Derick RethansezComponents - Derick Rethans
ezComponents - Derick Rethans
 
Software And The Taste Of Mayo - Marco Tabini
Software And The Taste Of Mayo - Marco TabiniSoftware And The Taste Of Mayo - Marco Tabini
Software And The Taste Of Mayo - Marco Tabini
 
Deployment With Subversion - Lorna Mitchell
Deployment With Subversion - Lorna MitchellDeployment With Subversion - Lorna Mitchell
Deployment With Subversion - Lorna Mitchell
 
Best Practices with Zend Framework - Matthew Weier O'Phinney
Best Practices with Zend Framework - Matthew Weier O'PhinneyBest Practices with Zend Framework - Matthew Weier O'Phinney
Best Practices with Zend Framework - Matthew Weier O'Phinney
 
State Of PHP - Zeev Suraski
State Of PHP - Zeev SuraskiState Of PHP - Zeev Suraski
State Of PHP - Zeev Suraski
 
Symfony 1.1 - Fabien Potencier
Symfony 1.1 - Fabien PotencierSymfony 1.1 - Fabien Potencier
Symfony 1.1 - Fabien Potencier
 
Advanced PHP: Design Patterns - Dennis-Jan Broerse
Advanced PHP: Design Patterns - Dennis-Jan BroerseAdvanced PHP: Design Patterns - Dennis-Jan Broerse
Advanced PHP: Design Patterns - Dennis-Jan Broerse
 
PHP 5.3 and PHP 6; a look ahead - Stefan Priebsch
PHP 5.3 and PHP 6; a look ahead - Stefan PriebschPHP 5.3 and PHP 6; a look ahead - Stefan Priebsch
PHP 5.3 and PHP 6; a look ahead - Stefan Priebsch
 
An Infrastructure for Team Development - Gaylord Aulke
An Infrastructure for Team Development - Gaylord AulkeAn Infrastructure for Team Development - Gaylord Aulke
An Infrastructure for Team Development - Gaylord Aulke
 
Enterprise PHP Development - Ivo Jansch
Enterprise PHP Development - Ivo JanschEnterprise PHP Development - Ivo Jansch
Enterprise PHP Development - Ivo Jansch
 
DPC2008 Intro - Ivo Jansch
DPC2008 Intro - Ivo JanschDPC2008 Intro - Ivo Jansch
DPC2008 Intro - Ivo Jansch
 
DPC 2007 My First Mashup (Cal Evans)
DPC 2007 My First Mashup (Cal Evans)DPC 2007 My First Mashup (Cal Evans)
DPC 2007 My First Mashup (Cal Evans)
 
DPC2007 CodeGear, Delphi For PHP (Pawel Glowacki)
DPC2007 CodeGear, Delphi For PHP (Pawel Glowacki)DPC2007 CodeGear, Delphi For PHP (Pawel Glowacki)
DPC2007 CodeGear, Delphi For PHP (Pawel Glowacki)
 
DPC2007 Zend Framework (Gaylord Aulke)
DPC2007 Zend Framework (Gaylord Aulke)DPC2007 Zend Framework (Gaylord Aulke)
DPC2007 Zend Framework (Gaylord Aulke)
 
DPC2007 Objects Of Desire (Kevlin Henney)
DPC2007 Objects Of Desire (Kevlin Henney)DPC2007 Objects Of Desire (Kevlin Henney)
DPC2007 Objects Of Desire (Kevlin Henney)
 
DPC2007 Symfony (Stefan Koopmanschap)
DPC2007 Symfony (Stefan Koopmanschap)DPC2007 Symfony (Stefan Koopmanschap)
DPC2007 Symfony (Stefan Koopmanschap)
 
DPC2007 PHP And Oracle (Kuassi Mensah)
DPC2007 PHP And Oracle (Kuassi Mensah)DPC2007 PHP And Oracle (Kuassi Mensah)
DPC2007 PHP And Oracle (Kuassi Mensah)
 
DPC2007 Case Study Surfnet (Herman Van Dompseler)
DPC2007 Case Study Surfnet (Herman Van Dompseler)DPC2007 Case Study Surfnet (Herman Van Dompseler)
DPC2007 Case Study Surfnet (Herman Van Dompseler)
 
DPC2007 Case Study Zoom & Webwereld (Sander vd Graaf)
DPC2007 Case Study Zoom & Webwereld (Sander vd Graaf)DPC2007 Case Study Zoom & Webwereld (Sander vd Graaf)
DPC2007 Case Study Zoom & Webwereld (Sander vd Graaf)
 
DPC2007 PDO (Lukas Kahwe Smith)
DPC2007 PDO (Lukas Kahwe Smith)DPC2007 PDO (Lukas Kahwe Smith)
DPC2007 PDO (Lukas Kahwe Smith)
 

Dernier

Cracking the Cultural Competence Code.pptx
Cracking the Cultural Competence Code.pptxCracking the Cultural Competence Code.pptx
Cracking the Cultural Competence Code.pptxWorkforce Group
 
Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...lizamodels9
 
Call Girls Electronic City Just Call 👗 7737669865 👗 Top Class Call Girl Servi...
Call Girls Electronic City Just Call 👗 7737669865 👗 Top Class Call Girl Servi...Call Girls Electronic City Just Call 👗 7737669865 👗 Top Class Call Girl Servi...
Call Girls Electronic City Just Call 👗 7737669865 👗 Top Class Call Girl Servi...amitlee9823
 
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...amitlee9823
 
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000dlhescort
 
Phases of Negotiation .pptx
 Phases of Negotiation .pptx Phases of Negotiation .pptx
Phases of Negotiation .pptxnandhinijagan9867
 
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service AvailableCall Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service AvailableSeo
 
Organizational Transformation Lead with Culture
Organizational Transformation Lead with CultureOrganizational Transformation Lead with Culture
Organizational Transformation Lead with CultureSeta Wicaksana
 
RSA Conference Exhibitor List 2024 - Exhibitors Data
RSA Conference Exhibitor List 2024 - Exhibitors DataRSA Conference Exhibitor List 2024 - Exhibitors Data
RSA Conference Exhibitor List 2024 - Exhibitors DataExhibitors Data
 
Call Girls Zirakpur👧 Book Now📱7837612180 📞👉Call Girl Service In Zirakpur No A...
Call Girls Zirakpur👧 Book Now📱7837612180 📞👉Call Girl Service In Zirakpur No A...Call Girls Zirakpur👧 Book Now📱7837612180 📞👉Call Girl Service In Zirakpur No A...
Call Girls Zirakpur👧 Book Now📱7837612180 📞👉Call Girl Service In Zirakpur No A...Sheetaleventcompany
 
Marel Q1 2024 Investor Presentation from May 8, 2024
Marel Q1 2024 Investor Presentation from May 8, 2024Marel Q1 2024 Investor Presentation from May 8, 2024
Marel Q1 2024 Investor Presentation from May 8, 2024Marel
 
Falcon Invoice Discounting: The best investment platform in india for investors
Falcon Invoice Discounting: The best investment platform in india for investorsFalcon Invoice Discounting: The best investment platform in india for investors
Falcon Invoice Discounting: The best investment platform in india for investorsFalcon Invoice Discounting
 
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...amitlee9823
 
Dr. Admir Softic_ presentation_Green Club_ENG.pdf
Dr. Admir Softic_ presentation_Green Club_ENG.pdfDr. Admir Softic_ presentation_Green Club_ENG.pdf
Dr. Admir Softic_ presentation_Green Club_ENG.pdfAdmir Softic
 
Falcon's Invoice Discounting: Your Path to Prosperity
Falcon's Invoice Discounting: Your Path to ProsperityFalcon's Invoice Discounting: Your Path to Prosperity
Falcon's Invoice Discounting: Your Path to Prosperityhemanthkumar470700
 
Business Model Canvas (BMC)- A new venture concept
Business Model Canvas (BMC)-  A new venture conceptBusiness Model Canvas (BMC)-  A new venture concept
Business Model Canvas (BMC)- A new venture conceptP&CO
 
Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...
Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...
Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...allensay1
 
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876dlhescort
 

Dernier (20)

Cracking the Cultural Competence Code.pptx
Cracking the Cultural Competence Code.pptxCracking the Cultural Competence Code.pptx
Cracking the Cultural Competence Code.pptx
 
Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
 
Call Girls Electronic City Just Call 👗 7737669865 👗 Top Class Call Girl Servi...
Call Girls Electronic City Just Call 👗 7737669865 👗 Top Class Call Girl Servi...Call Girls Electronic City Just Call 👗 7737669865 👗 Top Class Call Girl Servi...
Call Girls Electronic City Just Call 👗 7737669865 👗 Top Class Call Girl Servi...
 
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
 
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
 
Phases of Negotiation .pptx
 Phases of Negotiation .pptx Phases of Negotiation .pptx
Phases of Negotiation .pptx
 
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service AvailableCall Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
 
(Anamika) VIP Call Girls Napur Call Now 8617697112 Napur Escorts 24x7
(Anamika) VIP Call Girls Napur Call Now 8617697112 Napur Escorts 24x7(Anamika) VIP Call Girls Napur Call Now 8617697112 Napur Escorts 24x7
(Anamika) VIP Call Girls Napur Call Now 8617697112 Napur Escorts 24x7
 
unwanted pregnancy Kit [+918133066128] Abortion Pills IN Dubai UAE Abudhabi
unwanted pregnancy Kit [+918133066128] Abortion Pills IN Dubai UAE Abudhabiunwanted pregnancy Kit [+918133066128] Abortion Pills IN Dubai UAE Abudhabi
unwanted pregnancy Kit [+918133066128] Abortion Pills IN Dubai UAE Abudhabi
 
Organizational Transformation Lead with Culture
Organizational Transformation Lead with CultureOrganizational Transformation Lead with Culture
Organizational Transformation Lead with Culture
 
RSA Conference Exhibitor List 2024 - Exhibitors Data
RSA Conference Exhibitor List 2024 - Exhibitors DataRSA Conference Exhibitor List 2024 - Exhibitors Data
RSA Conference Exhibitor List 2024 - Exhibitors Data
 
Call Girls Zirakpur👧 Book Now📱7837612180 📞👉Call Girl Service In Zirakpur No A...
Call Girls Zirakpur👧 Book Now📱7837612180 📞👉Call Girl Service In Zirakpur No A...Call Girls Zirakpur👧 Book Now📱7837612180 📞👉Call Girl Service In Zirakpur No A...
Call Girls Zirakpur👧 Book Now📱7837612180 📞👉Call Girl Service In Zirakpur No A...
 
Marel Q1 2024 Investor Presentation from May 8, 2024
Marel Q1 2024 Investor Presentation from May 8, 2024Marel Q1 2024 Investor Presentation from May 8, 2024
Marel Q1 2024 Investor Presentation from May 8, 2024
 
Falcon Invoice Discounting: The best investment platform in india for investors
Falcon Invoice Discounting: The best investment platform in india for investorsFalcon Invoice Discounting: The best investment platform in india for investors
Falcon Invoice Discounting: The best investment platform in india for investors
 
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
 
Dr. Admir Softic_ presentation_Green Club_ENG.pdf
Dr. Admir Softic_ presentation_Green Club_ENG.pdfDr. Admir Softic_ presentation_Green Club_ENG.pdf
Dr. Admir Softic_ presentation_Green Club_ENG.pdf
 
Falcon's Invoice Discounting: Your Path to Prosperity
Falcon's Invoice Discounting: Your Path to ProsperityFalcon's Invoice Discounting: Your Path to Prosperity
Falcon's Invoice Discounting: Your Path to Prosperity
 
Business Model Canvas (BMC)- A new venture concept
Business Model Canvas (BMC)-  A new venture conceptBusiness Model Canvas (BMC)-  A new venture concept
Business Model Canvas (BMC)- A new venture concept
 
Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...
Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...
Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...
 
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
 

New Features PHPUnit 3.3 - Sebastian Bergmann

  • 1. Welcome! New Features in PHPUnit 3.3 Sebastian Bergmann http://sebastian-bergmann.de/ June 14th 2008
  • 2. Who I am ● Sebastian Bergmann ● Involved in the PHP Project since 2000 ● Developer of PHPUnit ● Author, Consultant, Coach, Trainer
  • 3. PHPUnit ● Test Framework – Member of the xUnit family of test frameworks – Mock Objects – DbUnit ● Integration – Selenium RC – phpUnderControl, CruiseControl, ... ● Even More Cool Stuff :-) – Code Coverage, Software Metrics, and “Mess Detection” – Test Database – Mutation Testing (GSoC07 project)
  • 4. Unit Tests with PHPUnit <?php require_once 'PHPUnit/Framework/TestCase.php'; class BowlingGameTest extends PHPUnit_Framework_TestCase { }
  • 5. Unit Tests with PHPUnit <?php require_once 'PHPUnit/Framework/TestCase.php'; class BowlingGameTest extends PHPUnit_Framework_TestCase { public function testScoreForOneSpareAnd3Is16() { } }
  • 6. Unit Tests with PHPUnit <?php require_once 'PHPUnit/Framework/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameTest extends PHPUnit_Framework_TestCase { public function testScoreForOneSpareAnd3Is16() { $game = new BowlingGame; } }
  • 7. Unit Tests with PHPUnit <?php require_once 'PHPUnit/Framework/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameTest extends PHPUnit_Framework_TestCase { public function testScoreForOneSpareAnd3Is16() { $game = new BowlingGame; $game->roll(5); $game->roll(5); $game->roll(3); for ($i = 4; $i <= 20; $i++) { $game->roll(0); } } }
  • 8. Unit Tests with PHPUnit <?php require_once 'PHPUnit/Framework/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameTest extends PHPUnit_Framework_TestCase { public function testScoreForOneSpareAnd3Is16() { $game = new BowlingGame; $game->roll(5); $game->roll(5); $game->roll(3); for ($i = 4; $i <= 20; $i++) { $game->roll(0); } $this->assertEquals(16, $this->game->score()); } }
  • 9. Unit Tests with PHPUnit sb@vmware ~ % phpunit BowlingGameTest PHPUnit 3.3.0 by Sebastian Bergmann. . Time: 0 seconds OK (1 test, 1 annotation)
  • 10. Annotations @assert <?php class Calculator { /** * @assert (1, 2) == 3 */ public function add($a, $b) { return $a + $b; } /** * @assert (2, 1) == 1 */ public function sub($a, $b) { return $a - $b; } }
  • 11. Annotations @assert sb@vmware ~ % phpunit Calculator PHPUnit 3.3.0 by Sebastian Bergmann. .. Time: 0 seconds OK (2 tests, 2 annotations)
  • 12. Annotations @expectedException <?php class ExceptionTest extends PHPUnit_Framework_TestCase { /** * @expectedException InvalidArgumentException */ public function testException() { } }
  • 13. Annotations @expectedException sb@vmware ~ % phpunit ExceptionTest PHPUnit 3.3.0 by Sebastian Bergmann. F Time: 0 seconds There was 1 failure: 1) testException(ExceptionTest) Expected exception InvalidArgumentException FAILURES! Tests: 1, Assertions: 0, Failures: 1.
  • 14. Annotations @dataProvider <?php class DataTest extends PHPUnit_Framework_TestCase { /** * @dataProvider providerMethod */ public function testAdd($a, $b, $c) { $this->assertEquals($c, $a + $b); } public static function providerMethod() { return array( array(0, 0, 0), array(0, 1, 1), array(1, 1, 3), array(1, 0, 1) ); } }
  • 15. Annotations @dataProvider sb@vmware ~ % phpunit DataTest PHPUnit 3.3.0 by Sebastian Bergmann. ..F. Time: 0 seconds There was 1 failure: 1) testAdd(DataTest) with data (1, 1, 3) Failed asserting that <integer:2> matches expected value <integer:3>. /home/sb/DataTest.php:19 FAILURES! Tests: 4, Assertions:4, Failures: 1.
  • 16. Annotations @group <?php class SomeTest extends PHPUnit_Framework_TestCase { /** * @group specification */ public function testSomething() { } /** * @group regresssion * @group bug2204 */ public function testSomethingElse() { } }
  • 17. Annotations @group sb@vmware ~ % phpunit SomeTest PHPUnit 3.3.0 by Sebastian Bergmann. .. Time: 0 seconds OK (2 tests, 2 annotations) sb@vmware ~ % phpunit --group bug2204 SomeTest PHPUnit 3.3.0 by Sebastian Bergmann. . Time: 0 seconds OK (1 test, 1 annotation)
  • 18. Annotations @test <?php class Specification extends PHPUnit_Framework_TestCase { /** * @test */ public function shouldDoSomething() { } /** * @test */ public function shouldDoSomethingElse() { } }
  • 19. Annotations @test sb@vmware ~ % phpunit --testdox Specification PHPUnit 3.3.0 by Sebastian Bergmann. Specification [x] Should do something [x] Should do something else
  • 20. Behaviour-Driven Development ● Extreme Programming originally had the rule to test everything that could possibly break ● Now, however, the practice of testing in Extreme Programming has evolved into Test-Driven Development ● But the tools still force developers to think in terms of tests and assertions instead of specifications A New Look At Test-Driven Development, Dave Astels. http://blog.daveastels.com/files/BDD_Intro.pdf
  • 21. Behaviour-Driven Development <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase { }
  • 22. Behaviour-Driven Development <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase { /** * @scenario */ public function scoreForOneSpareAnd3Is16() { } // ... }
  • 23. Behaviour-Driven Development <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase { /** * @scenario */ public function scoreForOneSpareAnd3Is16() { $this->given('New game') } // ... }
  • 24. Behaviour-Driven Development <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase { /** * @scenario */ public function scoreForOneSpareAnd3Is16() { $this->given('New game') ->when('Player rolls', 5) } // ... }
  • 25. Behaviour-Driven Development <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase { /** * @scenario */ public function scoreForOneSpareAnd3Is16() { $this->given('New game') ->when('Player rolls', 5) ->and('Player rolls', 5) } // ... }
  • 26. Behaviour-Driven Development <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase { /** * @scenario */ public function scoreForOneSpareAnd3Is16() { $this->given('New game') ->when('Player rolls', 5) ->and('Player rolls', 5) ->and('Player rolls', 3) } // ... }
  • 27. Behaviour-Driven Development <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase { /** * @scenario */ public function scoreForOneSpareAnd3Is16() { $this->given('New game') ->when('Player rolls', 5) ->and('Player rolls', 5) ->and('Player rolls', 3) ->then('Score should be', 16); } // ... }
  • 28. Behaviour-Driven Development <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase { // ... public function runGiven(&$world, $action, $arguments) { switch($action) { case 'New game': { $world['game'] = new BowlingGame; $world['rolls'] = 0; } break; default: { return $this->notImplemented($action); } } } }
  • 29. Behaviour-Driven Development <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase { // ... public function runWhen(&$world, $action, $arguments) { switch($action) { case 'Player rolls': { $world['game']->roll($arguments[0]); $world['rolls']++; } break; default: { return $this->notImplemented($action); } } } }
  • 30. Behaviour-Driven Development <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase { // ... public function runThen(&$world, $action, $arguments) { switch($action) { case 'Score should be': { for ($i = $world['rolls']; $i < 20; $i++) { $world['game']->roll(0); } $this->assertEquals($arguments[0], $world['game']->score()); } break; default: { return $this->notImplemented($action); } } } }
  • 31. Behaviour-Driven Development sb@vmware ~ % phpunit --story BowlingGameSpec PHPUnit 3.3.0 by Sebastian Bergmann. BowlingGameSpec - Score for one spare and 3 is 16 [successful] Given New game When Player rolls 5 and Player rolls 5 and Player rolls 3 Then Score should be 16 Scenarios: 1, Failed: 0, Skipped: 0, Incomplete: 0. sb@vmware ~ % phpunit --testdox BowlingGameSpec PHPUnit 3.3.0 by Sebastian Bergmann. BowlingGameSpec [x] Score for one spare and 3 is 16
  • 32. Generating Code from Tests <?php class BowlingGameTest extends PHPUnit_Framework_TestCase { protected $game; protected function setUp() { $this->game = new BowlingGame; } protected function rollMany($n, $pins) { for ($i = 0; $i < $n; $i++) { $this->game->roll($pins); } } public function testScoreForGutterGameIs0() { $this->rollMany(20, 0); $this->assertEquals(0, $this->game->score()); } }
  • 33. Generating Code from Tests sb@vmware ~ % phpunit --skeleton-class BowlingGameTest PHPUnit 3.3.0 by Sebastian Bergmann. Wrote skeleton for quot;BowlingGamequot; to quot;BowlingGame.phpquot;. <?php class BowlingGame { /** * @todo Implement roll(). */ public function roll() { // Remove the following line when you implement this method. throw new RuntimeException('Not yet implemented.'); } /** * @todo Implement score(). */ public function score() { // Remove the following line when you implement this method. throw new RuntimeException('Not yet implemented.'); } } ?>
  • 34. Generating Code from Tests <?php class BowlingGameTest extends PHPUnit_Framework_TestCase { protected $game; protected function setUp() { $this->game = new BowlingGame; } protected function rollMany($n, $pins) { for ($i = 0; $i < $n; $i++) { $this->game->roll($pins); } } public function testScoreForGutterGameIs0() { $this->rollMany(20, 0); $this->assertEquals(0, $this->game->score()); } }
  • 35. Generating Code from Tests <?php class BowlingGameTest extends PHPUnit_Framework_TestCase { protected $game; protected function setUp() { $this->game = new BowlingGame; } protected function rollMany($n, $pins) { for ($i = 0; $i < $n; $i++) { $this->game->roll($pins); } } public function testScoreForGutterGameIs0() { $this->rollMany(20, 0); $this->assertEquals(0, $this->game->score()); } }
  • 36. Generating Code from Tests <?php class BowlingGameTest extends PHPUnit_Framework_TestCase { protected $game; protected function setUp() { $this->game = new BowlingGame; } protected function rollMany($n, $pins) { for ($i = 0; $i < $n; $i++) { $this->game->roll($pins); } } public function testScoreForGutterGameIs0() { $this->rollMany(20, 0); $this->assertEquals(0, $this->game->score()); } }
  • 37. Generating Code from Tests <?php class BowlingGameTest extends PHPUnit_Framework_TestCase { protected $game; protected function setUp() { $this->game = new BowlingGame; } protected function rollMany($n, $pins) { for ($i = 0; $i < $n; $i++) { $this->game->roll($pins); } } public function testScoreForGutterGameIs0() { $this->rollMany(20, 0); $this->assertEquals(0, $this->game->score()); } }
  • 38. Generating Code from Tests <?php class BowlingGameTest extends PHPUnit_Framework_TestCase { protected $game; protected function setUp() { $this->game = new BowlingGame; } protected function rollMany($n, $pins) { for ($i = 0; $i < $n; $i++) { $this->game->roll($pins); } } public function testScoreForGutterGameIs0() { $this->rollMany(20, 0); $this->assertEquals(0, $this->game->score()); } }
  • 39. Mock Objects returnArgument() <?php class StubTest extends PHPUnit_Framework_TestCase { public function testReturnArgumentStub() { $stub = $this->getMock( 'SomeClass', array('doSomething') ); $stub->expects($this->any()) ->method('doSomething') ->will($this->returnArgument(1)); // $stub->doSomething('foo') returns 'foo' // $stub->doSomething('bar') returns 'bar' } }
  • 40. Mock Objects returnCallback() <?php class StubTest extends PHPUnit_Framework_TestCase { public function testReturnCallbackStub() { $stub = $this->getMock( 'SomeClass', array('doSomething') ); $stub->expects($this->any()) ->method('doSomething') ->will($this->returnCallback('callback')); // $stub->doSomething() returns callback(...) } } function callback() { $args = func_get_args(); // ... }
  • 41. TextUI Testrunner Counting of assertions sb@vmware ~ % phpunit BowlingGameTest PHPUnit 3.3.0 by Sebastian Bergmann. . Time: 0 seconds OK (1 test, 1 assertions)
  • 42. TextUI Testrunner Colours! sb@vmware ~ % phpunit --ansi BowlingGameTest PHPUnit 3.3.0 by Sebastian Bergmann. . Time: 0 seconds 1 OK (1 test, 0 assertions)
  • 43. TextUI Testrunner Counting of assertions sb@vmware ~ % phpunit BowlingGameTest PHPUnit 3.3.0 by Sebastian Bergmann. .F Time: 0 seconds There was 1 failure: 1) testAllOnes(BowlingGameTest) Failed asserting that <integer:0> matches expected value <integer:20>. /home/sb/BowlingGameTest.php:25 FAILURES! Tests: 2, Assertions: 2, Failures: 1.
  • 44. TextUI Testrunner Colours! sb@vmware ~ % phpunit --ansi BowlingGameTest PHPUnit 3.3.0 by Sebastian Bergmann. .F Time: 0 seconds There was 1 failure: 1) testAllOnes(BowlingGameTest) Failed asserting that <integer:0> matches expected value <integer:20>. /home/sb/BowlingGameTest.php:25 FAILURES! Tests: 1, Failures: 1.2, Failures: 1. 2, Assertions:
  • 45. PHPUnit 3.3 Other new features ● New assertions – assertXmlFileTag(), assertXmlFileNotTag() – assertXmlStringTag(), assertXmlStringNotTag() – assertXmlFileSelect(), assertXmlStringSelect() – assertEqualXMLStructure() ● Changes to existing assertions – EOL canonicalization for ● assertEquals(), assertNotEquals(), ● assertFileEquals(), assertFileNotEquals() ● PHPUnit_Util_ErrorHandler::getErrorStack()
  • 46. PHPUnit 3.3 Other new features ● Mock Objects are faster ● SeleniumTestCase supports verify*() ● Feature and Memory Performance improvements for the code coverage reporting
  • 47. PHPUnit 3.3 Backwards Compatibility Breaking Changes ● Removed PHPUnit_Extensions_ExceptionTestCase – Functionality had been merged into PHPUnit_Framework_TestCase in PHPUnit 3.2 – Marked as deprecated in PHPUnit 3.2 ● Removed PHPUnit_Extensions_TestSetup – Functionality had been merged into PHPUnit_Framework_TestSuite in PHPUnit 3.2 – Marked as deprecated in PHPUnit 3.2
  • 48. The End ● Thank you for your interest! ● These slides will be available shortly on http://sebastian-bergmann.de/talks/.
  • 49. License   This presentation material is published under the Attribution-Share Alike 3.0 Unported license.   You are free: ✔ to Share – to copy, distribute and transmit the work. ✔ to Remix – to adapt the work.   Under the following conditions: ● Attribution. You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). ● Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same, similar or a compatible license.   For any reuse or distribution, you must make clear to others the license terms of this work.   Any of the above conditions can be waived if you get permission from the copyright holder.   Nothing in this license impairs or restricts the author's moral rights.