SlideShare ist ein Scribd-Unternehmen logo
1 von 68
La qualité au meilleur prix
grâce aux tests unitaires
               PHP’tit Déj
            «Software Quality»
        26.10.2012 - Luxembourg
Présentation


Gauthier Delamarre
 = Responsable des services @ VA Consulting
 = Architecte logiciel, formateur, coach
 = Expert PHP depuis 1999
La qualité logicielle ?
La qualité logicielle ?


 ≠ Non, les qualités logicielles
La qualité logicielle ?


 ≠ Non, les qualités logicielles
     règles métier
La qualité logicielle ?


 ≠ Non, les qualités logicielles
     règles métier
     exigences fonctionnelles
La qualité logicielle ?


 ≠ Non, les qualités logicielles
     règles métier
     exigences fonctionnelles
     normes et standards
La qualité logicielle ?


 ≠ Non, les qualités logicielles
         règles métier
         exigences fonctionnelles
         normes et standards
   ...
Règles métier
Règles métier


= méthodes
Règles métier


= méthodes
   calculs
Règles métier


= méthodes
   calculs
   traitements
Règles métier


= méthodes
   calculs
   traitements
   validation
Règles métier


= méthodes
       calculs
       traitements
       validation
 ...
Test manuel
Test manuel


≠ prédictible
Test manuel


≠ prédictible
    dépend de l’opérateur
Test manuel


≠ prédictible
    dépend de l’opérateur
≠ reproductible
Test manuel


≠ prédictible
    dépend de l’opérateur
≠ reproductible
    coûts prohibitifs
Test unitaire ?
Test unitaire ?



 ≠ tester une seule fois
Test unitaire ?



 ≠ tester une seule fois
 = test automatisé
Test automatisé ?
Test automatisé ?


= prédictible
Test automatisé ?


= prédictible
    fiable
Test automatisé ?


= prédictible
    fiable
= reproductible
Test automatisé ?


= prédictible
    fiable
= reproductible
    sans surcoût
Test Driven Development
Test Driven Development


= guide la conception
Test Driven Development


= guide la conception
= assure la testabilité
Test Driven Development


= guide la conception
= assure la testabilité
= overhead minime
Scénario d’exemple :
                facturation
Définir une unité
Définir une unité

une classe
Définir une unité

une classe
 ≠ facture
Définir une unité

une classe
 ≠ facture
    ligne de facture
Définir une unité

une classe
 ≠ facture
    ligne de facture
+ une méthode
Définir une unité

une classe
 ≠ facture
    ligne de facture
+ une méthode
    total()
Définir une unité

une classe
 ≠ facture
    ligne de facture
+ une méthode
    total()
= unité
Premier Test Case
Premier Test Case


 quantité
Premier Test Case


  quantité
× prix unitaire
Premier Test Case


  quantité
× prix unitaire
= prix total (de la ligne)
Créer le test
Créer le test


 public function testInvoiceLineTotal()
Créer le test


 public function testInvoiceLineTotal()
 {
   $line = new InvoiceLine(2, 45);
   $this->assertEquals(90, $line->total());
 }
Créer l’unité
Créer l’unité

 class InvoiceLine
 {
    /* properties + constructor */
    public function total()
    {
       return $this->_quantity * $this->_unitPrice;
    }
 }
Jouer le test

 # phpunit tests/models/InvoiceLineTest.php

 PHPUnit 3.7.8 by Sebastian Bergmann.
 .


 Time: 0 seconds, Memory: 2.25Mb


 OK (1 test, 1 assertion)
Prise en charge de la TVA
Prise en charge de la TVA


public function testInvoiceLineTotal()
{
  $line = new InvoiceLine(2, 45, 15);
  $this->assertEquals(103.5, $line->total());
}
Rejouer le test
 # phpunit tests/models/InvoiceLineTest.php

 PHPUnit 3.7.8 by Sebastian Bergmann.
 F
 Time: 0 seconds, Memory: 2.50Mb
 There was 1 failure:
 1) InvoiceLineTest::testInvoiceLineTotal
 Failed asserting that 90 matches expected 103.5.
 /Users/gauthier/projects/UnitTesting/tests/models/InvoiceLineTest.php:18
 FAILURES!
 Tests: 1, Assertions: 1, Failures: 1.
Adapter l’unité
Adapter l’unité
 class InvoiceLine
 {
    /* properties + constructor */
    public function total()
    {
       $total = $this->_quantity * $this->_unitPrice;
       return $total * (1 + ($this->_vat / 100));
    }
 }
Rejouer le test

 # phpunit tests/models/InvoiceLineTest.php

 PHPUnit 3.7.8 by Sebastian Bergmann.
 .


 Time: 0 seconds, Memory: 2.25Mb


 OK (1 test, 1 assertion)
Résumé
Résumé
tester unitairement
Résumé
tester unitairement
 = gain de temps
Résumé
tester unitairement
 = gain de temps
      au design de l’application
Résumé
tester unitairement
 = gain de temps
      au design de l’application
      à l’exécution des tests
Résumé
tester unitairement
 = gain de temps
      au design de l’application
      à l’exécution des tests
 = amélioration de la qualité
Résumé
tester unitairement
 = gain de temps
      au design de l’application
      à l’exécution des tests
 = amélioration de la qualité
      du code produit
Résumé
tester unitairement
 = gain de temps
      au design de l’application
      à l’exécution des tests
 = amélioration de la qualité
      du code produit
      des fonctionnalités
Résumé
tester unitairement
 = gain de temps
      au design de l’application
      à l’exécution des tests
 = amélioration de la qualité
      du code produit
      des fonctionnalités
 = industrialisation
Résumé
tester unitairement
 = gain de temps
      au design de l’application
      à l’exécution des tests
 = amélioration de la qualité
      du code produit
      des fonctionnalités
 = industrialisation
      intégration continue
Résumé
tester unitairement
 = gain de temps
      au design de l’application
      à l’exécution des tests
 = amélioration de la qualité
      du code produit
      des fonctionnalités
 = industrialisation
      intégration continue
 = gain de productivité
Questions ?
Merci de votre attention !


 Twitter
           = @gdelamarre
 Mail
           = gauthier.delamarre@
           vaconsulting.lu

Weitere ähnliche Inhalte

Andere mochten auch

Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
Hugo Hamon
 
Unit Testing using PHPUnit
Unit Testing using  PHPUnitUnit Testing using  PHPUnit
Unit Testing using PHPUnit
varuntaliyan
 
Think tank : Signaux faibles pour aujourd'hui et pour demain
Think tank : Signaux faibles pour aujourd'hui et pour demainThink tank : Signaux faibles pour aujourd'hui et pour demain
Think tank : Signaux faibles pour aujourd'hui et pour demain
The Connecting Place
 

Andere mochten auch (9)

Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
Bonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHPBonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHP
 
Unit Testing using PHPUnit
Unit Testing using  PHPUnitUnit Testing using  PHPUnit
Unit Testing using PHPUnit
 
RV TIC - Le Web, quest-ce que cest?
RV TIC - Le Web, quest-ce que cest?RV TIC - Le Web, quest-ce que cest?
RV TIC - Le Web, quest-ce que cest?
 
L’artisanat artistique italy
L’artisanat artistique italyL’artisanat artistique italy
L’artisanat artistique italy
 
Eib Presentación
Eib PresentaciónEib Presentación
Eib Presentación
 
INTERVENTION FROTSI CENTRE-VAL DE LOIRE, le 29 novembre 2013
INTERVENTION FROTSI CENTRE-VAL DE LOIRE, le 29 novembre 2013INTERVENTION FROTSI CENTRE-VAL DE LOIRE, le 29 novembre 2013
INTERVENTION FROTSI CENTRE-VAL DE LOIRE, le 29 novembre 2013
 
Baie de Morlaix - Stratégie numérique 2013
Baie de Morlaix - Stratégie numérique 2013Baie de Morlaix - Stratégie numérique 2013
Baie de Morlaix - Stratégie numérique 2013
 
Think tank : Signaux faibles pour aujourd'hui et pour demain
Think tank : Signaux faibles pour aujourd'hui et pour demainThink tank : Signaux faibles pour aujourd'hui et pour demain
Think tank : Signaux faibles pour aujourd'hui et pour demain
 

Ähnlich wie La qualité au meilleur prix grâce aux tests unitaires

PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
Cyrille Grandval
 
Développement en méthode agile
Développement en méthode agileDéveloppement en méthode agile
Développement en méthode agile
laurent bristiel
 
PyConFR - testons en python
PyConFR - testons en pythonPyConFR - testons en python
PyConFR - testons en python
gburet
 

Ähnlich wie La qualité au meilleur prix grâce aux tests unitaires (20)

20151013 - Réduire les coûts des tests de performance ?
20151013 - Réduire les coûts des tests de performance ?20151013 - Réduire les coûts des tests de performance ?
20151013 - Réduire les coûts des tests de performance ?
 
Agile Tour Nantes 2014 - Tdd, le meilleur moyen d'écrire du code testable
Agile Tour Nantes 2014 - Tdd, le meilleur moyen d'écrire du code testableAgile Tour Nantes 2014 - Tdd, le meilleur moyen d'écrire du code testable
Agile Tour Nantes 2014 - Tdd, le meilleur moyen d'écrire du code testable
 
Strategie de test à agile tour bordeaux
Strategie de test à agile tour bordeauxStrategie de test à agile tour bordeaux
Strategie de test à agile tour bordeaux
 
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
 
TDD (Test Driven Developement) et refactoring
TDD (Test Driven Developement) et refactoringTDD (Test Driven Developement) et refactoring
TDD (Test Driven Developement) et refactoring
 
Azure DevOps Tests Plan
Azure DevOps Tests PlanAzure DevOps Tests Plan
Azure DevOps Tests Plan
 
Chouette! Encore un bug! Agile Tour 2012
Chouette! Encore un bug! Agile Tour 2012Chouette! Encore un bug! Agile Tour 2012
Chouette! Encore un bug! Agile Tour 2012
 
Formation Extreme Programming, Tests unitaires, travail collaboratif
Formation Extreme Programming, Tests unitaires, travail collaboratifFormation Extreme Programming, Tests unitaires, travail collaboratif
Formation Extreme Programming, Tests unitaires, travail collaboratif
 
13-Cours de Géniel Logiciel
13-Cours de Géniel Logiciel13-Cours de Géniel Logiciel
13-Cours de Géniel Logiciel
 
Valider par des tests - Blend
Valider par des tests - BlendValider par des tests - Blend
Valider par des tests - Blend
 
Automatisation des tests - objectifs et concepts - partie 1
Automatisation des tests  - objectifs et concepts - partie 1Automatisation des tests  - objectifs et concepts - partie 1
Automatisation des tests - objectifs et concepts - partie 1
 
Conformiq
ConformiqConformiq
Conformiq
 
Développement en méthode agile
Développement en méthode agileDéveloppement en méthode agile
Développement en méthode agile
 
Assurance Qualité logicielle
Assurance Qualité logicielleAssurance Qualité logicielle
Assurance Qualité logicielle
 
PyConFR - testons en python
PyConFR - testons en pythonPyConFR - testons en python
PyConFR - testons en python
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2
 
Accélérer les tests d’acceptation avec un DSL et du refactoring
Accélérer les tests d’acceptation avec un DSL et du refactoringAccélérer les tests d’acceptation avec un DSL et du refactoring
Accélérer les tests d’acceptation avec un DSL et du refactoring
 
Qu'est ce qu'un logiciel de qualité
Qu'est ce qu'un logiciel de qualitéQu'est ce qu'un logiciel de qualité
Qu'est ce qu'un logiciel de qualité
 
Test unitaires
Test unitairesTest unitaires
Test unitaires
 
Université de la performance
Université de la performanceUniversité de la performance
Université de la performance
 

La qualité au meilleur prix grâce aux tests unitaires

Hinweis der Redaktion

  1. «A vaincre sans péril, on triomphe sans gloire»\n
  2. \n
  3. tests unitaires === tests techniques => tests d’implémentation des règles métiers\ntests unitaires == tests fonctionnels (dans une moindre mesure)\n
  4. tests unitaires === tests techniques => tests d’implémentation des règles métiers\ntests unitaires == tests fonctionnels (dans une moindre mesure)\n
  5. tests unitaires === tests techniques => tests d’implémentation des règles métiers\ntests unitaires == tests fonctionnels (dans une moindre mesure)\n
  6. tests unitaires === tests techniques => tests d’implémentation des règles métiers\ntests unitaires == tests fonctionnels (dans une moindre mesure)\n
  7. tests unitaires === tests techniques => tests d’implémentation des règles métiers\ntests unitaires == tests fonctionnels (dans une moindre mesure)\n
  8. - la plupart des méthodes métiers sont implémentées sous la forme de méthodes\n - ce sont elles qui représente l’essentiel de la valeur ajoutée d’une application\n - ces méthodes sont les unités auxquelles fait référence le terme «test unitaire»\n
  9. - la plupart des méthodes métiers sont implémentées sous la forme de méthodes\n - ce sont elles qui représente l’essentiel de la valeur ajoutée d’une application\n - ces méthodes sont les unités auxquelles fait référence le terme «test unitaire»\n
  10. - la plupart des méthodes métiers sont implémentées sous la forme de méthodes\n - ce sont elles qui représente l’essentiel de la valeur ajoutée d’une application\n - ces méthodes sont les unités auxquelles fait référence le terme «test unitaire»\n
  11. - la plupart des méthodes métiers sont implémentées sous la forme de méthodes\n - ce sont elles qui représente l’essentiel de la valeur ajoutée d’une application\n - ces méthodes sont les unités auxquelles fait référence le terme «test unitaire»\n
  12. - la plupart des méthodes métiers sont implémentées sous la forme de méthodes\n - ce sont elles qui représente l’essentiel de la valeur ajoutée d’une application\n - ces méthodes sont les unités auxquelles fait référence le terme «test unitaire»\n
  13. != prédictible => le résultat du test dépend de l’opérateur - de sa compréhension de la règle métier et de son interprétation du résultat\n!= coûts prohibitifs => chaque fois que le test est rejoué, il faut réinvestir le même temps - et ces temps d’exécution des tests croissent et se cumulent au long de la vie du projet\n
  14. != prédictible => le résultat du test dépend de l’opérateur - de sa compréhension de la règle métier et de son interprétation du résultat\n!= coûts prohibitifs => chaque fois que le test est rejoué, il faut réinvestir le même temps - et ces temps d’exécution des tests croissent et se cumulent au long de la vie du projet\n
  15. != prédictible => le résultat du test dépend de l’opérateur - de sa compréhension de la règle métier et de son interprétation du résultat\n!= coûts prohibitifs => chaque fois que le test est rejoué, il faut réinvestir le même temps - et ces temps d’exécution des tests croissent et se cumulent au long de la vie du projet\n
  16. != prédictible => le résultat du test dépend de l’opérateur - de sa compréhension de la règle métier et de son interprétation du résultat\n!= coûts prohibitifs => chaque fois que le test est rejoué, il faut réinvestir le même temps - et ces temps d’exécution des tests croissent et se cumulent au long de la vie du projet\n
  17. - test unitaire == test portant sur une unité\n - poser la question «qu’est-ce qu’un test unitaire ?» \n - indice : ce n’est pas un test effectué une seule fois - au contraire c’est un test automatisé\n
  18. - test unitaire == test portant sur une unité\n - poser la question «qu’est-ce qu’un test unitaire ?» \n - indice : ce n’est pas un test effectué une seule fois - au contraire c’est un test automatisé\n
  19. - impose la nécessité de tester des unités\n
  20. - impose la nécessité de tester des unités\n
  21. - impose la nécessité de tester des unités\n
  22. - impose la nécessité de tester des unités\n
  23. - permet de trouver plus vite la meilleure implémentation et facilite le refactoring\n - tester avant d’écrire le code garantit d’écrire du code testable\n - écrire les tests au fur et à mesure est plus fluide, et les gains immédiats équilibrent largement le temps investit dans l’écriture du test lui-même\n
  24. - permet de trouver plus vite la meilleure implémentation et facilite le refactoring\n - tester avant d’écrire le code garantit d’écrire du code testable\n - écrire les tests au fur et à mesure est plus fluide, et les gains immédiats équilibrent largement le temps investit dans l’écriture du test lui-même\n
  25. - permet de trouver plus vite la meilleure implémentation et facilite le refactoring\n - tester avant d’écrire le code garantit d’écrire du code testable\n - écrire les tests au fur et à mesure est plus fluide, et les gains immédiats équilibrent largement le temps investit dans l’écriture du test lui-même\n
  26. \n
  27. une unité = une classe + une méthode\n
  28. une unité = une classe + une méthode\n
  29. une unité = une classe + une méthode\n
  30. une unité = une classe + une méthode\n
  31. une unité = une classe + une méthode\n
  32. une unité = une classe + une méthode\n
  33. exemple volontairement trivial\n
  34. exemple volontairement trivial\n
  35. exemple volontairement trivial\n
  36. cette méthode est écrite dans une classe simple, héritant d’une classe du framework de test unitaire\nassertEquals = une assertion == un prédicat (les tests sont prédictibles...)\n
  37. cette méthode est écrite dans une classe simple, héritant d’une classe du framework de test unitaire\nassertEquals = une assertion == un prédicat (les tests sont prédictibles...)\n
  38. cette méthode est écrite dans une classe simple, héritant d’une classe du framework de test unitaire\nassertEquals = une assertion == un prédicat (les tests sont prédictibles...)\n
  39. cette méthode est écrite dans une classe simple, héritant d’une classe du framework de test unitaire\nassertEquals = une assertion == un prédicat (les tests sont prédictibles...)\n
  40. cette méthode est écrite dans une classe simple, héritant d’une classe du framework de test unitaire\nassertEquals = une assertion == un prédicat (les tests sont prédictibles...)\n
  41. \n
  42. \n
  43. \n
  44. on s’assure que les changements du test reflètent une véritable modification\n=> évite les assertions inutiles\n
  45. \n
  46. \n
  47. évidemment tout ceci demande un investissement initial (formation, pratique...)\n
  48. évidemment tout ceci demande un investissement initial (formation, pratique...)\n
  49. évidemment tout ceci demande un investissement initial (formation, pratique...)\n
  50. évidemment tout ceci demande un investissement initial (formation, pratique...)\n
  51. évidemment tout ceci demande un investissement initial (formation, pratique...)\n
  52. évidemment tout ceci demande un investissement initial (formation, pratique...)\n
  53. évidemment tout ceci demande un investissement initial (formation, pratique...)\n
  54. évidemment tout ceci demande un investissement initial (formation, pratique...)\n
  55. évidemment tout ceci demande un investissement initial (formation, pratique...)\n
  56. évidemment tout ceci demande un investissement initial (formation, pratique...)\n
  57. \n
  58. \n