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. Industrialiser le
    Contrat PHP
    À tous les étages

    View Slide

  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

    View Slide

  3. Le Contrat
    • Signez-ici
    • Avec votre sang
    • Sinon…
    Porte sur un Comportement
    On doit pouvoir le vérifier

    View Slide

  4. DANS LE CODE SOURCE
    Tous les jours

    View Slide

  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 ?

    View Slide

  6. Duck Typing
    C’est un canard !

    View Slide

  7. Modèle Objet PHP
    • Une Interface EST un contrat
    • Ce contrat ne peut être rompu
    interface ChienInterface {
    public function aboyer();
    public function manger();
    public function dormir();
    }
    « Implements »
    =
    « je m’engage à… sinon fouette-moi! »

    View Slide

  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

    View Slide

  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

    View Slide

  10. L’ENGAGEMENT DE LA STUPIDITÉ
    Le modèle Objet

    View Slide

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

    View Slide

  12. Métriques
    • Couplage applicatif
    • Modularité et dépendance
    • Complexité cyclomatique
    • Verticalité applicative
    PHP Depend

    View Slide

  13. Métriques
    Cornac

    View Slide

  14. CONTRACTUALISER LA
    COLLABORATION
    Travailler en équipe

    View Slide

  15. Code accessible
    • Système de versionning
    • Source Control Management
    • Mercurial
    • Svn
    • Git
    • …

    View Slide

  16. Code source lisible
    PHP_CodeSniffer, checkStyle

    View Slide

  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

    View Slide

  18. Code source propre
    PHPMessDetector

    View Slide

  19. CONTRACTUALISER LES OUTILS
    TIERS
    Gestion des Dépendances

    View Slide

  20. Dépendances systèmes
    • PHING (Ant)

    expression="in_array('curl', get_loaded_extensions())"
    returnProperty="curlEnabled“
    />


    • 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";

    View Slide

  21. Dépendances applicatives
    • Puissant
    • Vieillot


    5.3.0
    1.9.4

    PHPUnit
    pear.phpunit.de
    3.7.0
    3.7.1


    Pear

    View Slide

  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

    View Slide

  23. GARANTIR LA SÉCURITÉ (essayer)
    Sécuriser

    View Slide

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

    View Slide

  25. Surface d’attaque
    NIKTO2

    View Slide

  26. CONTRACTUALISER LE BESOIN
    Travailler sur le fonctionnel

    View Slide

  27. Vérifier le besoin métier
    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

    View Slide

  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

    View Slide

  29. Behavior Driven Development
    Behat

    View Slide

  30. Domain Driven Design
    • S’assurer que le code correspond au besoin
    • Le code recouvre le besoin
    • Les modèles sont fonctionnels

    View Slide

  31. CENTRALISER LES CONTRATS
    Vision globale

    View Slide

  32. Superviser
    Sonar

    View Slide

  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

    View Slide

  34. View Slide

  35. Merci !
    • C’est l’heure des questions
    • @halleck45
    • blog.lepine.pro

    View Slide