Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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...

Jean-François Lépine

February 05, 2013
Tweet

More Decks by Jean-François Lépine

Other Decks in Programming

Transcript

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

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

    Porte sur un Comportement On doit pouvoir le vérifier
  3. 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 ?
  4. 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! »
  5. 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
  6. Test Driven Development • Consiste à vérifier le traitement d’une

    fonction vis-à-vis d’une donnée avant son implémentation PHP Unit, atoum
  7. Métriques • Couplage applicatif • Modularité et dépendance • Complexité

    cyclomatique • Verticalité applicative PHP Depend
  8. 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
  9. 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";
  10. 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
  11. 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
  12. 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
  13. 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
  14. Domain Driven Design • S’assurer que le code correspond au

    besoin • Le code recouvre le besoin • Les modèles sont fonctionnels
  15. 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