Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
213/07/11 Outiller la qualité des projets PHP
Qui suis-je ?Julien PAULI ; [email protected]
Architecte système et logiciel
Expert spécialiste plateforme LAMP (PHP)
Contributeur open source
Consultant
Co-Auteur (Eyrolles) https://github.com/jpauli
@julienpauli
313/07/11 Outiller la qualité des projets PHP
Voyons voir ...Introduction
Projets PHP aujourd'hui, où en est-on ?
Besoin de mesurer la qualité
Mesures de qualité
Testabilité, tests unitaires
Design logiciel, complexité du code
Code mort
Industrialiser, automatiser
Intégration continue
413/07/11 Outiller la qualité des projets PHP
PHP, rappelez moi ce que c'est ?Langage web interprété, crée en ~1998
Langage procédural
Syntaxe Inspirée de C
Possède un modèle objet, inspiré de Java
Ecrit en C (~800.000 lignes), Machine virtuelle
Extensible
Performant
Simple et efficace
Massivement déployé
▪ Y compris chez les "gros"
‐ Yahoo!
513/07/11 Outiller la qualité des projets PHP
PHP où en est-on ?2009 : PHP 5.3
Enrichissement du modèle objet (namespaces)
Performances du moteur accrues (~+15%)
Meilleure gestion de la mémoire
Fonctions anonymes
Prévention de l'utilisation de fonctions dépréciées
Pilote MySQL natif (mysqlnd : licence PHP)
FastCGI refondu (PHP FPM)
613/07/11 Outiller la qualité des projets PHP
PHP les projets d'aujourd'huiBasés sur des frameworks
Très orientés objets
Beaucoup de lignes de codes (dizaines/centaines de milliers)
Beaucoup d'humains
Beaucoup d'objets
Compléxité générale croissante
Comment garder un oeil global sur le code produit ?
Comment éviter les régressions liées aux changements ?
Comment faciliter l'insertion de nouveaux acteurs ?
713/07/11 Outiller la qualité des projets PHP
Sondez votre projetPrennez des mesures
Combien de lignes de code ?
Combien de lignes de code mort ?
Combien de classes, d'interfaces ?
Analysez ce qui ne va pas
Quels tests échouent ? Quand ?
Profondeur d'héritage trop importante
Compléxité cyclomatique trop élevée
Conventions d'écriture non respéctées
▪ Méthodes, classes, variables mal écrites
813/07/11 Outiller la qualité des projets PHP
phploc (PHP Line Of Code)
julien@julien:/project$ phploc .
Directories: 496Files: 2378Lines of Code (LOC): 470241Cyclomatic Complexity / Lines of Code: 0.17Executable Lines of Code (ELOC): 169530Comment Lines of Code (CLOC): 219643Non-Comment Lines of Code (NCLOC): 250598
Anonymous Functions: 2Functions: 0
Constants: 3759 Global constants: 2 Class constants: 3757
913/07/11 Outiller la qualité des projets PHP
phploc (PHP Line Of Code)
Namespaces: 10Interfaces: 119Classes: 2257 Abstract: 194 (8.60%) Concrete: 2063 (91.40%) Average Class Length (NCLOC): 114Methods: 15726 Scope: Non-Static: 14631 (93.04%) Static: 1095 (6.96%) Visibility: Public: 12416 (78.95%) Non-Public: 3310 (21.05%) Average Method Length (NCLOC): 16 Cyclomatic Complexity / Number of Methods: 2.80
1013/07/11 Outiller la qualité des projets PHP
TestsOn a un aperçu global de la taille du projet
Voyons maintenant ses tests unitaires
PHPUnit
Clone de Junit (Java)
Tests unitaires, tests fonctionnels (Selenium)
Couverture de tests
Statistiques
1113/07/11 Outiller la qualité des projets PHP
julien@julien:/project/tests$ phpunit AllTests.phpPHPUnit 3.5.14 by Sebastian Bergmann.
............................................................... 63 / 799 ( 7%)
............................................................... 126 / 799 ( 15%)
...............................SSS...........................S. 189 / 799 ( 23%)S.SS........................................................... 252 / 799 ( 31%)...............................................S............... 315 / 799 ( 39%)...................S........................................... 378 / 799 ( 47%)............................................................... 441 / 799 ( 55%)............................................................... 504 / 799 ( 63%)......................S....S................................... 567 / 799 ( 70%)............................................................... 630 / 799 ( 78%)............................................................... 693 / 799 ( 86%)............................................................... 756 / 799 ( 94%)..................................S........
Time: 3 seconds, Memory: 36.25MbOK, but incomplete or skipped tests!Tests: 799, Assertions: 1759, Skipped: 12.
1213/07/11 Outiller la qualité des projets PHP
There were 12 skipped tests:
1) Zend_Controller_Action_Helper_FlashMessengerTest::testLoadFlashMessengerCannot test FlashMessenger due to unavailable session save path
/media/www/ZF/trunk/tests/Zend/Controller/Action/Helper/FlashMessengerTest.php:93
2) Zend_Controller_Action_Helper_FlashMessengerTest::testClearMessagesCannot test FlashMessenger due to unavailable session save path
/media/www/ZF/trunk/tests/Zend/Controller/Action/Helper/FlashMessengerTest.php:93
3) Zend_Controller_Action_Helper_FlashMessengerTest::testDirectProxiesToAddMessageCannot test FlashMessenger due to unavailable session save path
Tests : mode verbeux
1313/07/11 Outiller la qualité des projets PHP
Tests : checklist [x] Add routes [x] Has route [x] Get route [x] Remove route [x] Get non existent route [x] Route [x] Route with incorrect request [x] Default route [x] Default route with empty action [x] Empty route [ ] Assembling with hostname http [ ] Assembling with hostname https [ ] Assembling with hostname through chain http [x] Assembling with hostname with chain http [ ] Assembling with non first hostname [x] Request params used as global param [x] Can generate numeric key uri [x] Calling assemble with null argument should throw exception
1713/07/11 Outiller la qualité des projets PHP
phpcpd (Copy Paste Detector)
julien@julien:/project$ phpcpd .
Found 2 exact clones with 56 duplicated lines in 3 files:
- Dispatcher/Abstract.php:282-310 Router/Abstract.php:75-103
- Dispatcher/Abstract.php:282-310 Front.php:653-681
0.37% duplicated lines out of 14946 total lines of code.
Time: 1 second, Memory: 13.25Mb
Copier/coller = erreur de conception
1813/07/11 Outiller la qualité des projets PHP
PHPDependsNiveau de couplage
Compléxité du code
Nombre de branches décisionnelles (if, switch, &&, ||, for, catch …)
Nombre de chemins possibles dans une méthode
Parsing source files:.................................................... 52Executing Coupling-Analyzer:.............................................. 921Executing CyclomaticComplexity-Analyzer:........................................... 880Executing Dependency-Analyzer:.................................. 686Executing Inheritance-Analyzer:...... 134Executing NodeCount-Analyzer:.................................. 686Executing NodeLoc-Analyzer:.................................... 738Generating pdepend log files, this may take a moment.Time: 00:11; Memory: 53.75Mb
2013/07/11 Outiller la qualité des projets PHP
PHPMD (Mess Detector)Detecte les mauvaises pratiques dans le code
Nom de méthode trop long
Compléxité cyclomatique trop importante
Nom de variables insignifiants ($a, $b...)
Variable déclarée mais inutilisée
Ancien code pour anciennes versions de PHP
Trop de méthodes par classe
...
2213/07/11 Outiller la qualité des projets PHP
PHPCS (Code Sniffer)Conventions d'écriture de code
Pratique lorsque X développeurs travaillent le même projet
Permet une homogénisation
Permet d'être rapidement productif
2313/07/11 Outiller la qualité des projets PHP
PHPCS (Code Sniffer)FILE: /media/www/ZF/trunk/library/Zend/Controller/Router/Route/Static.php--------------------------------------------------------------------------------FOUND 24 ERROR(S) AND 7 WARNING(S) AFFECTING 18 LINE(S)-------------------------------------------------------------------------------- 18 | WARNING | Line exceeds 85 characters; contains 87 characters 18 | ERROR | @copyright tag must contain a year and the name of the | | copyright holder 19 | WARNING | Invalid version "$Id: Static.php 24180 2011-07-03 13:39:31Z | | adamlundrigan $" in file comment; consider "CVS: <cvs_id>" or | | "SVN: <svn_id>" instead 19 | ERROR | The @version tag is in the wrong order; the tag follows | | @license 21 | WARNING | PHP version not specified 21 | ERROR | Missing @author tag in file comment 21 | ERROR | Missing @link tag in file comment 33 | WARNING | Line exceeds 85 characters; contains 87 characters 33 | ERROR | @copyright tag must contain a year and the name of the | | copyright holder 35 | ERROR | Missing @category tag in class comment 35 | ERROR | Missing @author tag in class comment 35 | ERROR | Missing @link tag in class comment 36 | WARNING | Line exceeds 85 characters; contains 87 characters
2413/07/11 Outiller la qualité des projets PHP
Automatiser le toutPasser à la main tous les outils d'analyse est pénible
Automatiser le tout, déclenchement sur événement
A intervalle régulier
Lors d'un commit dans le dépôt
Lorsque XXXXX ? {what you want}
Processus dit "d'intégration continue"
Apache ANT
Cruisecontrol
Jekins
Hudson
2513/07/11 Outiller la qualité des projets PHP
Cruisecontrol, PHPUnderControlLance les outils d'analyse de code
Récupère les logs (xml)
Analyse les logs
Formules mathématiques
Niveau de "qualité" technique du produit
Trace de beaux graphiques
Préviens le chef de projet lorsqu'il se passe quelque chose
Par mail, par sms...
2613/07/11 Outiller la qualité des projets PHP
Tâches ANT<?xml version="1.0" encoding="UTF-8"?><project name="MyProject" basedir="." default="main">
<property name="libdir" value="${basedir}/library" /> <property name="logdir" value="${basedir}/logs" /> <target name="main"> <exec executable="phpunit" dir="./tests"></exec> <exec executable="phpcpd" dir="${libdir}"> <arg line="--log-pmd ${logdir}/phpcpd.xml" /> <arg line="." /> </exec> <exec executable="phpcs"> <arg line="--report-xml=${logdir}/phpcs.xml ." /> </exec> </target></project>
2813/07/11 Outiller la qualité des projets PHP
Qualité technique des projets PHPPHPUnit
PHPCPD - PHPDCD
PHPMD
PHPCS
PHPDepends
Tous les outils présentés ici sont libres
Récupérez les
▪ Sur github
▪ Sur les sites de leurs auteurs
▪ Via PEAR
Testez les, utilisez les