29
13/07/11 1 Objets et patterns en PHP Qualité des projets PHP

Qualité des projets PHP - RMLL2011.rmll.info/IMG/pdf/RMLL-qualite-PHP-2011.pdf13/07/11 Outiller la qualité des projets PHP 22 PHPCS (Code Sniffer) Conventions d'écriture de code

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

13/07/11 1Objets et patterns en PHP

Qualité des projets PHP

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"

‐ Facebook

‐ 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

1413/07/11 Outiller la qualité des projets PHP

Les tests couvrent-ils tout le code ?

1513/07/11 Outiller la qualité des projets PHP

Les tests couvrent-ils tout le code ?

1613/07/11 Outiller la qualité des projets PHP

Les tests couvrent-ils tout le code ?

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

1913/07/11 Outiller la qualité des projets PHP

PHPDepends

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

...

2113/07/11 Outiller la qualité des projets PHP

PHPMD (Mess Detector)

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>

2713/07/11 Outiller la qualité des projets PHP

PHPUnderControl

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

2913/07/11 Outiller la qualité des projets PHP

Merci !Questions ?