SlideShare a Scribd company logo
Improving QA on PHP
      projects
   Confoo 2011, Montreal (Canada)
Michelangelo van Dam
• Independent Consultant
• Zend Certified Engineer (ZCE)
• President of PHPBenelux
What’s the benefit of QA?
• early detection of issues
• cleaner & consistent code
• knowledge about the codebase
• increase of confidence
Sebastian Bergmann


•   QA expert


•   wrote the tools


•   speaker and inspirer
Usual Suspects

            PHP_CodeSniffer
Example Code
•- Zend Framework QuickStart app
   http://framework.zend.com/manual/en/learning.quickstart.intro.html
VirtualHost Settings
<VirtualHost *:80>
 DocumentRoot /srv/www/quickstart/public
 ServerName quickstart.local
 ServerAdmin root@localhost
 <Directory /srv/www/quickstart/public>
  Options Indexes FollowSymlinks
  AllowOverride All
  Order allow,deny
  Allow from all
  DirectoryIndex index.php
 </Directory>
 Alias /reports /srv/www/quickstart/reports
 <Directory /srv/www/quickstart/reports>
  Options Indexes FollowSymlinks
  AllowOverride All
  Order allow,deny
  Allow from all
  DirectoryIndex index.php index.html
 </Directory>
</VirtualHost>
Showtime
Syntax Checking
•- PHPLint
   comes with PHP binary
 - validates code for syntax errors
• Website
 - http://www.icosaedro.it/phplint/
Demo PHPLint
Code Documentation
•- PHPDocumentator
    creates automated API documentation
 - based on inline code blocks
• Installation
 - pear install PhpDocumentor
• Website
 - http://www.phpdoc.org
Demo PHPDoc
Output PHPDoc
Coding Standards
•- PHP_CodeSniffer
    sniffs for coding standard violations
 - ensures code is clean and consistent
 - using standard and custom coding standards
• Installation
 - pear install PHP_CodeSniffer
• Website
 - http://pear.php.net/package/PHP_CodeSniffer
Demo PHP_CodeSniffer
PHPCPD
•- PHP Copy/Paste Detector
     detects code duplication
•- Installation
   pear channel-discover pear.phpunit.de
 - pear channel-discover components.ez.no
 - pear install --alldeps phpunit/phpcpd
• Website
 - http://github.com/sebastianbergmann/phpcpd
Demo PHPCPD
Output
Mess Detection
•- PDepend & PHPMD
     detects code mess
•- Installation
   pear channel-discover pear.pdepend.org
 - pear install pdepend/PHP_Depend
 - pear channel-discover pear.phpmd.org
 - pear install phpmd/PHP_PMD
• Websites
 - http://www.pdepend.org
 - http://www.phpmd.org
Demo detecting mess
Output codesize
Output unused code
Unit Testing
•- PHPUnit
    tests code on unit level
 - includes database tests
 - integrates well with many PHP frameworks
• Installation
 - pear channel-discover pear.phpunit.de
 - pear install phpunit/PHPUnit
• Website
 - http://www.phpunit.de
See other presentation




   http://slideshare.net/DragonBe/unit-testing-after-zf-18
Packaging
•- Phar
    PHP Archive (equivalent of Java jar)
 - compresses and collects like
 - included in PHP build (as of PHP 5.3.0)
• Installation (before PHP 5.3.0)
 - pecl install phar
• Website:
 - http://php.net/phar
Code example
<?php

include_once ‘phar://MyApp.phar/path/to/Class.php’;

$application = new Class;
$application->run();
Usage
• libraries
• modules
• images
• plugins
• deployment
Automated builds
•- Phing
    automated build tool
 - like Apache Ant
 - integrates well with other PHP tools
• Installation
 - pear channel-discover pear.phing.info
 - pear install phing/phing
• Website
 - http://phing.info
build.xml
<?xml version="1.0"?>

<project name="zfqs" description="Zend Framework QuickStart" default="build" >
        <target name="version">
                <version releasetype="Bugfix" file="build.version" property="version.number"/>
        </target>

       <target name="phplint">
               <mkdir dir="./reports/phplint" />
               <phplint file="./application/models" haltonfailure="false" tofile="./reports/phplint/errors.txt"/>
       </target>

       <target name="pdepend">
               <mkdir dir="./reports/pdepend" />
               <copy file="./build_pdepend.html" tofile="./reports/pdepend/index.html" overwrite="true" />
               <exec command="/usr/bin/pdepend
                       --summary-xml=./reports/pdepend/summary.xml
                       --jdepend-chart=./reports/pdepend/jdepend.svg
                       --overview-pyramid=./reports/pdepend/pyramid.svg
                       ./application/models"
                       dir="./" />
       </target>

       <target name="phpmd">
               <mkdir dir="./reports/phpmd" />
               <exec command="/usr/bin/phpmd ./application/models html codesize --reportfile ./reports/phpmd/codesize.html" dir="./" />
               <exec command="/usr/bin/phpmd ./application/models html unusedcode --reportfile ./reports/phpmd/unusedcode.html" dir="./" />
       </target>

       <target name="phpcs">
               <mkdir dir="./reports/phpcs" />
               <exec command="/usr/bin/phpcs -n --standard=Zend --report=summary ./application/models > ./reports/phpcs/summary.txt" dir="./" />
               <exec command="/usr/bin/phpcs -n --standard=Zend --report=source ./application/models > ./reports/phpcs/source.txt" dir="./" />
               <exec command="/usr/bin/phpcs -n --standard=Zend --report=checkstyle ./application/models > ./reports/phpcs/checkstyle.xml" dir="./" />
       </target>

       <target name="phpcpd">
               <mkdir dir="./reports/phpcpd" />
               <exec command="/usr/bin/phpcpd --log-pmd ./reports/phpcpd/pmd-cpd.xml ./application/models" dir="./" />
       </target>

       <target name="phpdoc">
               <mkdir dir="./reports/phpdoc" />
               <exec command="phpdoc -d ./application/models -q -t ./reports/phpdoc -o HTML:frames:earthli" dir="./" />
       </target>

        <target name="build" depends="version,phplint,pdepend,phpmd,phpcs,phpcpd,phpdoc">
                <echo msg="Finishing build process ${version.number}" />
        </target>
</project>
project definition
<?xml version="1.0"?>

<project name="zfqs" description="Zend Framework QuickStart" default="build" >
…
</project>
target version
<target name="version">
    <version releasetype="Bugfix"
             file="build.version" property="version.number"/>
</target>




In file “build.version” we have the version number as the following sequence:

MAJOR.MINOR.BUGFIX (starting at 0.0.0)
target phplint
<target name="phplint">
   <mkdir dir="./reports/phplint" />
   <phplint file="./application/models"
            haltonfailure="false" tofile="./reports/phplint/errors.txt"/>
</target>
target pdepend
<target name="pdepend">
    <mkdir dir="./reports/pdepend" />
    <copy file="./build_pdepend.html"
          tofile="./reports/pdepend/index.html" overwrite="true" />
    <exec command="/usr/bin/pdepend
                        --summary-xml=./reports/pdepend/summary.xml
                        --jdepend-chart=./reports/pdepend/jdepend.svg
                        --overview-pyramid=./reports/pdepend/pyramid.svg
                        ./application/models"
                        dir="./" />
</target>
target phpmd
<target name="phpmd">
    <mkdir dir="./reports/phpmd" />
    <exec command="/usr/bin/phpmd ./application/models html codesize
          --reportfile ./reports/phpmd/codesize.html" dir="./" />
    <exec command="/usr/bin/phpmd ./application/models html unusedcode
          --reportfile ./reports/phpmd/unusedcode.html" dir="./" />
</target>
target phpcs
<target name="phpcs">
    <mkdir dir="./reports/phpcs" />
    <exec command="/usr/bin/phpcs -n
            --standard=Zend --report=summary
            ./application/models > ./reports/phpcs/summary.txt"
            dir="./" />
    <exec command="/usr/bin/phpcs -n
            --standard=Zend --report=source
            ./application/models > ./reports/phpcs/source.txt"
            dir="./" />
    <exec command="/usr/bin/phpcs -n
            --standard=Zend --report=checkstyle
            ./application/models > ./reports/phpcs/checkstyle.xml"
            dir="./" />
</target>
target phpcpd
<target name="phpcpd">
    <mkdir dir="./reports/phpcpd" />
    <exec command="/usr/bin/phpcpd
            --log-pmd ./reports/phpcpd/pmd-cpd.xml ./application/models"
            dir="./" />
</target>
target phpdoc
<target name="phpdoc">
    <mkdir dir="./reports/phpdoc" />
    <exec command="phpdoc -d ./application/models -q
            -t ./reports/phpdoc -o HTML:frames:earthli"
            dir="./" />
</target>
target build
<target name="build"
        depends="version,phplint,pdepend,phpmd,phpcs,phpcpd,phpdoc">
    <echo msg="Finishing build process ${version.number}" />
</target>
Demo building all
Demo building target
Our reports section
Summary


   PHP offers lots of tools
more consistent and clean code
     automated process
Questions
• http://www.slideshare.net/DragonBe/improving-qa-on-
  php-projects-confoo2011

• http://twitter.com/DragonBe
• http://facebook.com/DragonBe
• http://joind.in/2822
Ad

Recommended

Improving qa on php projects
Improving qa on php projects
Michelangelo van Dam
 
Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation
Compare Infobase Limited
 
Zend Framework
Zend Framework
OpenSource Technologies Pvt. Ltd.
 
Application Diagnosis with Zend Server Tracing
Application Diagnosis with Zend Server Tracing
ZendCon
 
Zend framework
Zend framework
Prem Shankar
 
Magento - a Zend Framework Application
Magento - a Zend Framework Application
ZendCon
 
Make your application expressive
Make your application expressive
Christian Varela
 
Building and deploying PHP applications with Phing
Building and deploying PHP applications with Phing
Michiel Rook
 
Browser Serving Your We Application Security - ZendCon 2017
Browser Serving Your We Application Security - ZendCon 2017
Philippe Gamache
 
Build Automation of PHP Applications
Build Automation of PHP Applications
Pavan Kumar N
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf Conference
 
How do speed up web pages? CSS & HTML Tricks
How do speed up web pages? CSS & HTML Tricks
Compare Infobase Limited
 
Phing
Phing
mdekrijger
 
Ant vs Phing
Ant vs Phing
Manuel Baldassarri
 
Zend\Expressive - höher, schneller, weiter
Zend\Expressive - höher, schneller, weiter
Ralf Eggert
 
Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2
Adam Culp
 
Build your APIs with apigility
Build your APIs with apigility
Christian Varela
 
Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)
Michiel Rook
 
Building and Deploying PHP Apps Using phing
Building and Deploying PHP Apps Using phing
Mihail Irintchev
 
Phing: Building with PHP
Phing: Building with PHP
hozn
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf Conference
 
Headless Drupal
Headless Drupal
drubb
 
Intro to PhoneGap
Intro to PhoneGap
Jussi Pohjolainen
 
Php 7 evolution
Php 7 evolution
Félix Gómez López
 
Ruby MVC from scratch with Rack
Ruby MVC from scratch with Rack
DonSchado
 
Django
Django
Abhijeet Shekhar
 
Composer & Drupal
Composer & Drupal
drubb
 
Propel Your PHP Applications
Propel Your PHP Applications
hozn
 
Php Power Tools
Php Power Tools
Michelangelo van Dam
 
PHP QA Tools
PHP QA Tools
rjsmelo
 

More Related Content

What's hot (20)

Browser Serving Your We Application Security - ZendCon 2017
Browser Serving Your We Application Security - ZendCon 2017
Philippe Gamache
 
Build Automation of PHP Applications
Build Automation of PHP Applications
Pavan Kumar N
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf Conference
 
How do speed up web pages? CSS & HTML Tricks
How do speed up web pages? CSS & HTML Tricks
Compare Infobase Limited
 
Phing
Phing
mdekrijger
 
Ant vs Phing
Ant vs Phing
Manuel Baldassarri
 
Zend\Expressive - höher, schneller, weiter
Zend\Expressive - höher, schneller, weiter
Ralf Eggert
 
Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2
Adam Culp
 
Build your APIs with apigility
Build your APIs with apigility
Christian Varela
 
Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)
Michiel Rook
 
Building and Deploying PHP Apps Using phing
Building and Deploying PHP Apps Using phing
Mihail Irintchev
 
Phing: Building with PHP
Phing: Building with PHP
hozn
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf Conference
 
Headless Drupal
Headless Drupal
drubb
 
Intro to PhoneGap
Intro to PhoneGap
Jussi Pohjolainen
 
Php 7 evolution
Php 7 evolution
Félix Gómez López
 
Ruby MVC from scratch with Rack
Ruby MVC from scratch with Rack
DonSchado
 
Django
Django
Abhijeet Shekhar
 
Composer & Drupal
Composer & Drupal
drubb
 
Propel Your PHP Applications
Propel Your PHP Applications
hozn
 
Browser Serving Your We Application Security - ZendCon 2017
Browser Serving Your We Application Security - ZendCon 2017
Philippe Gamache
 
Build Automation of PHP Applications
Build Automation of PHP Applications
Pavan Kumar N
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf Conference
 
How do speed up web pages? CSS & HTML Tricks
How do speed up web pages? CSS & HTML Tricks
Compare Infobase Limited
 
Zend\Expressive - höher, schneller, weiter
Zend\Expressive - höher, schneller, weiter
Ralf Eggert
 
Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2
Adam Culp
 
Build your APIs with apigility
Build your APIs with apigility
Christian Varela
 
Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)
Michiel Rook
 
Building and Deploying PHP Apps Using phing
Building and Deploying PHP Apps Using phing
Mihail Irintchev
 
Phing: Building with PHP
Phing: Building with PHP
hozn
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf Conference
 
Headless Drupal
Headless Drupal
drubb
 
Ruby MVC from scratch with Rack
Ruby MVC from scratch with Rack
DonSchado
 
Composer & Drupal
Composer & Drupal
drubb
 
Propel Your PHP Applications
Propel Your PHP Applications
hozn
 

Similar to Improving QA on PHP projects - confoo 2011 (20)

Php Power Tools
Php Power Tools
Michelangelo van Dam
 
PHP QA Tools
PHP QA Tools
rjsmelo
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfast
Michelangelo van Dam
 
20 PHP Static Analysis and Documentation Generators #burningkeyboards
20 PHP Static Analysis and Documentation Generators #burningkeyboards
Denis Ristic
 
Professional PHP: an open-source alternative for enterprise development [Kort...
Professional PHP: an open-source alternative for enterprise development [Kort...
Combell NV
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013
Michelangelo van Dam
 
Living With Legacy Code
Living With Legacy Code
Rowan Merewood
 
The return of an old enemy
The return of an old enemy
DonSchado
 
PHP Industrialization
PHP Industrialization
Damien Seguy
 
Head First Zend Framework - Part 1 Project & Application
Head First Zend Framework - Part 1 Project & Application
Jace Ju
 
Continuous Quality Assurance
Continuous Quality Assurance
Michelangelo van Dam
 
Professional PHP: an open-source alternative for enterprise development [Antw...
Professional PHP: an open-source alternative for enterprise development [Antw...
Combell NV
 
Building Web Applications with Zend Framework
Building Web Applications with Zend Framework
Phil Brown
 
PHP selber bauen
PHP selber bauen
Walter Ebert
 
Profiling PHP with Xdebug / Webgrind
Profiling PHP with Xdebug / Webgrind
Sam Keen
 
PHP Internals and Virtual Machine
PHP Internals and Virtual Machine
julien pauli
 
Api Design
Api Design
sumithra jonnalagadda
 
PM : code faster
PM : code faster
PHPPRO
 
Zend Framework 1.8 workshop
Zend Framework 1.8 workshop
Nick Belhomme
 
Starting Out With PHP
Starting Out With PHP
Mark Niebergall
 
PHP QA Tools
PHP QA Tools
rjsmelo
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfast
Michelangelo van Dam
 
20 PHP Static Analysis and Documentation Generators #burningkeyboards
20 PHP Static Analysis and Documentation Generators #burningkeyboards
Denis Ristic
 
Professional PHP: an open-source alternative for enterprise development [Kort...
Professional PHP: an open-source alternative for enterprise development [Kort...
Combell NV
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013
Michelangelo van Dam
 
Living With Legacy Code
Living With Legacy Code
Rowan Merewood
 
The return of an old enemy
The return of an old enemy
DonSchado
 
PHP Industrialization
PHP Industrialization
Damien Seguy
 
Head First Zend Framework - Part 1 Project & Application
Head First Zend Framework - Part 1 Project & Application
Jace Ju
 
Professional PHP: an open-source alternative for enterprise development [Antw...
Professional PHP: an open-source alternative for enterprise development [Antw...
Combell NV
 
Building Web Applications with Zend Framework
Building Web Applications with Zend Framework
Phil Brown
 
Profiling PHP with Xdebug / Webgrind
Profiling PHP with Xdebug / Webgrind
Sam Keen
 
PHP Internals and Virtual Machine
PHP Internals and Virtual Machine
julien pauli
 
PM : code faster
PM : code faster
PHPPRO
 
Zend Framework 1.8 workshop
Zend Framework 1.8 workshop
Nick Belhomme
 
Ad

More from Michelangelo van Dam (20)

GDPR Art. 25 - Privacy by design and default
GDPR Art. 25 - Privacy by design and default
Michelangelo van Dam
 
Moving from app services to azure functions
Moving from app services to azure functions
Michelangelo van Dam
 
Privacy by design
Privacy by design
Michelangelo van Dam
 
DevOps or DevSecOps
DevOps or DevSecOps
Michelangelo van Dam
 
Privacy by design
Privacy by design
Michelangelo van Dam
 
Continuous deployment 2.0
Continuous deployment 2.0
Michelangelo van Dam
 
Let your tests drive your code
Let your tests drive your code
Michelangelo van Dam
 
General Data Protection Regulation, a developer's story
General Data Protection Regulation, a developer's story
Michelangelo van Dam
 
Leveraging a distributed architecture to your advantage
Leveraging a distributed architecture to your advantage
Michelangelo van Dam
 
The road to php 7.1
The road to php 7.1
Michelangelo van Dam
 
Open source for a successful business
Open source for a successful business
Michelangelo van Dam
 
Decouple your framework now, thank me later
Decouple your framework now, thank me later
Michelangelo van Dam
 
Deploy to azure in less then 15 minutes
Deploy to azure in less then 15 minutes
Michelangelo van Dam
 
Azure and OSS, a match made in heaven
Azure and OSS, a match made in heaven
Michelangelo van Dam
 
Getting hands dirty with php7
Getting hands dirty with php7
Michelangelo van Dam
 
Zf2 how arrays will save your project
Zf2 how arrays will save your project
Michelangelo van Dam
 
Create, test, secure, repeat
Create, test, secure, repeat
Michelangelo van Dam
 
The Continuous PHP Pipeline
The Continuous PHP Pipeline
Michelangelo van Dam
 
PHPUnit Episode iv.iii: Return of the tests
PHPUnit Episode iv.iii: Return of the tests
Michelangelo van Dam
 
Easily extend your existing php app with an api
Easily extend your existing php app with an api
Michelangelo van Dam
 
GDPR Art. 25 - Privacy by design and default
GDPR Art. 25 - Privacy by design and default
Michelangelo van Dam
 
Moving from app services to azure functions
Moving from app services to azure functions
Michelangelo van Dam
 
General Data Protection Regulation, a developer's story
General Data Protection Regulation, a developer's story
Michelangelo van Dam
 
Leveraging a distributed architecture to your advantage
Leveraging a distributed architecture to your advantage
Michelangelo van Dam
 
Open source for a successful business
Open source for a successful business
Michelangelo van Dam
 
Decouple your framework now, thank me later
Decouple your framework now, thank me later
Michelangelo van Dam
 
Deploy to azure in less then 15 minutes
Deploy to azure in less then 15 minutes
Michelangelo van Dam
 
Azure and OSS, a match made in heaven
Azure and OSS, a match made in heaven
Michelangelo van Dam
 
Zf2 how arrays will save your project
Zf2 how arrays will save your project
Michelangelo van Dam
 
PHPUnit Episode iv.iii: Return of the tests
PHPUnit Episode iv.iii: Return of the tests
Michelangelo van Dam
 
Easily extend your existing php app with an api
Easily extend your existing php app with an api
Michelangelo van Dam
 
Ad

Improving QA on PHP projects - confoo 2011

  • 1. Improving QA on PHP projects Confoo 2011, Montreal (Canada)
  • 2. Michelangelo van Dam • Independent Consultant • Zend Certified Engineer (ZCE) • President of PHPBenelux
  • 3. What’s the benefit of QA? • early detection of issues • cleaner & consistent code • knowledge about the codebase • increase of confidence
  • 4. Sebastian Bergmann • QA expert • wrote the tools • speaker and inspirer
  • 5. Usual Suspects PHP_CodeSniffer
  • 6. Example Code •- Zend Framework QuickStart app http://framework.zend.com/manual/en/learning.quickstart.intro.html
  • 7. VirtualHost Settings <VirtualHost *:80> DocumentRoot /srv/www/quickstart/public ServerName quickstart.local ServerAdmin root@localhost <Directory /srv/www/quickstart/public> Options Indexes FollowSymlinks AllowOverride All Order allow,deny Allow from all DirectoryIndex index.php </Directory> Alias /reports /srv/www/quickstart/reports <Directory /srv/www/quickstart/reports> Options Indexes FollowSymlinks AllowOverride All Order allow,deny Allow from all DirectoryIndex index.php index.html </Directory> </VirtualHost>
  • 9. Syntax Checking •- PHPLint comes with PHP binary - validates code for syntax errors • Website - http://www.icosaedro.it/phplint/
  • 11. Code Documentation •- PHPDocumentator creates automated API documentation - based on inline code blocks • Installation - pear install PhpDocumentor • Website - http://www.phpdoc.org
  • 14. Coding Standards •- PHP_CodeSniffer sniffs for coding standard violations - ensures code is clean and consistent - using standard and custom coding standards • Installation - pear install PHP_CodeSniffer • Website - http://pear.php.net/package/PHP_CodeSniffer
  • 16. PHPCPD •- PHP Copy/Paste Detector detects code duplication •- Installation pear channel-discover pear.phpunit.de - pear channel-discover components.ez.no - pear install --alldeps phpunit/phpcpd • Website - http://github.com/sebastianbergmann/phpcpd
  • 19. Mess Detection •- PDepend & PHPMD detects code mess •- Installation pear channel-discover pear.pdepend.org - pear install pdepend/PHP_Depend - pear channel-discover pear.phpmd.org - pear install phpmd/PHP_PMD • Websites - http://www.pdepend.org - http://www.phpmd.org
  • 23. Unit Testing •- PHPUnit tests code on unit level - includes database tests - integrates well with many PHP frameworks • Installation - pear channel-discover pear.phpunit.de - pear install phpunit/PHPUnit • Website - http://www.phpunit.de
  • 24. See other presentation http://slideshare.net/DragonBe/unit-testing-after-zf-18
  • 25. Packaging •- Phar PHP Archive (equivalent of Java jar) - compresses and collects like - included in PHP build (as of PHP 5.3.0) • Installation (before PHP 5.3.0) - pecl install phar • Website: - http://php.net/phar
  • 27. Usage • libraries • modules • images • plugins • deployment
  • 28. Automated builds •- Phing automated build tool - like Apache Ant - integrates well with other PHP tools • Installation - pear channel-discover pear.phing.info - pear install phing/phing • Website - http://phing.info
  • 29. build.xml <?xml version="1.0"?> <project name="zfqs" description="Zend Framework QuickStart" default="build" > <target name="version"> <version releasetype="Bugfix" file="build.version" property="version.number"/> </target> <target name="phplint"> <mkdir dir="./reports/phplint" /> <phplint file="./application/models" haltonfailure="false" tofile="./reports/phplint/errors.txt"/> </target> <target name="pdepend"> <mkdir dir="./reports/pdepend" /> <copy file="./build_pdepend.html" tofile="./reports/pdepend/index.html" overwrite="true" /> <exec command="/usr/bin/pdepend --summary-xml=./reports/pdepend/summary.xml --jdepend-chart=./reports/pdepend/jdepend.svg --overview-pyramid=./reports/pdepend/pyramid.svg ./application/models" dir="./" /> </target> <target name="phpmd"> <mkdir dir="./reports/phpmd" /> <exec command="/usr/bin/phpmd ./application/models html codesize --reportfile ./reports/phpmd/codesize.html" dir="./" /> <exec command="/usr/bin/phpmd ./application/models html unusedcode --reportfile ./reports/phpmd/unusedcode.html" dir="./" /> </target> <target name="phpcs"> <mkdir dir="./reports/phpcs" /> <exec command="/usr/bin/phpcs -n --standard=Zend --report=summary ./application/models > ./reports/phpcs/summary.txt" dir="./" /> <exec command="/usr/bin/phpcs -n --standard=Zend --report=source ./application/models > ./reports/phpcs/source.txt" dir="./" /> <exec command="/usr/bin/phpcs -n --standard=Zend --report=checkstyle ./application/models > ./reports/phpcs/checkstyle.xml" dir="./" /> </target> <target name="phpcpd"> <mkdir dir="./reports/phpcpd" /> <exec command="/usr/bin/phpcpd --log-pmd ./reports/phpcpd/pmd-cpd.xml ./application/models" dir="./" /> </target> <target name="phpdoc"> <mkdir dir="./reports/phpdoc" /> <exec command="phpdoc -d ./application/models -q -t ./reports/phpdoc -o HTML:frames:earthli" dir="./" /> </target> <target name="build" depends="version,phplint,pdepend,phpmd,phpcs,phpcpd,phpdoc"> <echo msg="Finishing build process ${version.number}" /> </target> </project>
  • 30. project definition <?xml version="1.0"?> <project name="zfqs" description="Zend Framework QuickStart" default="build" > … </project>
  • 31. target version <target name="version"> <version releasetype="Bugfix" file="build.version" property="version.number"/> </target> In file “build.version” we have the version number as the following sequence: MAJOR.MINOR.BUGFIX (starting at 0.0.0)
  • 32. target phplint <target name="phplint"> <mkdir dir="./reports/phplint" /> <phplint file="./application/models" haltonfailure="false" tofile="./reports/phplint/errors.txt"/> </target>
  • 33. target pdepend <target name="pdepend"> <mkdir dir="./reports/pdepend" /> <copy file="./build_pdepend.html" tofile="./reports/pdepend/index.html" overwrite="true" /> <exec command="/usr/bin/pdepend --summary-xml=./reports/pdepend/summary.xml --jdepend-chart=./reports/pdepend/jdepend.svg --overview-pyramid=./reports/pdepend/pyramid.svg ./application/models" dir="./" /> </target>
  • 34. target phpmd <target name="phpmd"> <mkdir dir="./reports/phpmd" /> <exec command="/usr/bin/phpmd ./application/models html codesize --reportfile ./reports/phpmd/codesize.html" dir="./" /> <exec command="/usr/bin/phpmd ./application/models html unusedcode --reportfile ./reports/phpmd/unusedcode.html" dir="./" /> </target>
  • 35. target phpcs <target name="phpcs"> <mkdir dir="./reports/phpcs" /> <exec command="/usr/bin/phpcs -n --standard=Zend --report=summary ./application/models > ./reports/phpcs/summary.txt" dir="./" /> <exec command="/usr/bin/phpcs -n --standard=Zend --report=source ./application/models > ./reports/phpcs/source.txt" dir="./" /> <exec command="/usr/bin/phpcs -n --standard=Zend --report=checkstyle ./application/models > ./reports/phpcs/checkstyle.xml" dir="./" /> </target>
  • 36. target phpcpd <target name="phpcpd"> <mkdir dir="./reports/phpcpd" /> <exec command="/usr/bin/phpcpd --log-pmd ./reports/phpcpd/pmd-cpd.xml ./application/models" dir="./" /> </target>
  • 37. target phpdoc <target name="phpdoc"> <mkdir dir="./reports/phpdoc" /> <exec command="phpdoc -d ./application/models -q -t ./reports/phpdoc -o HTML:frames:earthli" dir="./" /> </target>
  • 38. target build <target name="build" depends="version,phplint,pdepend,phpmd,phpcs,phpcpd,phpdoc"> <echo msg="Finishing build process ${version.number}" /> </target>
  • 42. Summary PHP offers lots of tools more consistent and clean code automated process
  • 43. Questions • http://www.slideshare.net/DragonBe/improving-qa-on- php-projects-confoo2011 • http://twitter.com/DragonBe • http://facebook.com/DragonBe • http://joind.in/2822

Editor's Notes