SlideShare a Scribd company logo
1 of 41
Download to read offline
Unit Testing


    Merangkak Menuju Pengembangan Aplikasi
    PHP yang Berkualitas dan Tahan Banting


                Arthur Purnama
             arthur [at] purnama.de
            http://arthur.purnama.de
                    06.04.2011
Arthur Purnama

   Diplom Informatiker Hochschule Fulda
   Sejak 2004 bekerja sebagai PHP
    Programmer
   Sejak 2008 bekerja sebagai ITConsultant
    divisi Portal Solutions
   Saat ini tinggal di Frankfurt am Main, Jerman
Tujuan

   Memperkenalkan Unit Testing
   Mendorong atau memotivasi penggunaan
    Unit Testing
   Memperkenalkan Unit Testing Framework
    PHPUnit
Rutinitas Test Programer PHP

   Berjam-jam mencari bug
   Debugger? apaan tuh?
   Teman setia: echo, print_r, var_dump
   Mati satu tumbuh seribu (bug baru)
   Bug Lama Bersemi Kembali
Unit Testing

   In computer programming, unit testing is a
    method by which individual units of source
    code are tested to determine if they are fit for
    use.
   A unit is the smallest testable part of an
    application.
   In object-oriented programming a unit is
    usually a method.
    http://en.wikipedia.org/wiki/Unit_testing
Unit Testing

   Dalam pemrograman komputer, unit testing
    merupakan suatu metode yang mana satu
    unit dalam source code diuji untuk
    menunjukkan bahwa code tersebut bekerja
    sebagaimana mestinya.
   Unit adalah bagian terkecil dari satu aplikasi
    yang dapat diuji.
   Dalam pemrograman berorientasi obyek, unit
    biasanya adalah method.
Contoh

   function multiplicate($a, $b){
       return $a*$b;
   }

   echo   multiplicate(1, 2) === 2 ? true : false;
   echo   PHP_EOL;
   echo   multiplicate(2, 2) === 4 ? true : false;
   echo   PHP_EOL;
   echo   multiplicate(3, 2) !== 5 ? true : false;
Kelebihan Unit Testing

   Yakin setiap saat bahwa code berfungsi
    sebagaimana mestinya.
   Yakin setiap kali aplikasi berkembang, code
    tetap berfungsi sebagaimana mestinya.
   Yakin setiap kali melakukan re-design atau
    refakturisasi, code tetap berfungsi
    sebagaimana mestinya.
Kelebihan Unit Testing

   Menjadi bagian dari dokumentasi code
   Mempermudah Integrasi antar komponen
   Meningkatkan kualitas code
Unsur Unit Testing

   Harus di otomatisasi
   Dapat dijalankan dengan sekali klick
   Dapat dengan mudah diulang
   Mudah diimplementasikan
   Setelah ditulis dapat dijalankan kapan saja
   Setiap orang dapat menjalankannya
   Berjalan dengan cepat
Unit Test != Integration Test

   Unit Test
       Tidak berinteraksi dengan basis data
       Tidak berinteraksi dengan Jaringan
       Tidak berinteraksi dengan File System
       Tidak membutuhkan konfigurasi khusus untuk
        menjalankannya
       Terisolasi dari komponen atau kelas konkrit
        lainnya
Unit Testing Framework

   PHPUnit
       Unit Testing Framework
       Ditulis oleh Sebastian Bergmann
       De facto standard untuk PHP
       Banyak didukung oleh Tools dan Framework lain
Contoh Unit Testing Multiplikasi
<?php
//MultiplikasiTest.php
require_once 'multiplikasi.php';

class BelajarUnitTest extends PHPUnit_Framework_TestCase{




}
?>
Contoh Unit Testing Multiplikasi
<?php
//MultiplikasiTest.php
require_once 'multiplikasi.php';

class BelajarUnitTest extends PHPUnit_Framework_TestCase{
  //Nama fungsi menggunakan awalan “test“
   public function testMultiplicate(){



     }

}
?>
Contoh Unit Testing Multiplikasi
<?php
//MultiplikasiTest.php
require_once 'multiplikasi.php';

class BelajarUnitTest extends PHPUnit_Framework_TestCase{
  //Nama fungsi menggunakan awalan “test“
   public function testMultiplicate(){

         $this->assertEquals(2, multiplicate(1, 2));

     }

}
?>
Contoh Unit Testing Multiplikasi
$>phpunit BelajarUnitTest MultiplikasiTest.php
PHPUnit 3.5.12 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 3.00Mb

OK (1 test, 1 assertion)
Contoh Unit Testing Multiplikasi
<?php
//MultiplikasiTest.php
require_once 'multiplikasi.php';

class BelajarUnitTest extends PHPUnit_Framework_TestCase{

     public function testMultiplicate(){
         //Sangat tidak dianjurkan. Pastikan hanya selalu menguji SATU hal
         $this->assertEquals(2, multiplicate(1, 2));
         $this->assertEquals(5, multiplicate(3, 2));
         $this->assertEquals(4, multiplicate(2, 2));

     }

}
?>
Contoh Unit Testing Multiplikasi
$>phpunit BelajarUnitTest MultiplikasiTest.php
PHPUnit 3.5.12 by Sebastian Bergmann.

F

Time: 0 seconds, Memory: 3.00Mb

There was 1 failure:

1) BelajarUnitTest::testMultiplicate
Failed asserting that <integer:6> matches expected <integer:5>.

$MultiplikasiTest.php:10

FAILURES!
Tests: 1, Assertions: 2, Failures: 1.
Contoh Unit Testing Multiplikasi
<?php
//MultiplikasiTest.php
require_once 'multiplikasi.php';

class BelajarUnitTest extends PHPUnit_Framework_TestCase{

     public function testMultiplicate1And2(){
        $this->assertEquals(2, multiplicate(1, 2));
     }

     public function testMultiplicate3And2(){
        $this->assertEquals(5, multiplicate(3, 2));
     }

     public function testMultiplicate2And2(){
        $this->assertEquals(4, multiplicate(2, 2));
     }

}
?>
Contoh Unit Testing Multiplikasi
$>phpunit MultiplikasiTest.php
PHPUnit 3.5.12 by Sebastian Bergmann.

.F.

Time: 0 seconds, Memory: 3.00Mb

There was 1 failure:

1) BelajarUnitTest::testMultiplicate3And2
Failed asserting that <integer:6> matches expected <integer:5>.

$MultiplikasiTest.php:12

FAILURES!
Tests: 3, Assertions: 3, Failures: 1.
Contoh Unit Testing Multiplikasi
<?php
//MultiplikasiTest.php
require_once 'multiplikasi.php';

class BelajarUnitTest extends PHPUnit_Framework_TestCase{

     public function testMultiplicate1And2(){
        $this->assertEquals(2, multiplicate(1, 2));
     }

     public function testMultiplicate3And2(){
        $this->assertNotEquals(5, multiplicate(3, 2));
     }

     public function testMultiplicate2And2(){
        $this->assertEquals(4, multiplicate(2, 2));
     }

}
?>
Contoh Unit Testing Multiplikasi
$>phpunit BelajarUnitTest MultiplikasiTest.php
PHPUnit 3.5.12 by Sebastian Bergmann.

...

Time: 0 seconds, Memory: 3.00Mb

OK (3 tests, 3 assertions)
Contoh Unit Testing Multiplikasi
$>phpunit --testdox BelajarUnitTest MultiplikasiTest.php
PHPUnit 3.5.12 by Sebastian Bergmann.

BelajarUnitTest
 [x] Multiplicate 1 and 2
 [x] Multiplicate 3 and 2
 [x] Multiplicate 2 and 2
Tapi.. Code saya seperti ini..
<?php
// Connects to your Database
mysql_connect ( "your.hostaddress.com", "username", "password" ) or die ( mysql_error () );
mysql_select_db ( "Database_Name" ) or die ( mysql_error () );
//checks cookies to make sure they are logged in
if (isset ( $_SESSION ['ID_my_site'] )) {
      $username = $_ SESSION ['ID_my_site'];
      $pass = $_ SESSION ['Key_my_site'];
      $check = mysql_query ( "SELECT * FROM users WHERE username = '$username'" ) or die ( mysql_error () );
      $result = mysql_fetch_array ( $check );
      foreach ( $result as $info ) {
           //if the cookie has the wrong password, they are taken to the login page
           if ($pass != $info ['password']) {
                header ( "Location: login.php" );
           } else { //otherwise they are shown the admin area
                echo "<p>Admin Area</p>";
                echo "<p>Your Content<p>";
                echo "<a href=logout.php>Logout</a>";
           }
      }
} else {
      //if the cookie does not exist, they are taken to the login screen
      header ( "Location: login.php" );
}

?>
Core techniques

   Refactoring
   Separation of Concern
   Inversion of Control (Dependency Injection)
   Design by Contract
   Design Patterns
Contoh Refactoring
<?php
namespace myappsecurity;

use myappdaosinterfacesUser;
use myapputilinterfacesSession;

class Authorize implements interfacesAuthorize{
     private $userDAO;
     private $session;

     public function __construct(User $userDAO, Session $session) {
         $this->userDAO = $userDAO;
         $this->session = $session;
     }

     public function isAuthorize(){
         if($this->session->isAuthenticate()){
              $user = $this->userDAO->getByUsername($this->session->getUsername());
              return $this->session->getPassword() === $user->getPassword();
         }else{
              return false;
         }
     }
}
?>
Mocks & Stubs
<?php                                            <?php
namespace myappmocks;                           namespace myappmocks;

use myappdaosinterfacesUser;                  use myapputilinterfacesSession;

class UserPalsu implements User{                 class SessionPalsu implements Session{

     public function getById($id){                    public function getUsername(){
         return null;                                     return null;
     }                                                }

     public function getByUsername($username){        public function getPassword(){
         return null;                                     return null;
     }                                                }

     public function getAll(){                        public function isAuthenticate(){
         return null;                                     return false;
     }                                                }
}                                                }
?>                                               ?>
Unit Test Authorize
<?php

use myappsecurityAuthorize;
use myappmocksSessionPalsu;
use myappmocksUserPalsu;
class AuthorizeTest extends PHPUnit_Framework_TestCase {

     public function testIsAuthorizeSessionNotAuthenticate(){
        $userDAO = new UserPalsu();
        $session = new SessionPalsu();
        $authorize = new Authorize($userDAO, $session);
        $this->assertFalse($authorize->isAuthorize());
     }
}

?>
Mocks & Stubs
<?php                                             <?php
namespace myappmocks;                            namespace myappmocks;
use myappmodels;                                 use myapputilinterfacesSession;
                                                  class SessionPalsu implements Session{
use myappdaosinterfacesUser;
                                                        private $username;
class UserPalsu implements User{
                                                        private $password;
     private $user;                                     private $authenticate;
     public function getById($id){                      public function getUsername() {
         return null;                                        return $this->username;
     }                                                  }
                                                        public function setUsername($username) {
     public function getByUsername($username){               $this->username = $username;
         return $this->user;                            }
                                                        public function getPassword() {
     }
                                                             return $this->password;
                                                        }
     public function getAll(){                          public function setPassword($password) {
         return null;                                        $this->password = $password;
     }                                                  }
                                                        public function isAuthenticate(){
     public function                                         return $this->authenticate;
         setUser(modelsinterfacesUser $user){         }
         $this->user = $user;                           public function setAuthenticate($authenticate){
     }                                                       $this->authenticate = $authenticate;
}                                                       }
                                                  }
?>
                                                  ?>
Unit Test Authorize
<?php
use myappmodelsUser;
use myappsecurityAuthorize;
use myappmocksSessionPalsu;
use myappmocksUserPalsu;
class AuthorizeTest extends PHPUnit_Framework_TestCase {
      //public function testIsAuthorizeSessionNotAuthenticate(){...
      public function testIsAuthorizeSessionAuthenticateButWrongPassword(){
           $userDAO = new UserPalsu();
           $user = new User("username", "password");
           $userDAO->setUser($user);
           $session = new SessionPalsu();
           $session->setPassword("wrongpassword");
           $authorize = new Authorize($userDAO, $session);
           $this->assertFalse($authorize->isAuthorize());
      }
      public function testIsAuthorizeSessionAuthenticateCorrectPassword(){
           $userDAO = new UserPalsu();
           $user = new User("username", "password");
           $userDAO->setUser($user);
           $session = new SessionPalsu();
           $session->setPassword("password");
           $authorize = new Authorize($userDAO, $session);
           $this->assertTrue($authorize->isAuthorize());
      }
}
?>
Mengorganisir Unit Test

   Fixture
   Bootstrap
   Stubs & Mocks Tools
   Test Suite
   Code Coverage
Fixtures
<?php
use myappmodelsUser;
use myappsecurityAuthorize;
use myappmocksSessionPalsu;
use myappmocksUserPalsu;
class AuthorizeTest extends PHPUnit_Framework_TestCase {
      private $userDAO;
      private $session;
      public function setUp(){
           $this->userDAO = new UserPalsu();
           $user = new User("username", "password");
           $this->userDAO->setUser($user);
           $this->session = new SessionPalsu();
           $this->session->setAuthenticate(true);
      }
      public function tearDown(){
           $this->userDAO = null;
           $this->session = null;
      }
      //public function testIsAuthorizeSessionNotAuthenticate(){..
      public function testIsAuthorizeSessionAuthenticateButWrongPassword(){
           $this->session->setPassword("wrongpassword");
           $authorize = new Authorize($this->userDAO, $this->session);
           $this->assertFalse($authorize->isAuthorize());
      }
      public function testIsAuthorizeSessionAuthenticateCorrectPassword(){
           $this->session->setPassword("password");
           $authorize = new Authorize($this->userDAO, $this->session);
           $this->assertTrue($authorize->isAuthorize());
      }
}?>
Bootstrap

<phpunit bootstrap="/path/to/bootstrap.php"
         colors="false"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         stopOnFailure="true">
  <!-- ... -->
</phpunit>
Stubs and Mocks Tools
<?php
use myappsecurityAuthorize;
class AuthorizeTest extends PHPUnit_Framework_TestCase {
      private $userDAO;
      private $session;
      public function setUp() {
            $this->userDAO = $this->getMock ( 'myappdaosUser' );
            $user = $this->getMock ( 'myappmodelsUser', array(), array(), '', false, false, false );
            $user->expects ( $this->any () )->method ( 'getUsername' )->will ( $this->returnValue ( 'username' ) );
            $user->expects ( $this->any () )->method ( 'getPassword' )->will ( $this->returnValue ( 'password' ) );
            $this->userDAO->expects ( $this->any () )->method ( 'getByUsername' )->will ( $this->returnValue ( $user ) );
            $this->session = $this->getMock ( 'myapputilSession', array(), array(), '', false, false, false );
            $this->session->expects ( $this->any () )->method ( 'isAuthenticate' )->will ( $this->returnValue ( true ) );
      }
      public function tearDown() {
           $this->userDAO = null;
           $this->session = null;
      }
      //public function testIsAuthorizeSessionNotAuthenticate(){...
      public function testIsAuthorizeSessionAuthenticateButWrongPassword() {
           $this->session->expects ( $this->any () )->method ( 'getPassword' )->will ( $this->returnValue ( 'wrongpassword' ) );
           $authorize = new Authorize ( $this->userDAO, $this->session );
           $this->assertFalse ( $authorize->isAuthorize () );
      }
      public function testIsAuthorizeSessionAuthenticateCorrectPassword() {
           $this->session->expects ( $this->any () )->method ( 'getPassword' )->will ( $this->returnValue ( 'password' ) );
           $authorize = new Authorize ( $this->userDAO, $this->session );
           $this->assertTrue ( $authorize->isAuthorize () );
      }
}
?>
Test Suite File System
Object                             Tests
|-- Freezer                        |-- Freezer
|   |-- HashGenerator              |   |-- HashGenerator
|   |   `-- NonRecursiveSHA1.php   |   |   `-- NonRecursiveSHA1Test.php
|   |-- HashGenerator.php          |   |
|   |-- IdGenerator                |   |-- IdGenerator
|   |   `-- UUID.php               |   |   `-- UUIDTest.php
|   |-- IdGenerator.php            |   |
|   |-- LazyProxy.php              |   |
|   |-- Storage                    |   |-- Storage
|   |   `-- CouchDB.php            |   |   `-- CouchDB
|   |                              |   |       |-- WithLazyLoadTest.php
|   |                              |   |       `-- WithoutLazyLoadTest.php
|   |-- Storage.php                |   |-- StorageTest.php
|   `-- Util.php                   |   `-- UtilTest.php
`-- Freezer.php                    `-- FreezerTest.php


$>phpunit Tests
PHPUnit 3.5.13 by Sebastian Bergmann.

............................................................ 60 / 75
...............

Time: 0 seconds

OK (75 tests, 164 assertions)
Test Suite XML

<phpunit>
  <testsuites>
    <testsuite name="Object_Freezer">
      <file>Tests/Freezer/HashGenerator/NonRecursiveSHA1Test.php</file>
      <file>Tests/Freezer/IdGenerator/UUIDTest.php</file>
      <file>Tests/Freezer/UtilTest.php</file>
      <file>Tests/FreezerTest.php</file>
      <file>Tests/Freezer/StorageTest.php</file>
      <file>Tests/Freezer/Storage/CouchDB/WithLazyLoadTest.php</file>
      <file>Tests/Freezer/Storage/CouchDB/WithoutLazyLoadTest.php</file>
    </testsuite>
  </testsuites>
</phpunit>
Code Coverage
Memulai Unit Testing

   Yakinkan diri sendiri
   Kumpulkan Case Study atau Success Story
       http://biblio.gdinwiddie.com/biblio/StudiesOfTestDrivenDevelopment

   Cari Pendukung / Panggil Konsultan
   Tentukan Tujuan
   Catat Perkembangan
   Bersiap menghadapi rintangan
Kemana Setelah Ini

   Metodologi
       Test Driven Development
       Behaviour Driven Development
   Tools Pendukung
       IDE (Zend Studio, PHPStorm, PDT, NetBeans)
       Build Automation (Ant, Maven, Phing)
       Continuous Integration
   Test Lain menggunakan PHPUnit
       Database Testing
       UI Testing (Selenium)
   Diskusi terbuka di Milist / Groups
Referensi

   Wikipedia
       http://en.wikipedia.org/wiki/Unit_testing
   „PHPUnit Manual“ – Sebastian Bergmann
       http://www.phpunit.de/manual/current/en/
   „Getting Started With PHPUnit “ – Sebastian
    Bergmann
       http://www.slideshare.net/sebastian_bergmann/getting-started-with-phpunit

   „The Art of Unit Testing“ - Roy Osherove
   „Unit Testing Fundamentals“ – Richard Paul
       http://www.slideshare.net/rapaul/unit-testing-fundamentals
   „Embrace Unit Testing“ – Alessio Pace
       http://www.slideshare.net/alessiopace/embrace-unit-testing
   Web: http://arthur.purnama.de
   Mail: arthur [at] purnama.de
   Twitter: @purnama
   Groups:
       phpug@yahoogroups.com
       Id-php@yahoogroups.com

More Related Content

What's hot

PhpUnit Best Practices
PhpUnit Best PracticesPhpUnit Best Practices
PhpUnit Best PracticesEdorian
 
PHPUnit: from zero to hero
PHPUnit: from zero to heroPHPUnit: from zero to hero
PHPUnit: from zero to heroJeremy Cook
 
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
 
Unit Testing using PHPUnit
Unit Testing using  PHPUnitUnit Testing using  PHPUnit
Unit Testing using PHPUnitvaruntaliyan
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applicationschartjes
 
Advanced PHPUnit Testing
Advanced PHPUnit TestingAdvanced PHPUnit Testing
Advanced PHPUnit TestingMike Lively
 
Test your code like a pro - PHPUnit in practice
Test your code like a pro - PHPUnit in practiceTest your code like a pro - PHPUnit in practice
Test your code like a pro - PHPUnit in practiceSebastian Marek
 
Unit Testing Presentation
Unit Testing PresentationUnit Testing Presentation
Unit Testing Presentationnicobn
 
Test Driven Development with PHPUnit
Test Driven Development with PHPUnitTest Driven Development with PHPUnit
Test Driven Development with PHPUnitMindfire Solutions
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownpartsBastian Feder
 
Тестирование и Django
Тестирование и DjangoТестирование и Django
Тестирование и DjangoMoscowDjango
 
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
 
Devoxx 15 equals hashcode
Devoxx 15 equals hashcodeDevoxx 15 equals hashcode
Devoxx 15 equals hashcodebleporini
 
Testing Code and Assuring Quality
Testing Code and Assuring QualityTesting Code and Assuring Quality
Testing Code and Assuring QualityKent Cowgill
 
Test in action week 2
Test in action   week 2Test in action   week 2
Test in action week 2Yi-Huan Chan
 

What's hot (20)

PhpUnit Best Practices
PhpUnit Best PracticesPhpUnit Best Practices
PhpUnit Best Practices
 
PHPUnit: from zero to hero
PHPUnit: from zero to heroPHPUnit: from zero to hero
PHPUnit: from zero to hero
 
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
 
Unit Testing using PHPUnit
Unit Testing using  PHPUnitUnit Testing using  PHPUnit
Unit Testing using PHPUnit
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
 
Advanced PHPUnit Testing
Advanced PHPUnit TestingAdvanced PHPUnit Testing
Advanced PHPUnit Testing
 
Test your code like a pro - PHPUnit in practice
Test your code like a pro - PHPUnit in practiceTest your code like a pro - PHPUnit in practice
Test your code like a pro - PHPUnit in practice
 
Unit Testing Presentation
Unit Testing PresentationUnit Testing Presentation
Unit Testing Presentation
 
Test Driven Development with PHPUnit
Test Driven Development with PHPUnitTest Driven Development with PHPUnit
Test Driven Development with PHPUnit
 
PHPUnit testing to Zend_Test
PHPUnit testing to Zend_TestPHPUnit testing to Zend_Test
PHPUnit testing to Zend_Test
 
What's new with PHP7
What's new with PHP7What's new with PHP7
What's new with PHP7
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
 
Тестирование и Django
Тестирование и DjangoТестирование и Django
Тестирование и Django
 
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
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Devoxx 15 equals hashcode
Devoxx 15 equals hashcodeDevoxx 15 equals hashcode
Devoxx 15 equals hashcode
 
Testing Code and Assuring Quality
Testing Code and Assuring QualityTesting Code and Assuring Quality
Testing Code and Assuring Quality
 
Test in action week 2
Test in action   week 2Test in action   week 2
Test in action week 2
 
Symfony2 - OSIDays 2010
Symfony2 - OSIDays 2010Symfony2 - OSIDays 2010
Symfony2 - OSIDays 2010
 

Similar to EPHPC Webinar Slides: Unit Testing by Arthur Purnama

13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboards13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboardsDenis Ristic
 
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
 
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
 
UA testing with Selenium and PHPUnit - TrueNorthPHP 2013
UA testing with Selenium and PHPUnit - TrueNorthPHP 2013UA testing with Selenium and PHPUnit - TrueNorthPHP 2013
UA testing with Selenium and PHPUnit - TrueNorthPHP 2013Michelangelo van Dam
 
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
 
Fighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnitFighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnitJames Fuller
 
Automated Unit Testing
Automated Unit TestingAutomated Unit Testing
Automated Unit TestingMike Lively
 
Better Testing With PHP Unit
Better Testing With PHP UnitBetter Testing With PHP Unit
Better Testing With PHP Unitsitecrafting
 
Unit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentUnit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentMark Niebergall
 
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
 
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
 
PHPunit and you
PHPunit and youPHPunit and you
PHPunit and youmarkstory
 
Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8Michelangelo van Dam
 
Getting started with TDD - Confoo 2014
Getting started with TDD - Confoo 2014Getting started with TDD - Confoo 2014
Getting started with TDD - Confoo 2014Eric Hogue
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastWorkshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastMichelangelo van Dam
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to javaciklum_ods
 

Similar to EPHPC Webinar Slides: Unit Testing by Arthur Purnama (20)

Unit testing
Unit testingUnit testing
Unit testing
 
13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboards13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboards
 
Php Unit With Zend Framework Zendcon09
Php Unit With Zend Framework   Zendcon09Php Unit With Zend Framework   Zendcon09
Php Unit With Zend Framework Zendcon09
 
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)
 
UA testing with Selenium and PHPUnit - TrueNorthPHP 2013
UA testing with Selenium and PHPUnit - TrueNorthPHP 2013UA testing with Selenium and PHPUnit - TrueNorthPHP 2013
UA testing with Selenium and PHPUnit - TrueNorthPHP 2013
 
Php unit (eng)
Php unit (eng)Php unit (eng)
Php unit (eng)
 
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
 
Fighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnitFighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnit
 
Automated Unit Testing
Automated Unit TestingAutomated Unit Testing
Automated Unit Testing
 
Better Testing With PHP Unit
Better Testing With PHP UnitBetter Testing With PHP Unit
Better Testing With PHP Unit
 
PHP Unit Testing
PHP Unit TestingPHP Unit Testing
PHP Unit Testing
 
Unit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentUnit Testing from Setup to Deployment
Unit Testing from Setup to Deployment
 
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
 
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
 
Unittests für Dummies
Unittests für DummiesUnittests für Dummies
Unittests für Dummies
 
PHPunit and you
PHPunit and youPHPunit and you
PHPunit and you
 
Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8
 
Getting started with TDD - Confoo 2014
Getting started with TDD - Confoo 2014Getting started with TDD - Confoo 2014
Getting started with TDD - Confoo 2014
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastWorkshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfast
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
 

More from Enterprise PHP Center

Microsoft TechDays 2011 - PHP on Windows
Microsoft TechDays 2011 - PHP on WindowsMicrosoft TechDays 2011 - PHP on Windows
Microsoft TechDays 2011 - PHP on WindowsEnterprise PHP Center
 
PHP on Windows Training Program - New Horizons Computer Learning Center Singa...
PHP on Windows Training Program - New Horizons Computer Learning Center Singa...PHP on Windows Training Program - New Horizons Computer Learning Center Singa...
PHP on Windows Training Program - New Horizons Computer Learning Center Singa...Enterprise PHP Center
 
Accelerate the ROI of PHP in your Enterprise
	Accelerate the ROI of PHP in your Enterprise	Accelerate the ROI of PHP in your Enterprise
Accelerate the ROI of PHP in your EnterpriseEnterprise PHP Center
 
Cisco webex zend con2010 presentation
Cisco webex zend con2010 presentationCisco webex zend con2010 presentation
Cisco webex zend con2010 presentationEnterprise PHP Center
 
Cisco webex zend con2010 presentation
Cisco webex zend con2010 presentationCisco webex zend con2010 presentation
Cisco webex zend con2010 presentationEnterprise PHP Center
 
ZendCon2010 - PHP Industrialization at France Telecom - ORANGE
ZendCon2010 - PHP Industrialization at France Telecom - ORANGEZendCon2010 - PHP Industrialization at France Telecom - ORANGE
ZendCon2010 - PHP Industrialization at France Telecom - ORANGEEnterprise PHP Center
 

More from Enterprise PHP Center (7)

Zend PHP Solutions for IBM i
Zend PHP Solutions for IBM iZend PHP Solutions for IBM i
Zend PHP Solutions for IBM i
 
Microsoft TechDays 2011 - PHP on Windows
Microsoft TechDays 2011 - PHP on WindowsMicrosoft TechDays 2011 - PHP on Windows
Microsoft TechDays 2011 - PHP on Windows
 
PHP on Windows Training Program - New Horizons Computer Learning Center Singa...
PHP on Windows Training Program - New Horizons Computer Learning Center Singa...PHP on Windows Training Program - New Horizons Computer Learning Center Singa...
PHP on Windows Training Program - New Horizons Computer Learning Center Singa...
 
Accelerate the ROI of PHP in your Enterprise
	Accelerate the ROI of PHP in your Enterprise	Accelerate the ROI of PHP in your Enterprise
Accelerate the ROI of PHP in your Enterprise
 
Cisco webex zend con2010 presentation
Cisco webex zend con2010 presentationCisco webex zend con2010 presentation
Cisco webex zend con2010 presentation
 
Cisco webex zend con2010 presentation
Cisco webex zend con2010 presentationCisco webex zend con2010 presentation
Cisco webex zend con2010 presentation
 
ZendCon2010 - PHP Industrialization at France Telecom - ORANGE
ZendCon2010 - PHP Industrialization at France Telecom - ORANGEZendCon2010 - PHP Industrialization at France Telecom - ORANGE
ZendCon2010 - PHP Industrialization at France Telecom - ORANGE
 

EPHPC Webinar Slides: Unit Testing by Arthur Purnama

  • 1. Unit Testing Merangkak Menuju Pengembangan Aplikasi PHP yang Berkualitas dan Tahan Banting Arthur Purnama arthur [at] purnama.de http://arthur.purnama.de 06.04.2011
  • 2. Arthur Purnama  Diplom Informatiker Hochschule Fulda  Sejak 2004 bekerja sebagai PHP Programmer  Sejak 2008 bekerja sebagai ITConsultant divisi Portal Solutions  Saat ini tinggal di Frankfurt am Main, Jerman
  • 3. Tujuan  Memperkenalkan Unit Testing  Mendorong atau memotivasi penggunaan Unit Testing  Memperkenalkan Unit Testing Framework PHPUnit
  • 4. Rutinitas Test Programer PHP  Berjam-jam mencari bug  Debugger? apaan tuh?  Teman setia: echo, print_r, var_dump  Mati satu tumbuh seribu (bug baru)  Bug Lama Bersemi Kembali
  • 5. Unit Testing  In computer programming, unit testing is a method by which individual units of source code are tested to determine if they are fit for use.  A unit is the smallest testable part of an application.  In object-oriented programming a unit is usually a method. http://en.wikipedia.org/wiki/Unit_testing
  • 6. Unit Testing  Dalam pemrograman komputer, unit testing merupakan suatu metode yang mana satu unit dalam source code diuji untuk menunjukkan bahwa code tersebut bekerja sebagaimana mestinya.  Unit adalah bagian terkecil dari satu aplikasi yang dapat diuji.  Dalam pemrograman berorientasi obyek, unit biasanya adalah method.
  • 7. Contoh function multiplicate($a, $b){ return $a*$b; } echo multiplicate(1, 2) === 2 ? true : false; echo PHP_EOL; echo multiplicate(2, 2) === 4 ? true : false; echo PHP_EOL; echo multiplicate(3, 2) !== 5 ? true : false;
  • 8. Kelebihan Unit Testing  Yakin setiap saat bahwa code berfungsi sebagaimana mestinya.  Yakin setiap kali aplikasi berkembang, code tetap berfungsi sebagaimana mestinya.  Yakin setiap kali melakukan re-design atau refakturisasi, code tetap berfungsi sebagaimana mestinya.
  • 9. Kelebihan Unit Testing  Menjadi bagian dari dokumentasi code  Mempermudah Integrasi antar komponen  Meningkatkan kualitas code
  • 10. Unsur Unit Testing  Harus di otomatisasi  Dapat dijalankan dengan sekali klick  Dapat dengan mudah diulang  Mudah diimplementasikan  Setelah ditulis dapat dijalankan kapan saja  Setiap orang dapat menjalankannya  Berjalan dengan cepat
  • 11. Unit Test != Integration Test  Unit Test  Tidak berinteraksi dengan basis data  Tidak berinteraksi dengan Jaringan  Tidak berinteraksi dengan File System  Tidak membutuhkan konfigurasi khusus untuk menjalankannya  Terisolasi dari komponen atau kelas konkrit lainnya
  • 12. Unit Testing Framework  PHPUnit  Unit Testing Framework  Ditulis oleh Sebastian Bergmann  De facto standard untuk PHP  Banyak didukung oleh Tools dan Framework lain
  • 13. Contoh Unit Testing Multiplikasi <?php //MultiplikasiTest.php require_once 'multiplikasi.php'; class BelajarUnitTest extends PHPUnit_Framework_TestCase{ } ?>
  • 14. Contoh Unit Testing Multiplikasi <?php //MultiplikasiTest.php require_once 'multiplikasi.php'; class BelajarUnitTest extends PHPUnit_Framework_TestCase{ //Nama fungsi menggunakan awalan “test“ public function testMultiplicate(){ } } ?>
  • 15. Contoh Unit Testing Multiplikasi <?php //MultiplikasiTest.php require_once 'multiplikasi.php'; class BelajarUnitTest extends PHPUnit_Framework_TestCase{ //Nama fungsi menggunakan awalan “test“ public function testMultiplicate(){ $this->assertEquals(2, multiplicate(1, 2)); } } ?>
  • 16. Contoh Unit Testing Multiplikasi $>phpunit BelajarUnitTest MultiplikasiTest.php PHPUnit 3.5.12 by Sebastian Bergmann. . Time: 0 seconds, Memory: 3.00Mb OK (1 test, 1 assertion)
  • 17. Contoh Unit Testing Multiplikasi <?php //MultiplikasiTest.php require_once 'multiplikasi.php'; class BelajarUnitTest extends PHPUnit_Framework_TestCase{ public function testMultiplicate(){ //Sangat tidak dianjurkan. Pastikan hanya selalu menguji SATU hal $this->assertEquals(2, multiplicate(1, 2)); $this->assertEquals(5, multiplicate(3, 2)); $this->assertEquals(4, multiplicate(2, 2)); } } ?>
  • 18. Contoh Unit Testing Multiplikasi $>phpunit BelajarUnitTest MultiplikasiTest.php PHPUnit 3.5.12 by Sebastian Bergmann. F Time: 0 seconds, Memory: 3.00Mb There was 1 failure: 1) BelajarUnitTest::testMultiplicate Failed asserting that <integer:6> matches expected <integer:5>. $MultiplikasiTest.php:10 FAILURES! Tests: 1, Assertions: 2, Failures: 1.
  • 19. Contoh Unit Testing Multiplikasi <?php //MultiplikasiTest.php require_once 'multiplikasi.php'; class BelajarUnitTest extends PHPUnit_Framework_TestCase{ public function testMultiplicate1And2(){ $this->assertEquals(2, multiplicate(1, 2)); } public function testMultiplicate3And2(){ $this->assertEquals(5, multiplicate(3, 2)); } public function testMultiplicate2And2(){ $this->assertEquals(4, multiplicate(2, 2)); } } ?>
  • 20. Contoh Unit Testing Multiplikasi $>phpunit MultiplikasiTest.php PHPUnit 3.5.12 by Sebastian Bergmann. .F. Time: 0 seconds, Memory: 3.00Mb There was 1 failure: 1) BelajarUnitTest::testMultiplicate3And2 Failed asserting that <integer:6> matches expected <integer:5>. $MultiplikasiTest.php:12 FAILURES! Tests: 3, Assertions: 3, Failures: 1.
  • 21. Contoh Unit Testing Multiplikasi <?php //MultiplikasiTest.php require_once 'multiplikasi.php'; class BelajarUnitTest extends PHPUnit_Framework_TestCase{ public function testMultiplicate1And2(){ $this->assertEquals(2, multiplicate(1, 2)); } public function testMultiplicate3And2(){ $this->assertNotEquals(5, multiplicate(3, 2)); } public function testMultiplicate2And2(){ $this->assertEquals(4, multiplicate(2, 2)); } } ?>
  • 22. Contoh Unit Testing Multiplikasi $>phpunit BelajarUnitTest MultiplikasiTest.php PHPUnit 3.5.12 by Sebastian Bergmann. ... Time: 0 seconds, Memory: 3.00Mb OK (3 tests, 3 assertions)
  • 23. Contoh Unit Testing Multiplikasi $>phpunit --testdox BelajarUnitTest MultiplikasiTest.php PHPUnit 3.5.12 by Sebastian Bergmann. BelajarUnitTest [x] Multiplicate 1 and 2 [x] Multiplicate 3 and 2 [x] Multiplicate 2 and 2
  • 24. Tapi.. Code saya seperti ini.. <?php // Connects to your Database mysql_connect ( "your.hostaddress.com", "username", "password" ) or die ( mysql_error () ); mysql_select_db ( "Database_Name" ) or die ( mysql_error () ); //checks cookies to make sure they are logged in if (isset ( $_SESSION ['ID_my_site'] )) { $username = $_ SESSION ['ID_my_site']; $pass = $_ SESSION ['Key_my_site']; $check = mysql_query ( "SELECT * FROM users WHERE username = '$username'" ) or die ( mysql_error () ); $result = mysql_fetch_array ( $check ); foreach ( $result as $info ) { //if the cookie has the wrong password, they are taken to the login page if ($pass != $info ['password']) { header ( "Location: login.php" ); } else { //otherwise they are shown the admin area echo "<p>Admin Area</p>"; echo "<p>Your Content<p>"; echo "<a href=logout.php>Logout</a>"; } } } else { //if the cookie does not exist, they are taken to the login screen header ( "Location: login.php" ); } ?>
  • 25. Core techniques  Refactoring  Separation of Concern  Inversion of Control (Dependency Injection)  Design by Contract  Design Patterns
  • 26. Contoh Refactoring <?php namespace myappsecurity; use myappdaosinterfacesUser; use myapputilinterfacesSession; class Authorize implements interfacesAuthorize{ private $userDAO; private $session; public function __construct(User $userDAO, Session $session) { $this->userDAO = $userDAO; $this->session = $session; } public function isAuthorize(){ if($this->session->isAuthenticate()){ $user = $this->userDAO->getByUsername($this->session->getUsername()); return $this->session->getPassword() === $user->getPassword(); }else{ return false; } } } ?>
  • 27. Mocks & Stubs <?php <?php namespace myappmocks; namespace myappmocks; use myappdaosinterfacesUser; use myapputilinterfacesSession; class UserPalsu implements User{ class SessionPalsu implements Session{ public function getById($id){ public function getUsername(){ return null; return null; } } public function getByUsername($username){ public function getPassword(){ return null; return null; } } public function getAll(){ public function isAuthenticate(){ return null; return false; } } } } ?> ?>
  • 28. Unit Test Authorize <?php use myappsecurityAuthorize; use myappmocksSessionPalsu; use myappmocksUserPalsu; class AuthorizeTest extends PHPUnit_Framework_TestCase { public function testIsAuthorizeSessionNotAuthenticate(){ $userDAO = new UserPalsu(); $session = new SessionPalsu(); $authorize = new Authorize($userDAO, $session); $this->assertFalse($authorize->isAuthorize()); } } ?>
  • 29. Mocks & Stubs <?php <?php namespace myappmocks; namespace myappmocks; use myappmodels; use myapputilinterfacesSession; class SessionPalsu implements Session{ use myappdaosinterfacesUser; private $username; class UserPalsu implements User{ private $password; private $user; private $authenticate; public function getById($id){ public function getUsername() { return null; return $this->username; } } public function setUsername($username) { public function getByUsername($username){ $this->username = $username; return $this->user; } public function getPassword() { } return $this->password; } public function getAll(){ public function setPassword($password) { return null; $this->password = $password; } } public function isAuthenticate(){ public function return $this->authenticate; setUser(modelsinterfacesUser $user){ } $this->user = $user; public function setAuthenticate($authenticate){ } $this->authenticate = $authenticate; } } } ?> ?>
  • 30. Unit Test Authorize <?php use myappmodelsUser; use myappsecurityAuthorize; use myappmocksSessionPalsu; use myappmocksUserPalsu; class AuthorizeTest extends PHPUnit_Framework_TestCase { //public function testIsAuthorizeSessionNotAuthenticate(){... public function testIsAuthorizeSessionAuthenticateButWrongPassword(){ $userDAO = new UserPalsu(); $user = new User("username", "password"); $userDAO->setUser($user); $session = new SessionPalsu(); $session->setPassword("wrongpassword"); $authorize = new Authorize($userDAO, $session); $this->assertFalse($authorize->isAuthorize()); } public function testIsAuthorizeSessionAuthenticateCorrectPassword(){ $userDAO = new UserPalsu(); $user = new User("username", "password"); $userDAO->setUser($user); $session = new SessionPalsu(); $session->setPassword("password"); $authorize = new Authorize($userDAO, $session); $this->assertTrue($authorize->isAuthorize()); } } ?>
  • 31. Mengorganisir Unit Test  Fixture  Bootstrap  Stubs & Mocks Tools  Test Suite  Code Coverage
  • 32. Fixtures <?php use myappmodelsUser; use myappsecurityAuthorize; use myappmocksSessionPalsu; use myappmocksUserPalsu; class AuthorizeTest extends PHPUnit_Framework_TestCase { private $userDAO; private $session; public function setUp(){ $this->userDAO = new UserPalsu(); $user = new User("username", "password"); $this->userDAO->setUser($user); $this->session = new SessionPalsu(); $this->session->setAuthenticate(true); } public function tearDown(){ $this->userDAO = null; $this->session = null; } //public function testIsAuthorizeSessionNotAuthenticate(){.. public function testIsAuthorizeSessionAuthenticateButWrongPassword(){ $this->session->setPassword("wrongpassword"); $authorize = new Authorize($this->userDAO, $this->session); $this->assertFalse($authorize->isAuthorize()); } public function testIsAuthorizeSessionAuthenticateCorrectPassword(){ $this->session->setPassword("password"); $authorize = new Authorize($this->userDAO, $this->session); $this->assertTrue($authorize->isAuthorize()); } }?>
  • 33. Bootstrap <phpunit bootstrap="/path/to/bootstrap.php" colors="false" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" stopOnFailure="true"> <!-- ... --> </phpunit>
  • 34. Stubs and Mocks Tools <?php use myappsecurityAuthorize; class AuthorizeTest extends PHPUnit_Framework_TestCase { private $userDAO; private $session; public function setUp() { $this->userDAO = $this->getMock ( 'myappdaosUser' ); $user = $this->getMock ( 'myappmodelsUser', array(), array(), '', false, false, false ); $user->expects ( $this->any () )->method ( 'getUsername' )->will ( $this->returnValue ( 'username' ) ); $user->expects ( $this->any () )->method ( 'getPassword' )->will ( $this->returnValue ( 'password' ) ); $this->userDAO->expects ( $this->any () )->method ( 'getByUsername' )->will ( $this->returnValue ( $user ) ); $this->session = $this->getMock ( 'myapputilSession', array(), array(), '', false, false, false ); $this->session->expects ( $this->any () )->method ( 'isAuthenticate' )->will ( $this->returnValue ( true ) ); } public function tearDown() { $this->userDAO = null; $this->session = null; } //public function testIsAuthorizeSessionNotAuthenticate(){... public function testIsAuthorizeSessionAuthenticateButWrongPassword() { $this->session->expects ( $this->any () )->method ( 'getPassword' )->will ( $this->returnValue ( 'wrongpassword' ) ); $authorize = new Authorize ( $this->userDAO, $this->session ); $this->assertFalse ( $authorize->isAuthorize () ); } public function testIsAuthorizeSessionAuthenticateCorrectPassword() { $this->session->expects ( $this->any () )->method ( 'getPassword' )->will ( $this->returnValue ( 'password' ) ); $authorize = new Authorize ( $this->userDAO, $this->session ); $this->assertTrue ( $authorize->isAuthorize () ); } } ?>
  • 35. Test Suite File System Object Tests |-- Freezer |-- Freezer | |-- HashGenerator | |-- HashGenerator | | `-- NonRecursiveSHA1.php | | `-- NonRecursiveSHA1Test.php | |-- HashGenerator.php | | | |-- IdGenerator | |-- IdGenerator | | `-- UUID.php | | `-- UUIDTest.php | |-- IdGenerator.php | | | |-- LazyProxy.php | | | |-- Storage | |-- Storage | | `-- CouchDB.php | | `-- CouchDB | | | | |-- WithLazyLoadTest.php | | | | `-- WithoutLazyLoadTest.php | |-- Storage.php | |-- StorageTest.php | `-- Util.php | `-- UtilTest.php `-- Freezer.php `-- FreezerTest.php $>phpunit Tests PHPUnit 3.5.13 by Sebastian Bergmann. ............................................................ 60 / 75 ............... Time: 0 seconds OK (75 tests, 164 assertions)
  • 36. Test Suite XML <phpunit> <testsuites> <testsuite name="Object_Freezer"> <file>Tests/Freezer/HashGenerator/NonRecursiveSHA1Test.php</file> <file>Tests/Freezer/IdGenerator/UUIDTest.php</file> <file>Tests/Freezer/UtilTest.php</file> <file>Tests/FreezerTest.php</file> <file>Tests/Freezer/StorageTest.php</file> <file>Tests/Freezer/Storage/CouchDB/WithLazyLoadTest.php</file> <file>Tests/Freezer/Storage/CouchDB/WithoutLazyLoadTest.php</file> </testsuite> </testsuites> </phpunit>
  • 38. Memulai Unit Testing  Yakinkan diri sendiri  Kumpulkan Case Study atau Success Story  http://biblio.gdinwiddie.com/biblio/StudiesOfTestDrivenDevelopment  Cari Pendukung / Panggil Konsultan  Tentukan Tujuan  Catat Perkembangan  Bersiap menghadapi rintangan
  • 39. Kemana Setelah Ini  Metodologi  Test Driven Development  Behaviour Driven Development  Tools Pendukung  IDE (Zend Studio, PHPStorm, PDT, NetBeans)  Build Automation (Ant, Maven, Phing)  Continuous Integration  Test Lain menggunakan PHPUnit  Database Testing  UI Testing (Selenium)  Diskusi terbuka di Milist / Groups
  • 40. Referensi  Wikipedia  http://en.wikipedia.org/wiki/Unit_testing  „PHPUnit Manual“ – Sebastian Bergmann  http://www.phpunit.de/manual/current/en/  „Getting Started With PHPUnit “ – Sebastian Bergmann  http://www.slideshare.net/sebastian_bergmann/getting-started-with-phpunit  „The Art of Unit Testing“ - Roy Osherove  „Unit Testing Fundamentals“ – Richard Paul  http://www.slideshare.net/rapaul/unit-testing-fundamentals  „Embrace Unit Testing“ – Alessio Pace  http://www.slideshare.net/alessiopace/embrace-unit-testing
  • 41. Web: http://arthur.purnama.de  Mail: arthur [at] purnama.de  Twitter: @purnama  Groups:  phpug@yahoogroups.com  Id-php@yahoogroups.com