Industrialiser le contrat en PHP

Industrialiser le contrat en PHP

survol des outils et pratiques pour industrialiser et contractualiser son code : tests automatisés, intégration continue, analyse statique...

Cad0f293595fc534e4ebd1eb7e3f1a1a?s=128

Jean-François Lépine

February 05, 2013
Tweet

Transcript

  1. Industrialiser le Contrat PHP À tous les étages

  2. En face de vous • Jean-François Lépine • Consultant PHP

    Chez Alterway • Vice-secrétaire de l’AFUP • @Halleck45 • http://blog.lepine.pro
  3. Le Contrat • Signez-ici • Avec votre sang • Sinon…

    Porte sur un Comportement On doit pouvoir le vérifier
  4. DANS LE CODE SOURCE Tous les jours

  5. Un code est un comportement • Une fonction • Attend

    une donnée (2 entiers ) • Traite une données (les additionne) • Fournit une données (1 entier) Comment s’en assurer ?
  6. Duck Typing C’est un canard !

  7. Modèle Objet PHP • Une Interface EST un contrat •

    Ce contrat ne peut être rompu <?php interface ChienInterface { public function aboyer(); public function manger(); public function dormir(); } « Implements » = « je m’engage à… sinon fouette-moi! »
  8. Programmation par Contrat • N’est rien d’autre que de la

    POO poussée jusqu’au bout /** * @requires nom : string(boundinteger(1,10)); * @requires jour : boundinteger(1,31); * @requires mois : boundinteger(1,12); * @requires annee : boundinteger(1911,2011); * @ensures \result : boolean(); * @throwable FooException; */ public function test1($nom,$jour,$mois,$annee) { HOA / Praspel
  9. Test Driven Development • Consiste à vérifier le traitement d’une

    fonction vis-à-vis d’une donnée avant son implémentation PHP Unit, atoum
  10. L’ENGAGEMENT DE LA STUPIDITÉ Le modèle Objet

  11. KISS • SOLID • Comment tester la stupidité ?

  12. Métriques • Couplage applicatif • Modularité et dépendance • Complexité

    cyclomatique • Verticalité applicative PHP Depend
  13. Métriques Cornac

  14. CONTRACTUALISER LA COLLABORATION Travailler en équipe

  15. Code accessible • Système de versionning • Source Control Management

    • Mercurial • Svn • Git • …
  16. Code source lisible PHP_CodeSniffer, checkStyle

  17. Code source chargeable • Respectez le contrat de la PHP

    Standard Recommandation 0 (PSR-0) • Un nom de classe commence par une majuscule • Chaque namespace est séparé par un _ ou un \ • Chaque séparateur de namespace représente un niveau dans l’arborescence des dossiers • Correspondance exacte entre le nom de la classe et le nom du fichier
  18. Code source propre PHPMessDetector

  19. CONTRACTUALISER LES OUTILS TIERS Gestion des Dépendances

  20. Dépendances systèmes • PHING (Ant) <target name="php.check.curl"> <php expression="in_array('curl', get_loaded_extensions())"

    returnProperty="curlEnabled“ /> <fail unless="curlEnabled" message="You need cUrl" /> </target> • PHP <?php require_once dirname(__FILE__).'/SymfonyRequirements.php'; $symfonyRequirements = new SymfonyRequirements(); $iniPath = $symfonyRequirements->getPhpIniConfigPath(); echo "********************************\n"; echo "* *\n"; echo "* Symfony requirements check *\n"; echo "* *\n"; echo "********************************\n\n";
  21. Dépendances applicatives • Puissant • Vieillot <dependencies> <required> <php><min>5.3.0</min></php> <pearinstaller><min>1.9.4</min></pearinstaller>

    <package> <name>PHPUnit</name> <channel>pear.phpunit.de</channel> <min>3.7.0</min> <max>3.7.1</max> </package> … Pear
  22. Dépendance applicatives • Puissant • Très utilisé et moderne •

    Jeune "require": { "php": ">=5.3.3", "symfony/symfony": "2.2.*", "doctrine/orm": ">=2.2.3,<2.4-dev", "doctrine/doctrine-bundle": "1.0.*", "twig/extensions": "1.0.*« } Composer
  23. GARANTIR LA SÉCURITÉ (essayer) Sécuriser

  24. Audit statique • Vérifier quelques « empreintes » dans le

    code source RATS
  25. Surface d’attaque NIKTO2

  26. CONTRACTUALISER LE BESOIN Travailler sur le fonctionnel

  27. Vérifier le besoin métier <?php require_once 'PHPUnit/Extensions/Story/TestCase.php'; require_once 'BowlingGame.php'; class

    BowlingGameSpec extends PHPUnit_Extensions_Story_ TestCase { /** * @scenario */ public function scoreForGutterGameIs0() { $this ->given('New game') ->then('Score should be', 0); } } PHPUnit
  28. Gherkin Fonctionnalité: posséder un compte bancaire Afin de gérer les

    comptes bancaires des utilisateurs En tant que client Je dois être capable d'effectuer des opérations basique sur mon compte Scénario: Avoir un compte bancaire valide Etant donné que je suis un nouveau client Alors je dois avoir "0" euros sur mon compte Scénario: Retirer de l'argent sur mon compte Etant donné que je suis un client Et que je possède "50" euros sur mon compte Quand je retire "10" euros Alors je dois avoir "40" euros sur mon compte
  29. Behavior Driven Development Behat

  30. Domain Driven Design • S’assurer que le code correspond au

    besoin • Le code recouvre le besoin • Les modèles sont fonctionnels
  31. CENTRALISER LES CONTRATS Vision globale

  32. Superviser Sonar

  33. Intégration continue • Permet de s’assurer que, quoi qu’il se

    passe, un code qui ne respecte pas l’ensemble des contrats ne peut pas être mis en production
  34. None
  35. Merci ! • C’est l’heure des questions • @halleck45 •

    blog.lepine.pro