Joomla Code Quality Control 
[Automated Tools] 
Shyam S. Verma 
Founder & CEO 
Ready Bytes Software Labs Pvt. Ltd.
Team JoomlaXi Develops 
Joomla Extensions 
RBSL Develop Web Apps 
and Websites
Agenda 
● Software Quality Assurance 
● Code Testing 
● Code Analysis 
● Continous Integration 
● Quick Demo of QA
Software Quality Assurance (SQA) 
● Systematic Monitoring and Evaluation of the 
software engineering processes 
● Monitoring and Evalution can be done 
automatically via tools called QA tools 
● Not a Rocket Science, but heavily depends on 
the proejct
Benefit of SQA? 
● early detection of issues 
● cleaner & consistent code 
● knowledge about the codebase 
● increase of confidence 
● enables frequent releases, refactoring
Agenda 
● Software Quality Assurance 
● Code Testing 
● Code Analysis 
● Continous Integration 
● Quick Demo of QA
Manual Testing 
● Not automated, slow and expensive 
● Complete application must be ready before it 
can be tested 
● Tests need to be repeated when the application 
changes
Automated Testing 
● Test results are - 
– automatically evaluated and 
– do not have to be interpreted by a human tester 
● Tests are repeatable 
– with deterministic results 
– without additional costs
Selenium Testing 
● Test web applications in a web browser 
● Selenium RC 
– Automated execution of Selenium tests 
– Tests can be specified in any language 
– One test can be executed on multiple 
OS/browser combinations 
– Tests can be triggered from PHPUnit
problems 
● Complex test environments 
● Dependencies between tests 
● Running the tests is slow, thus incompatible 
with the agile approach 
● It is not enough and/or does not scale
What we want 
● We want to test earlier 
● We want to be able to test an incomplete 
application 
● We want a test environment that is less 
complex 
● We want to be able to run the tests faster
Unit Tests 
● Executable specification 
● Automatic evaluation 
● Simple test environment 
● Instant feedback 
● Works as regression test 
>> Unit Tests improve the confidence in your code as they detect problems as early as possible.
>> phpunit BowlingGameTest 
PHPUnit 3.4.0 by Sebastian Bergmann. 
.FFFF 
Time: 0 seconds 
There were 4 failures: 
1) BowlingGameTest::testScoreForAllOnesIs20 
Failed asserting that <integer:0> matches expected value <integer:20>. 
/home/sb/BowlingGameTest.php:67 
2) BowlingGameTest::testScoreForOneSpareAnd3Is16 
Failed asserting that <integer:0> matches expected value <integer:16>. 
/home/sb/BowlingGameTest.php:75 
3) BowlingGameTest::testScoreForOneStrikeAnd3And4Is24 
Failed asserting that <integer:0> matches expected value <integer:24>. 
/home/sb/BowlingGameTest.php:84 
4) BowlingGameTest::testScoreForPerfectGameIs300 
Failed asserting that <integer:0> matches expected value <integer:300>. 
/home/sb/BowlingGameTest.php:90 
FAILURES! 
Tests: 5, Assertions: 5, Failures: 4.
Agenda 
● Software Quality Assurance 
● Code Testing 
● Code Analysis 
● Continous Integration 
● Quick Demo of QA
Static Analysis
phploc 
● Text-based metric for code size 
● Various definitions 
– Lines of Code (LOC) 
– Comment Lines of Code (CLOC) 
– Non-Comment Lines of Code (NCLOC) 
– Executable Lines of Code (ELOC) 
● Ratios can be interesting 
– CLOC / (E)LOC
Running phploc on Joomla 1.6.1 
Directories: 725 
Files: 1625 
Lines of Code (LOC): 251967 
Cyclomatic Complexity / Lines of Code: 0.12 
Comment Lines of Code (CLOC): 88959 
Non­Comment 
Lines of Code (NCLOC): 163008 
Namespaces: 0 
Interfaces: 0 
Classes: 1136 
Abstract: 81 (7.13%) 
Concrete: 1055 (92.87%) 
Average Class Length (NCLOC): 126 
Methods: 6494 
Scope: 
Non­Static: 
5710 (87.93%) 
Static: 784 (12.07%) 
Visibility: 
Public: 5113 (78.73%) 
Non­Public: 
1381 (21.27%) 
Average Method Length (NCLOC): 22 
Cyclomatic Complexity / Number of Methods: 3.44 
Anonymous Functions: 10 
Functions: 112 
Constants: 225 
Global constants: 218 
Class constants: 7
Php code sniffer 
● PHP_CodeSniffer 
– sniffs for coding standard violations 
– ensures code is clean and consistent 
– using standard and custom coding standards 
● Installation 
– pear install PHP_CodeSniffer
phpcs on libraries/joomla/application 
shyam@ssv­lptp­lnx:/ 
var/www/j161$ phpcs ­s 
­­standard= 
ZEND ­­report= 
summary 
­­sniffs=" 
Zend.Files.LineLength.LineTooLong" ­­extensions= 
php libraries/joomla/application/ 
PHP CODE SNIFFER REPORT SUMMARY 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­FILE 
ERRORS WARNINGS 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­/ 
var/www/j161/libraries/joomla/application/application.php 4 35 
/var/www/j161/libraries/joomla/application/categories.php 2 22 
...... 
/var/www/j161/libraries/joomla/application/component/view.php 0 15 
/var/www/j161/libraries/joomla/application/pathway.php 0 2 
/var/www/j161/libraries/joomla/application/router.php 0 2 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­A 
TOTAL OF 43 ERROR(S) AND 222 WARNING(S) WERE FOUND IN 17 FILE(S) 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­PHP 
CODE SNIFFER VIOLATION SOURCE SUMMARY 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­SOURCE 
COUNT 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­Zend. 
Files.LineLength.LineTooLong 222 
Zend.Files.LineLength.MaxLengthExceeded 43 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­A 
TOTAL OF 265 SNIFF VIOLATION(S) WERE FOUND IN 2 SOURCE(S) 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
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
phpcpd on libraries/joomla (1.6.1) Found 10 exact clones with 216 duplicated lines in 13 files: 
­libraries/ 
joomla/html/html/category.php:46­58 
libraries/joomla/html/html/category.php:98­110 
­libraries/ 
joomla/client/ftp.php:1186­1192 
libraries/joomla/client/ftp.php:1215­1221 
­libraries/ 
joomla/base/object.php:78­120 
libraries/joomla/error/exception.php:182­224 
­libraries/ 
joomla/database/table/extension.php:30­44 
libraries/joomla/database/table/update.php:32­46 
­libraries/ 
joomla/database/database/mysql.php:221­236 
libraries/joomla/database/database/mysqli.php:245­260 
...... 
­libraries/ 
joomla/form/fields/componentlayout.php:161­173 
libraries/joomla/form/fields/modulelayout.php:138­150 
­libraries/ 
joomla/installer/adapters/component.php:263­275 
libraries/joomla/installer/adapters/component.php:688­700 
­libraries/ 
joomla/installer/adapters/template.php:107­114 
libraries/joomla/installer/adapters/plugin.php:165­172 
0.30% duplicated lines out of 70925 total lines of code.
php mess detector 
● 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
phpmd on router.php 
$>> phpmd libraries/joomla/application/router.php text unusedcode 
/var/www/j161/libraries/joomla/application/router.php:247 Avoid unused parameters such as '$uri'. 
/var/www/j161/libraries/joomla/application/router.php:255 Avoid unused parameters such as '$uri'. 
/var/www/j161/libraries/joomla/application/router.php:263 Avoid unused parameters such as '$uri'. 
/var/www/j161/libraries/joomla/application/router.php:270 Avoid unused parameters such as '$uri'. 
$>> phpmd libraries/joomla/application/router.php text codesize 
/var/www/j161/libraries/joomla/application/router.php:26 This class has too many methods, consider 
refactoring it. 
$>> phpmd libraries/joomla/application/router.php text naming 
$>>
pdepend 
pdepend ­­overview­pyramid=./ 
pdepend.svg libraries/joomla/
php documentation generator 
● PHPDocumentator 
– creates automated API documentation based on 
inline code blocks 
● Installation 
– pear install PhpDocumentor
Dynamic Analysis
Code Coverage 
Which statements, branches, and paths are 
executed when the tests run? 
● Statement Coverage 
● Branch Coverage 
● Path Coverage 
100% Code Coverage is a required, but not a 
sufficient criteria for test completeness
>> phpunit ­­coverage­html 
/tmp/report BankAccountTest 
PHPUnit 3.4.0 by Sebastian Bergmann. 
..... 
Time: 0 seconds 
OK (5 tests, 5 assertions) 
Generating code coverage report, this may take a moment.
Profiling 
● Xdebug's built-in profiler 
● Finds bottlenecks in your script 
● Output can be visualized by external tools such 
as KCacheGrind or WinCacheGrind.
Agenda 
● Software Quality Assurance 
● Code Testing 
● Code Analysis 
● Continous Integration (Automation) 
● Quick Demo of QA
Automation
phing 
● automated build tool 
– like Apache Ant 
– integrates well with other PHP tools 
● Installation 
– pear channel-discover pear.phing.info 
– pear install phing/phing
Sample build file 
<?xml version="1.0" ?> 
<project name="builder" basedir="." default="build" description="Build PayPlans Kit."> 
<target name="build" depends="config"> 
<phingcall target="export_from_wc" /> 
<phing phingfile="${project.shortform.small}.xml" inheritAll="true" target="build" /> 
<zip destfile="${dir.packages}/${project.shortform}­${ 
file.version}.$ 
{svn.lastrevision}.zip" 
basedir="${dir.tmp}" /> 
</target> 
<target name="config" description="Load configuration file"> 
<php expression="(PHP_OS == 'WINNT') ? '_win' :'_unix'" returnProperty="IF_OS"/> 
<property file="global${IF_OS}.prop" override="false" /> 
<property file="build${IF_OS}.prop" override="false" /> 
<svnlastrevision workingcopy="${dir.root}" propertyname="svn.lastrevision" /> 
</target> 
</project>
Cruise control 
Framework for a continuous build process 
● Includes, but is not limited to, plugins for email 
notification, Apache Ant, Phing, and various 
source control tools 
● A web interface is provided to view the details 
of the current and previous builds
Screenshots
phpUnderControl 
● Customization of CruiseControl that caters to 
the needs of PHP projects 
– PHPUnit 
– PHPDocumentor 
– PHP_CodeSniffer 
– PHP_Depend 
– phpmd 
– phpcpd
Screenshot
Agenda 
● Software Quality Assurance 
● Code Testing 
● Code Analysis 
● Continous Integration 
● Quick Demo of QA
Credits 
● http://www.slideshare.net/sebastian_bergmann 
● http://www.slideshare.net/DragonBe 
● http://www.slideshare.net/spriebsch
Thanks... 
Find us at : 
● http://twitter.com/joomlaxi 
● http://facebook.com/joomlaxi 
● shyam@readybytes.in

Joomla Code Quality Control and Automation Testing

  • 1.
    Joomla Code QualityControl [Automated Tools] Shyam S. Verma Founder & CEO Ready Bytes Software Labs Pvt. Ltd.
  • 2.
    Team JoomlaXi Develops Joomla Extensions RBSL Develop Web Apps and Websites
  • 3.
    Agenda ● SoftwareQuality Assurance ● Code Testing ● Code Analysis ● Continous Integration ● Quick Demo of QA
  • 4.
    Software Quality Assurance(SQA) ● Systematic Monitoring and Evaluation of the software engineering processes ● Monitoring and Evalution can be done automatically via tools called QA tools ● Not a Rocket Science, but heavily depends on the proejct
  • 5.
    Benefit of SQA? ● early detection of issues ● cleaner & consistent code ● knowledge about the codebase ● increase of confidence ● enables frequent releases, refactoring
  • 6.
    Agenda ● SoftwareQuality Assurance ● Code Testing ● Code Analysis ● Continous Integration ● Quick Demo of QA
  • 7.
    Manual Testing ●Not automated, slow and expensive ● Complete application must be ready before it can be tested ● Tests need to be repeated when the application changes
  • 8.
    Automated Testing ●Test results are - – automatically evaluated and – do not have to be interpreted by a human tester ● Tests are repeatable – with deterministic results – without additional costs
  • 9.
    Selenium Testing ●Test web applications in a web browser ● Selenium RC – Automated execution of Selenium tests – Tests can be specified in any language – One test can be executed on multiple OS/browser combinations – Tests can be triggered from PHPUnit
  • 11.
    problems ● Complextest environments ● Dependencies between tests ● Running the tests is slow, thus incompatible with the agile approach ● It is not enough and/or does not scale
  • 12.
    What we want ● We want to test earlier ● We want to be able to test an incomplete application ● We want a test environment that is less complex ● We want to be able to run the tests faster
  • 13.
    Unit Tests ●Executable specification ● Automatic evaluation ● Simple test environment ● Instant feedback ● Works as regression test >> Unit Tests improve the confidence in your code as they detect problems as early as possible.
  • 14.
    >> phpunit BowlingGameTest PHPUnit 3.4.0 by Sebastian Bergmann. .FFFF Time: 0 seconds There were 4 failures: 1) BowlingGameTest::testScoreForAllOnesIs20 Failed asserting that <integer:0> matches expected value <integer:20>. /home/sb/BowlingGameTest.php:67 2) BowlingGameTest::testScoreForOneSpareAnd3Is16 Failed asserting that <integer:0> matches expected value <integer:16>. /home/sb/BowlingGameTest.php:75 3) BowlingGameTest::testScoreForOneStrikeAnd3And4Is24 Failed asserting that <integer:0> matches expected value <integer:24>. /home/sb/BowlingGameTest.php:84 4) BowlingGameTest::testScoreForPerfectGameIs300 Failed asserting that <integer:0> matches expected value <integer:300>. /home/sb/BowlingGameTest.php:90 FAILURES! Tests: 5, Assertions: 5, Failures: 4.
  • 15.
    Agenda ● SoftwareQuality Assurance ● Code Testing ● Code Analysis ● Continous Integration ● Quick Demo of QA
  • 16.
  • 17.
    phploc ● Text-basedmetric for code size ● Various definitions – Lines of Code (LOC) – Comment Lines of Code (CLOC) – Non-Comment Lines of Code (NCLOC) – Executable Lines of Code (ELOC) ● Ratios can be interesting – CLOC / (E)LOC
  • 18.
    Running phploc onJoomla 1.6.1 Directories: 725 Files: 1625 Lines of Code (LOC): 251967 Cyclomatic Complexity / Lines of Code: 0.12 Comment Lines of Code (CLOC): 88959 Non­Comment Lines of Code (NCLOC): 163008 Namespaces: 0 Interfaces: 0 Classes: 1136 Abstract: 81 (7.13%) Concrete: 1055 (92.87%) Average Class Length (NCLOC): 126 Methods: 6494 Scope: Non­Static: 5710 (87.93%) Static: 784 (12.07%) Visibility: Public: 5113 (78.73%) Non­Public: 1381 (21.27%) Average Method Length (NCLOC): 22 Cyclomatic Complexity / Number of Methods: 3.44 Anonymous Functions: 10 Functions: 112 Constants: 225 Global constants: 218 Class constants: 7
  • 19.
    Php code sniffer ● PHP_CodeSniffer – sniffs for coding standard violations – ensures code is clean and consistent – using standard and custom coding standards ● Installation – pear install PHP_CodeSniffer
  • 20.
    phpcs on libraries/joomla/application shyam@ssv­lptp­lnx:/ var/www/j161$ phpcs ­s ­­standard= ZEND ­­report= summary ­­sniffs=" Zend.Files.LineLength.LineTooLong" ­­extensions= php libraries/joomla/application/ PHP CODE SNIFFER REPORT SUMMARY ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­FILE ERRORS WARNINGS ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­/ var/www/j161/libraries/joomla/application/application.php 4 35 /var/www/j161/libraries/joomla/application/categories.php 2 22 ...... /var/www/j161/libraries/joomla/application/component/view.php 0 15 /var/www/j161/libraries/joomla/application/pathway.php 0 2 /var/www/j161/libraries/joomla/application/router.php 0 2 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­A TOTAL OF 43 ERROR(S) AND 222 WARNING(S) WERE FOUND IN 17 FILE(S) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­PHP CODE SNIFFER VIOLATION SOURCE SUMMARY ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­SOURCE COUNT ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­Zend. Files.LineLength.LineTooLong 222 Zend.Files.LineLength.MaxLengthExceeded 43 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­A TOTAL OF 265 SNIFF VIOLATION(S) WERE FOUND IN 2 SOURCE(S) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  • 21.
    phpcpd ● PHPCopy/Paste Detector – detects code duplication ● Installation – pear channel-discover pear.phpunit.de – pear channel-discover components.ez.no – pear install --alldeps phpunit/phpcpd
  • 22.
    phpcpd on libraries/joomla(1.6.1) Found 10 exact clones with 216 duplicated lines in 13 files: ­libraries/ joomla/html/html/category.php:46­58 libraries/joomla/html/html/category.php:98­110 ­libraries/ joomla/client/ftp.php:1186­1192 libraries/joomla/client/ftp.php:1215­1221 ­libraries/ joomla/base/object.php:78­120 libraries/joomla/error/exception.php:182­224 ­libraries/ joomla/database/table/extension.php:30­44 libraries/joomla/database/table/update.php:32­46 ­libraries/ joomla/database/database/mysql.php:221­236 libraries/joomla/database/database/mysqli.php:245­260 ...... ­libraries/ joomla/form/fields/componentlayout.php:161­173 libraries/joomla/form/fields/modulelayout.php:138­150 ­libraries/ joomla/installer/adapters/component.php:263­275 libraries/joomla/installer/adapters/component.php:688­700 ­libraries/ joomla/installer/adapters/template.php:107­114 libraries/joomla/installer/adapters/plugin.php:165­172 0.30% duplicated lines out of 70925 total lines of code.
  • 23.
    php mess detector ● 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
  • 24.
    phpmd on router.php $>> phpmd libraries/joomla/application/router.php text unusedcode /var/www/j161/libraries/joomla/application/router.php:247 Avoid unused parameters such as '$uri'. /var/www/j161/libraries/joomla/application/router.php:255 Avoid unused parameters such as '$uri'. /var/www/j161/libraries/joomla/application/router.php:263 Avoid unused parameters such as '$uri'. /var/www/j161/libraries/joomla/application/router.php:270 Avoid unused parameters such as '$uri'. $>> phpmd libraries/joomla/application/router.php text codesize /var/www/j161/libraries/joomla/application/router.php:26 This class has too many methods, consider refactoring it. $>> phpmd libraries/joomla/application/router.php text naming $>>
  • 25.
    pdepend pdepend ­­overview­pyramid=./ pdepend.svg libraries/joomla/
  • 26.
    php documentation generator ● PHPDocumentator – creates automated API documentation based on inline code blocks ● Installation – pear install PhpDocumentor
  • 27.
  • 28.
    Code Coverage Whichstatements, branches, and paths are executed when the tests run? ● Statement Coverage ● Branch Coverage ● Path Coverage 100% Code Coverage is a required, but not a sufficient criteria for test completeness
  • 29.
    >> phpunit ­­coverage­html /tmp/report BankAccountTest PHPUnit 3.4.0 by Sebastian Bergmann. ..... Time: 0 seconds OK (5 tests, 5 assertions) Generating code coverage report, this may take a moment.
  • 30.
    Profiling ● Xdebug'sbuilt-in profiler ● Finds bottlenecks in your script ● Output can be visualized by external tools such as KCacheGrind or WinCacheGrind.
  • 32.
    Agenda ● SoftwareQuality Assurance ● Code Testing ● Code Analysis ● Continous Integration (Automation) ● Quick Demo of QA
  • 33.
  • 34.
    phing ● automatedbuild tool – like Apache Ant – integrates well with other PHP tools ● Installation – pear channel-discover pear.phing.info – pear install phing/phing
  • 35.
    Sample build file <?xml version="1.0" ?> <project name="builder" basedir="." default="build" description="Build PayPlans Kit."> <target name="build" depends="config"> <phingcall target="export_from_wc" /> <phing phingfile="${project.shortform.small}.xml" inheritAll="true" target="build" /> <zip destfile="${dir.packages}/${project.shortform}­${ file.version}.$ {svn.lastrevision}.zip" basedir="${dir.tmp}" /> </target> <target name="config" description="Load configuration file"> <php expression="(PHP_OS == 'WINNT') ? '_win' :'_unix'" returnProperty="IF_OS"/> <property file="global${IF_OS}.prop" override="false" /> <property file="build${IF_OS}.prop" override="false" /> <svnlastrevision workingcopy="${dir.root}" propertyname="svn.lastrevision" /> </target> </project>
  • 36.
    Cruise control Frameworkfor a continuous build process ● Includes, but is not limited to, plugins for email notification, Apache Ant, Phing, and various source control tools ● A web interface is provided to view the details of the current and previous builds
  • 37.
  • 38.
    phpUnderControl ● Customizationof CruiseControl that caters to the needs of PHP projects – PHPUnit – PHPDocumentor – PHP_CodeSniffer – PHP_Depend – phpmd – phpcpd
  • 39.
  • 40.
    Agenda ● SoftwareQuality Assurance ● Code Testing ● Code Analysis ● Continous Integration ● Quick Demo of QA
  • 41.
    Credits ● http://www.slideshare.net/sebastian_bergmann ● http://www.slideshare.net/DragonBe ● http://www.slideshare.net/spriebsch
  • 42.
    Thanks... Find usat : ● http://twitter.com/joomlaxi ● http://facebook.com/joomlaxi ● shyam@readybytes.in