SlideShare a Scribd company logo
Unit Test Fun: Mock Objects, Fixtures,
Stubs & Dependency Injection

Max Köhler I 02. Dezember 2010




                                         © 2010 Mayflower GmbH
Wer macht UnitTests?



      Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 2
Code Coverage?



   Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 3
Wer glaubt, dass die Tests
       gut sind?


        Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 4
Kann die Qualität
gesteigert werden?
                                                                                                      100%




                                                                              0%
     Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 5
Test der kompletten
    Architektur?


     Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 6
MVC?
                         Controller




View                                                     Model




       Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 7
Wie testet Ihr eure
    Models?


     Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 8
Direkter DB-Zugriff?



     Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 9
Keine UnitTests!

                                                             STOP




   Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 10
Integration Tests!



    Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 11
Wie testet Ihr eure
  Controller?


     Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 12
Routes, Auth-Mock,
 Session-Mock, ...?


     Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 13
Keine UnitTests!

                                                             STOP




   Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 14
Was wollen wir testen?



       Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 15
Integration                                                     Regression
          Testing                                                            Testing




                                Unit Testing

System - Integration
      Testing
                                                                                          Acceptance
                                                                                               Testing

                       System Testing




                       Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 16
The goal of unit testing is
to isolate each part of the
 program and show that
 the individual parts are
                  correct




      Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 17
Test Doubles



  Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 18
Stubs



Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 19
Fake that returns
 canned data...




   Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 20
Beispiel für ein Auth-Stub



   $storageData = array(
       'accountId' => 29,
       'username' => 'Hugo',
       'jid'       => 'hugo@example.org');

   $storage = $this->getMock('Zend_Auth_Storage_Session', array('read'));
   $storage->expects($this->any())
           ->method('read')
           ->will($this->returnValue($storageData));

   Zend_Auth::getInstance()->setStorage($storage);

   // ...

   /*
    * Bei jedem Aufruf wird nun das Mock als Storage
    * verwendet und dessen Daten ausgelesen
    */
   $session = Zend_Auth::getInstance()->getIdentity();




                                Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 21
Mocks



Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 22
Spy with
expectations...




  Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 23
Model Mapper Beispiel

   class Application_Model_GuestbookMapper
   {
       protected $_dbTable;

       public function setDbTable(Zend_Db_Table_Abstract $dbTable)
       {
           $this->_dbTable = $dbTable;
           return $this;
       }

       public function getDbTable()
       {
           return $this->_dbTable;
       }

       public function getEmail() {}
       public function getComment() {}

       public function save(Application_Model_Guestbook $guestbook)
       {
           $data = array(
               'email'    => $guestbook->getEmail(),
               'comment' => $guestbook->getComment(),
           );

           $this->getDbTable()->insert($data);
       }
   }

                               Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 24
Testen der save() Funktion


class Applicatoin_Model_GuestbookMapperTest extends PHPUnit_Framework_TestCase
{
    public function testSave()
    {
        $modelStub = $this->getMock('Application_Model_Guestbook', array('getEmail', ,getComment'));

         $modelStub->expects($this->once())
                   ->method('getEmail')
                   ->will($this->returnValue('super@email.de'));

         $modelStub->expects($this->once())
                   ->method('getComment')
                   ->will($this->returnValue('super comment'));

         $tableMock = $this->getMock('Zend_Db_Table_Abstract', array('insert'), array(), '', false);
         $tableMock->expects($this->once())
                   ->method('insert')
                   ->with($this->equalTo(array(
                            'email' => 'super@email.de',
                            'comment' => 'super comment')));

         $model = new Application_Model_GuestbookMapper();
         $model->setDbTable($tableMock); // << MOCK
         $model->save($modelStub);       // << STUB
     }
}

                                    Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 25
Stub                                                                Mock
  Fake that                                                                Spy with
returns canned              !==                                  expectations...
    data...




              Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 26
Fixtures



Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 27
Set the world up
   in a known
     state ...



   Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 28
Fixture-Beispiel

       class Fixture extends PHPUnit_Framework_TestCase
       {
           protected $fixture;

           protected function setUp()
           {
               $this->fixture = array();
           }

           public function testEmpty()
           {
               $this->assertTrue(empty($this->fixture));
           }

           public function testPush()
           {
               array_push($this->fixture, 'foo');
               $this->assertEquals('foo', $this->fixture[0]);
           }

           public function testPop()
           {
               array_push($this->fixture, 'foo');
               $this->assertEquals('foo', array_pop($this->fixture));
               $this->assertTrue(empty($this->fixture));
           }
       }

                              Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 29
Method Stack


     Ablauf

               public static function setUpBeforeClass() { }



               protected function setUp() { }



               public function testMyTest() { /* TEST */ }



               protected function tearDown() { }



               protected function onNotSuccessfulTest(Exception $e) { }



               public static function tearDownAfterClass() { }




                          Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 30
Test Suite ...



 Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 31
...wirkt sich auf die
   Architektur aus.


     Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 32
Wenn nicht...



  Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 33
Developer


Titel der Präsentation I   Mayflower GmbH I xx. Juni 2010 I 34
Was kann man machen?



      Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 35
Production Code
  überarbeiten


   Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 36
Dependency Injection



      Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 37
Bemerkt?



Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 38
Dependency Injection

   class Application_Model_GuestbookMapper
   {
       protected $_dbTable;

       public function setDbTable(Zend_Db_Table_Abstract $dbTable)
       {
           $this->_dbTable = $dbTable;
           return $this;
       }

       public function getDbTable()
       {
           return $this->_dbTable;
       }

       public function getEmail() {}
       public function getComment() {}

       public function save(Application_Model_Guestbook $guestbook)
       {
           $data = array(
               'email'    => $guestbook->getEmail(),
               'comment' => $guestbook->getComment(),
           );

           $this->getDbTable()->insert($data);
       }
   }

                               Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 39
Besser aber ...



   Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 40
... Begeisterung sieht anders aus!




                                 Titel der Präsentation I   Mayflower GmbH I xx. Juni 2010 I 41
Was könnte noch helfen?



       Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 42
TDD?
Test Driven Development

                                                          [
                                                           ~~
                          [                                                         ~~
                           ~~                                                                ~~
                                                      ~~                                               ~~
                                                                   ~~                                            ~~
                                                                      ~
       Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 43
Probleme früh erkennen!



       Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 44
Uncle Bob´s
Three Rules of TDD




    Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 45
#1
 “   You are not allowed to write any

production code unless it is to make a
         failing unit test pass.




             Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 46
#2
“   You are not allowed to write any more of

a unit test than is sufficient to fail; and
      compilation failures are failures.




                Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 47
#3
“   You are not allowed to write any more

production code than is sufficient to pass
         the one failing unit test.




              Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 48
Und wieder...



  Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 49
Developer


Titel der Präsentation I   Mayflower GmbH I xx. Juni 2010 I 50
Und jetzt?



Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 51
Things get worst
 before they get
     better !



   Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 52
Monate später...




                   Titel der Präsentation I   Mayflower GmbH I xx. Juni 2010 I 53
Gibts noch was?



   Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 54
Darf ich vorstellen:
„Bug“




                Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 55
Regression Testing
        or
  Test your Bugs!



    Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 56
Regression Testing



  Bug
                class Calculate
                {
                    public function divide($dividend, $divisor)
    1               {
                        return $dividend / $divisor;
                    }
                }




    2           Warning: Division by zero in /srv/phpunit-slides/Calculate.php on line 7




                         Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 57
Regression Testing



  Test First!
                     /**
                       * Regression-Test BUG-123
                       *
                       * @group BUG-123
                       *
                       * @return void
    3                  */
                     public function testDivideByZero()
                     {
                          $calc = new Calculate();
                          $this->assertEquals(0, $calc->divide(1, 0));
                     }




                          Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 58
Regression Testing



  Bugfix

                class Calculate
                {
    4               public function divide($dividend, $divisor)
                    {
                        if (0 == $divisor) {
                            return 0;
                        }
                        return $dividend / $divisor;
                    }
                }




                         Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 59
Regression Testing



  phpunit

                slides$ phpunit --colors --verbose CalculateTest.php
                PHPUnit 3.5.5 by Sebastian Bergmann.
    5
                CalculateTest
                ......

                Time: 0 seconds, Memory: 5.25Mb

                OK (6 tests, 6 assertions)




                         Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 60
Regression Testing



  @group
                slides$ phpunit --colors --verbose --group BUG-123 CalculateTest.php
                PHPUnit 3.5.5 by Sebastian Bergmann.
    ?
                CalculateTest
                .

                Time: 0 seconds, Memory: 5.25Mb

                OK (1 tests, 1 assertions)




                     /**
                       * Regression-Test BUG-123
                       *
                       * @group BUG-123
                       *
                       * @return void
    ?                  */
                     public function testDivideByZero()
                     {

                          Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 61
Noch Fragen?



  Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 62
Quellen


I   Baby: ADDROX http://www.flickr.com/photos/addrox/2587484034/sizes/m/
I   Fish:   ADDROX http://www.flickr.com/photos/addrox/274632284/sizes/m/
I   Happy: ADDROX http://www.flickr.com/photos/addrox/2610064689/sizes/m/
I   Bug:    ADDROX http://www.flickr.com/photos/addrox/284649644/sizes/m/




                                 Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I   Mayflower GmbH I 02. Dezember 2010 I 63
Vielen Dank für Ihre Aufmerksamkeit!




Kontakt   Max Köhler
          max.koehler@mayflower.de
          +49 89 242054-1160

          Mayflower GmbH
          Mannhardtstr. 6
          80538 München



                                       © 2010 Mayflower GmbH

More Related Content

PDF
Phactory
PDF
Proposed PHP function: is_literal()
PPT
2 introduction toentitybeans
PPT
2009 Hackday Taiwan Yui
KEY
Unit testing with zend framework PHPBenelux
PPTX
Presentacion clean code
 
PDF
Unit testing with zend framework tek11
KEY
Unit testing zend framework apps
Phactory
Proposed PHP function: is_literal()
2 introduction toentitybeans
2009 Hackday Taiwan Yui
Unit testing with zend framework PHPBenelux
Presentacion clean code
 
Unit testing with zend framework tek11
Unit testing zend framework apps

What's hot (9)

PPTX
Mock your way with Mockito
PDF
Leveraging Symfony2 Forms
PDF
Zf2 how arrays will save your project
PDF
GeeCON 2012 Bad Tests, Good Tests
PDF
Confitura 2012 Bad Tests, Good Tests
PDF
eROSE: Guiding programmers in Eclipse
PDF
Instant Dynamic Forms with #states
PDF
A Spring Data’s Guide to Persistence
Mock your way with Mockito
Leveraging Symfony2 Forms
Zf2 how arrays will save your project
GeeCON 2012 Bad Tests, Good Tests
Confitura 2012 Bad Tests, Good Tests
eROSE: Guiding programmers in Eclipse
Instant Dynamic Forms with #states
A Spring Data’s Guide to Persistence
Ad

Similar to Unit Test Fun (20)

PDF
Test doubles and EasyMock
PPT
EasyMock for Java
PPT
Ef Poco And Unit Testing
PPT
Mockito with a hint of PowerMock
PPTX
JUNit Presentation
PDF
Adopting TDD - by Don McGreal
PDF
Effective testing with pytest
PDF
UI Testing
PPTX
Secret unit testing tools no one ever told you about
PDF
31b - JUnit and Mockito.pdf
PDF
Unit-testing and E2E testing in JS
PDF
Javascript Ttesting
PDF
Need(le) for Speed - Effective Unit Testing for Java EE
PDF
PHP Unit Testing in Yii
PPTX
Testable Javascript
DOCX
Rhino Mocks
PPT
Google mock training
PDF
Unit testing basic
PPTX
Unit Testing and Why it Matters
PDF
Asp netmvc e03
Test doubles and EasyMock
EasyMock for Java
Ef Poco And Unit Testing
Mockito with a hint of PowerMock
JUNit Presentation
Adopting TDD - by Don McGreal
Effective testing with pytest
UI Testing
Secret unit testing tools no one ever told you about
31b - JUnit and Mockito.pdf
Unit-testing and E2E testing in JS
Javascript Ttesting
Need(le) for Speed - Effective Unit Testing for Java EE
PHP Unit Testing in Yii
Testable Javascript
Rhino Mocks
Google mock training
Unit testing basic
Unit Testing and Why it Matters
Asp netmvc e03
Ad

More from Mayflower GmbH (20)

PDF
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
PDF
Why and what is go
PDF
Agile Anti-Patterns
PDF
JavaScript Days 2015: Security
PDF
Vom Entwickler zur Führungskraft
PPTX
Produktive teams
PDF
Salt and pepper — native code in the browser Browser using Google native Client
PDF
Plugging holes — javascript memory leak debugging
PDF
Usability im web
PDF
Rewrites überleben
PDF
JavaScript Security
PDF
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
PDF
Responsive Webdesign
PDF
Native Cross-Platform-Apps mit Titanium Mobile und Alloy
PDF
Pair Programming Mythbusters
PDF
Shoeism - Frau im Glück
PDF
Bessere Software schneller liefern
PDF
Von 0 auf 100 in 2 Sprints
PDF
Piwik anpassen und skalieren
PDF
Agilitaet im E-Commerce - E-Commerce Breakfast
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Why and what is go
Agile Anti-Patterns
JavaScript Days 2015: Security
Vom Entwickler zur Führungskraft
Produktive teams
Salt and pepper — native code in the browser Browser using Google native Client
Plugging holes — javascript memory leak debugging
Usability im web
Rewrites überleben
JavaScript Security
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
Responsive Webdesign
Native Cross-Platform-Apps mit Titanium Mobile und Alloy
Pair Programming Mythbusters
Shoeism - Frau im Glück
Bessere Software schneller liefern
Von 0 auf 100 in 2 Sprints
Piwik anpassen und skalieren
Agilitaet im E-Commerce - E-Commerce Breakfast

Recently uploaded (20)

PDF
Machine learning based COVID-19 study performance prediction
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Modernizing your data center with Dell and AMD
PDF
Encapsulation theory and applications.pdf
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Empathic Computing: Creating Shared Understanding
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
Big Data Technologies - Introduction.pptx
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
A Presentation on Artificial Intelligence
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Approach and Philosophy of On baking technology
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Spectral efficient network and resource selection model in 5G networks
Machine learning based COVID-19 study performance prediction
Unlocking AI with Model Context Protocol (MCP)
Modernizing your data center with Dell and AMD
Encapsulation theory and applications.pdf
Review of recent advances in non-invasive hemoglobin estimation
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Empathic Computing: Creating Shared Understanding
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Big Data Technologies - Introduction.pptx
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Network Security Unit 5.pdf for BCA BBA.
A Presentation on Artificial Intelligence
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Approach and Philosophy of On baking technology
MYSQL Presentation for SQL database connectivity
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Dropbox Q2 2025 Financial Results & Investor Presentation
Spectral efficient network and resource selection model in 5G networks

Unit Test Fun

  • 1. Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection Max Köhler I 02. Dezember 2010 © 2010 Mayflower GmbH
  • 2. Wer macht UnitTests? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 2
  • 3. Code Coverage? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 3
  • 4. Wer glaubt, dass die Tests gut sind? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 4
  • 5. Kann die Qualität gesteigert werden? 100% 0% Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 5
  • 6. Test der kompletten Architektur? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 6
  • 7. MVC? Controller View Model Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 7
  • 8. Wie testet Ihr eure Models? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 8
  • 9. Direkter DB-Zugriff? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 9
  • 10. Keine UnitTests! STOP Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 10
  • 11. Integration Tests! Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 11
  • 12. Wie testet Ihr eure Controller? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 12
  • 13. Routes, Auth-Mock, Session-Mock, ...? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 13
  • 14. Keine UnitTests! STOP Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 14
  • 15. Was wollen wir testen? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 15
  • 16. Integration Regression Testing Testing Unit Testing System - Integration Testing Acceptance Testing System Testing Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 16
  • 17. The goal of unit testing is to isolate each part of the program and show that the individual parts are correct Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 17
  • 18. Test Doubles Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 18
  • 19. Stubs Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 19
  • 20. Fake that returns canned data... Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 20
  • 21. Beispiel für ein Auth-Stub $storageData = array( 'accountId' => 29, 'username' => 'Hugo', 'jid' => 'hugo@example.org'); $storage = $this->getMock('Zend_Auth_Storage_Session', array('read')); $storage->expects($this->any()) ->method('read') ->will($this->returnValue($storageData)); Zend_Auth::getInstance()->setStorage($storage); // ... /* * Bei jedem Aufruf wird nun das Mock als Storage * verwendet und dessen Daten ausgelesen */ $session = Zend_Auth::getInstance()->getIdentity(); Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 21
  • 22. Mocks Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 22
  • 23. Spy with expectations... Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 23
  • 24. Model Mapper Beispiel class Application_Model_GuestbookMapper { protected $_dbTable; public function setDbTable(Zend_Db_Table_Abstract $dbTable) { $this->_dbTable = $dbTable; return $this; } public function getDbTable() { return $this->_dbTable; } public function getEmail() {} public function getComment() {} public function save(Application_Model_Guestbook $guestbook) { $data = array( 'email' => $guestbook->getEmail(), 'comment' => $guestbook->getComment(), ); $this->getDbTable()->insert($data); } } Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 24
  • 25. Testen der save() Funktion class Applicatoin_Model_GuestbookMapperTest extends PHPUnit_Framework_TestCase { public function testSave() { $modelStub = $this->getMock('Application_Model_Guestbook', array('getEmail', ,getComment')); $modelStub->expects($this->once()) ->method('getEmail') ->will($this->returnValue('super@email.de')); $modelStub->expects($this->once()) ->method('getComment') ->will($this->returnValue('super comment')); $tableMock = $this->getMock('Zend_Db_Table_Abstract', array('insert'), array(), '', false); $tableMock->expects($this->once()) ->method('insert') ->with($this->equalTo(array( 'email' => 'super@email.de', 'comment' => 'super comment'))); $model = new Application_Model_GuestbookMapper(); $model->setDbTable($tableMock); // << MOCK $model->save($modelStub); // << STUB } } Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 25
  • 26. Stub Mock Fake that Spy with returns canned !== expectations... data... Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 26
  • 27. Fixtures Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 27
  • 28. Set the world up in a known state ... Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 28
  • 29. Fixture-Beispiel class Fixture extends PHPUnit_Framework_TestCase { protected $fixture; protected function setUp() { $this->fixture = array(); } public function testEmpty() { $this->assertTrue(empty($this->fixture)); } public function testPush() { array_push($this->fixture, 'foo'); $this->assertEquals('foo', $this->fixture[0]); } public function testPop() { array_push($this->fixture, 'foo'); $this->assertEquals('foo', array_pop($this->fixture)); $this->assertTrue(empty($this->fixture)); } } Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 29
  • 30. Method Stack Ablauf public static function setUpBeforeClass() { } protected function setUp() { } public function testMyTest() { /* TEST */ } protected function tearDown() { } protected function onNotSuccessfulTest(Exception $e) { } public static function tearDownAfterClass() { } Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 30
  • 31. Test Suite ... Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 31
  • 32. ...wirkt sich auf die Architektur aus. Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 32
  • 33. Wenn nicht... Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 33
  • 34. Developer Titel der Präsentation I Mayflower GmbH I xx. Juni 2010 I 34
  • 35. Was kann man machen? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 35
  • 36. Production Code überarbeiten Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 36
  • 37. Dependency Injection Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 37
  • 38. Bemerkt? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 38
  • 39. Dependency Injection class Application_Model_GuestbookMapper { protected $_dbTable; public function setDbTable(Zend_Db_Table_Abstract $dbTable) { $this->_dbTable = $dbTable; return $this; } public function getDbTable() { return $this->_dbTable; } public function getEmail() {} public function getComment() {} public function save(Application_Model_Guestbook $guestbook) { $data = array( 'email' => $guestbook->getEmail(), 'comment' => $guestbook->getComment(), ); $this->getDbTable()->insert($data); } } Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 39
  • 40. Besser aber ... Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 40
  • 41. ... Begeisterung sieht anders aus! Titel der Präsentation I Mayflower GmbH I xx. Juni 2010 I 41
  • 42. Was könnte noch helfen? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 42
  • 43. TDD? Test Driven Development [ ~~ [ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~ Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 43
  • 44. Probleme früh erkennen! Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 44
  • 45. Uncle Bob´s Three Rules of TDD Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 45
  • 46. #1 “ You are not allowed to write any production code unless it is to make a failing unit test pass. Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 46
  • 47. #2 “ You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures. Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 47
  • 48. #3 “ You are not allowed to write any more production code than is sufficient to pass the one failing unit test. Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 48
  • 49. Und wieder... Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 49
  • 50. Developer Titel der Präsentation I Mayflower GmbH I xx. Juni 2010 I 50
  • 51. Und jetzt? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 51
  • 52. Things get worst before they get better ! Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 52
  • 53. Monate später... Titel der Präsentation I Mayflower GmbH I xx. Juni 2010 I 53
  • 54. Gibts noch was? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 54
  • 55. Darf ich vorstellen: „Bug“ Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 55
  • 56. Regression Testing or Test your Bugs! Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 56
  • 57. Regression Testing Bug class Calculate { public function divide($dividend, $divisor) 1 { return $dividend / $divisor; } } 2 Warning: Division by zero in /srv/phpunit-slides/Calculate.php on line 7 Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 57
  • 58. Regression Testing Test First! /** * Regression-Test BUG-123 * * @group BUG-123 * * @return void 3 */ public function testDivideByZero() { $calc = new Calculate(); $this->assertEquals(0, $calc->divide(1, 0)); } Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 58
  • 59. Regression Testing Bugfix class Calculate { 4 public function divide($dividend, $divisor) { if (0 == $divisor) { return 0; } return $dividend / $divisor; } } Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 59
  • 60. Regression Testing phpunit slides$ phpunit --colors --verbose CalculateTest.php PHPUnit 3.5.5 by Sebastian Bergmann. 5 CalculateTest ...... Time: 0 seconds, Memory: 5.25Mb OK (6 tests, 6 assertions) Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 60
  • 61. Regression Testing @group slides$ phpunit --colors --verbose --group BUG-123 CalculateTest.php PHPUnit 3.5.5 by Sebastian Bergmann. ? CalculateTest . Time: 0 seconds, Memory: 5.25Mb OK (1 tests, 1 assertions) /** * Regression-Test BUG-123 * * @group BUG-123 * * @return void ? */ public function testDivideByZero() { Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 61
  • 62. Noch Fragen? Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 62
  • 63. Quellen I Baby: ADDROX http://www.flickr.com/photos/addrox/2587484034/sizes/m/ I Fish: ADDROX http://www.flickr.com/photos/addrox/274632284/sizes/m/ I Happy: ADDROX http://www.flickr.com/photos/addrox/2610064689/sizes/m/ I Bug: ADDROX http://www.flickr.com/photos/addrox/284649644/sizes/m/ Unit Test Fun: Mock Objects, Fixtures, Stubs & Dependency Injection I Mayflower GmbH I 02. Dezember 2010 I 63
  • 64. Vielen Dank für Ihre Aufmerksamkeit! Kontakt Max Köhler max.koehler@mayflower.de +49 89 242054-1160 Mayflower GmbH Mannhardtstr. 6 80538 München © 2010 Mayflower GmbH