SlideShare une entreprise Scribd logo
1  sur  114
Comment écrire du code testable Conférence Agile France 2010 Florence CHABANOIS
 
 
Frein ? Direction assistée? Boite de vitesse ? Pneus défectueux ?
 
Tests unitaires ,[object Object],[object Object],[object Object],[object Object],[object Object]
Isolation ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Une solution ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Le TDD ne donne pas l’immunité ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Leitmotiv ,[object Object],Isolabilité Simplicité
 
Symptômes d’un code intestable Isolabilité Simplicité Classes hyperactives Méthodes chargées Interroger des  collaborateurs Etats globaux Annuaires Blocs statiques Instanciation directe Constructeur cher Mélanger service et valeur Héritage
Ennemis jurés
 
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object]
Tester getDefinition() ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Test très lent Obligé d’avoir un fichier
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Symptômes d’un code intestable ,[object Object]
Un constructeur trop cher ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Un constructeur trop cher ,[object Object],[object Object],[object Object],[object Object],[object Object]
Un constructeur trop cher ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Code : Extraction de la méthode ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Test : instanciation d’une sous classe ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Un constructeur trop cher ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Un constructeur trop cher ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Un constructeur trop cher ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Le constructeur  ne coute plus cher Veine créée : Le code n’est plus « collé »
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Séparation des  responsabilités
Principe de responsabilité unique
Principe de responsabilité unique ,[object Object],[object Object],[object Object]
Principe de responsabilité unique ,[object Object],[object Object],[object Object],[object Object]
Principe de responsabilité unique Etudes Fournisseur Bureautique
Principe de responsabilité unique ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Création du graphe d’objets Logique métier
Focus sur demarrer() ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Symptômes d’un code intestable ,[object Object],[object Object]
Des instanciations directes ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Des instanciations directes ,[object Object],[object Object]
Des instanciations directes ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Symptômes d’un code intestable ,[object Object],[object Object],[object Object]
Des blocs statiques ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Des blocs statiques ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Des blocs statiques ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Spring-jeu.xml ,[object Object],[object Object],[object Object],[object Object]
testJoindre() ,[object Object],[object Object],[object Object],[object Object]
Symptômes d’un code intestable ,[object Object],[object Object],[object Object],[object Object]
Des dynasties de classes ?
 
Des dynasties de classes ,[object Object],[object Object],[object Object],[object Object],[object Object]
Des dynasties de classes ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
 
 
Symptômes d’un code intestable ,[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],a = b ?
[object Object]
 
On veut poser un test sur l’expresso ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Test de l’expresso  ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Null Pointer Exception
Test de l’expresso ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Null Pointer Exception
Test de l’expresso ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Null Pointer Exception
Test de l’expresso ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],CafeException
Pourquoi CafeException ? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Hein, quel robinet ?
Pourquoi CafeException ? ,[object Object],[object Object],[object Object],[object Object]
Test de l’expresso ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Ok ! Ok !
Je dev Je dev Je dev Je dev Je dev Je dev Je dev Je dev Mon code Il dev Il dev Il dev COMMIT Il dev Il dev Il dev Il dev Il dev COMMIT Son code
Boom ,[object Object],[object Object],[object Object],[object Object],[object Object],AssertionError : expected NULL « Son code »
Test de l’expresso ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Ok pour le moment…
Des états globaux ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Des états globaux ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Des états globaux ,[object Object],[object Object],[object Object],Violation de  l’encapsulation Code brouillé Et peu nettoyable Oubli de  reset Ordre compte Lisibilité
Des états globaux ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Des états globaux ,[object Object],[object Object],[object Object],[object Object]
Symptômes d’un code intestable ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Annuaire de services ,[object Object],[object Object],[object Object],[object Object],[object Object]
Annuaire de services ,[object Object],[object Object],[object Object],[object Object],[object Object]
Annuaire de services ,[object Object],[object Object],[object Object],[object Object],[object Object]
Pollueurs
Symptômes d’un code intestable ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
 
Avoir des intermédiaires ,[object Object],[object Object],[object Object],[object Object]
Avoir des intermédiaires ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Avoir des intermédiaires ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Avoir des intermédiaires ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object]
Initialisation du test avant ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Initialisation du test après ,[object Object],[object Object],[object Object],[object Object],[object Object]
Symptômes d’un code intestable ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
CommandeManager
Des classes hyperactives ,[object Object],[object Object],[object Object],[object Object],[object Object]
Des classes hyperactives ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Des classes hyperactives ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Des classes hyperactives ,[object Object],[object Object],[object Object]
Des classes hyperactives ,[object Object],[object Object],[object Object],[object Object],A Y Z X W A Y Z X W
Symptômes d’un code intestable ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Au guichet du Grand Huit ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Des méthodes trop chargées ,[object Object],[object Object],[object Object],[object Object]
Des méthodes trop chargées ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Des méthodes trop chargées ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Au guichet du Grand Huit ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],estPhysiquementCompatibleJeuxIntenses(personne) estLegalementCompatibleJeuxIntenses(personne)
Extraction de méthodes ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Extraction d’une autre classe ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Polymorphisme ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],abstract CommandeEtudiant CommandeStandard
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Symptômes d’un code intestable ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Opération générerFacture entrée sortie Facilement instanciable Getter/Setter Avec un état Objet valeur Est Objet service Fait
Objet valeur / Objet métier ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Client Joueur Expresso BanqueService CommandeValidator BaseDeDonnees
Mélanger les objets valeurs et les objets services ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Service Valeur Service Valeur Service
Symptômes d’un code intestable Isolabilité Simplicité Classes hyperactives Méthodes chargées Interroger des  collaborateurs Etats globaux Annuaires Blocs statiques Instanciation directe Constructeur cher Mélanger service et valeur Héritage
Vers du code testable Isolabilité Simplicité Passer les objets utilisés Directement en paramètre Pas de longues  initialisations Injecter les  dépendances Injecter les  dépendances Injecter les  dépendances Injecter les  dépendances Donner des veines pour les mocks Limiter  dépendances directes Supprimer les singletons, static et annuaires Petites classes  1 scénario = 1 test Séparer les  responsabilités Composition plutôt  Qu’héritage 1 classe = 1 responsabilité Petites  méthodes Polymorphisme
Outils ,[object Object],[object Object]
Ressources ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]

Contenu connexe

Tendances

What's Next Replay - IC / Jenkins
What's Next Replay - IC / JenkinsWhat's Next Replay - IC / Jenkins
What's Next Replay - IC / JenkinsZenikaOuest
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPjulien pauli
 
Jenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteJenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteStephane Couzinier
 
Intégration continue transco
Intégration continue transcoIntégration continue transco
Intégration continue transcolaurent_opnworks
 
Jenkins - perdre du temps pour en gagner
Jenkins - perdre du temps pour en gagnerJenkins - perdre du temps pour en gagner
Jenkins - perdre du temps pour en gagnerGeeks Anonymes
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Eric SIBER
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsAntoine Rey
 
Evolutions scub foundation 3.0 = 4.0
Evolutions scub foundation 3.0 =  4.0Evolutions scub foundation 3.0 =  4.0
Evolutions scub foundation 3.0 = 4.0adrienhautot
 
Bonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHPBonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHPPascal MARTIN
 
Intégration continue
Intégration continueIntégration continue
Intégration continueKlee Group
 
NodeJS for Mobile App
NodeJS for Mobile AppNodeJS for Mobile App
NodeJS for Mobile AppHabib MAALEM
 
Bbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic searchBbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic searchIdriss Neumann
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework springAntoine Rey
 
JCertif 2012 : Integration continue avec Jenkins
JCertif 2012 : Integration continue avec JenkinsJCertif 2012 : Integration continue avec Jenkins
JCertif 2012 : Integration continue avec JenkinsRossi Oddet
 
CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads France
 
SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)Rui Carvalho
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsCocoaHeads France
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur SpringAntoine Rey
 

Tendances (20)

What's Next Replay - IC / Jenkins
What's Next Replay - IC / JenkinsWhat's Next Replay - IC / Jenkins
What's Next Replay - IC / Jenkins
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
 
Jenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteJenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverte
 
Intégration continue transco
Intégration continue transcoIntégration continue transco
Intégration continue transco
 
JENKINS_BreizhJUG_20111003
JENKINS_BreizhJUG_20111003JENKINS_BreizhJUG_20111003
JENKINS_BreizhJUG_20111003
 
Jenkins - perdre du temps pour en gagner
Jenkins - perdre du temps pour en gagnerJenkins - perdre du temps pour en gagner
Jenkins - perdre du temps pour en gagner
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)
 
Des tests modernes pour Drupal
Des tests modernes pour DrupalDes tests modernes pour Drupal
Des tests modernes pour Drupal
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du temps
 
Evolutions scub foundation 3.0 = 4.0
Evolutions scub foundation 3.0 =  4.0Evolutions scub foundation 3.0 =  4.0
Evolutions scub foundation 3.0 = 4.0
 
Bonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHPBonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHP
 
Intégration continue
Intégration continueIntégration continue
Intégration continue
 
NodeJS for Mobile App
NodeJS for Mobile AppNodeJS for Mobile App
NodeJS for Mobile App
 
Bbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic searchBbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic search
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework spring
 
JCertif 2012 : Integration continue avec Jenkins
JCertif 2012 : Integration continue avec JenkinsJCertif 2012 : Integration continue avec Jenkins
JCertif 2012 : Integration continue avec Jenkins
 
CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - Epitez
 
SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
 

En vedette

Stratégies d'utilisation du Web 2.0
Stratégies d'utilisation du Web 2.0Stratégies d'utilisation du Web 2.0
Stratégies d'utilisation du Web 2.0Pierre Chicoine
 
Amigos em silencio
Amigos em silencioAmigos em silencio
Amigos em silenciozimbro
 
Quelles méthodes de repérage de l’habitat indigne ? Constats et préconisation...
Quelles méthodes de repérage de l’habitat indigne ? Constats et préconisation...Quelles méthodes de repérage de l’habitat indigne ? Constats et préconisation...
Quelles méthodes de repérage de l’habitat indigne ? Constats et préconisation...Ireps
 
Smiths medical cadd-legacy_pca_-_bedienungsanleitung
Smiths medical cadd-legacy_pca_-_bedienungsanleitungSmiths medical cadd-legacy_pca_-_bedienungsanleitung
Smiths medical cadd-legacy_pca_-_bedienungsanleitungTrevorjotoole
 
Diagnostic technique et participative de l'Ile a Vache
Diagnostic technique et participative de l'Ile a Vache Diagnostic technique et participative de l'Ile a Vache
Diagnostic technique et participative de l'Ile a Vache christianbeaulieu
 
Kriminalitet og straff
Kriminalitet og straffKriminalitet og straff
Kriminalitet og straffdhlie93
 
Zoneamento Nacional de Recursos de Óleo e Gás
Zoneamento Nacional de Recursos de Óleo e GásZoneamento Nacional de Recursos de Óleo e Gás
Zoneamento Nacional de Recursos de Óleo e GásPalácio do Planalto
 
Generation Y - Ce qui les distingue (vraiment) des autres générations...
Generation Y - Ce qui les distingue (vraiment) des autres générations...Generation Y - Ce qui les distingue (vraiment) des autres générations...
Generation Y - Ce qui les distingue (vraiment) des autres générations...David BERNARD
 
Relatório Google sobre uso de smartphone no Brasil (Maio/2012)
Relatório Google sobre uso de smartphone no Brasil (Maio/2012)Relatório Google sobre uso de smartphone no Brasil (Maio/2012)
Relatório Google sobre uso de smartphone no Brasil (Maio/2012)Ivila Bessa
 
The Difference Between Yeast and Bacteria Probiotics
The Difference Between Yeast and Bacteria ProbioticsThe Difference Between Yeast and Bacteria Probiotics
The Difference Between Yeast and Bacteria ProbioticsFlorastor
 
Pharma Market OTC & Nutrition Situation MAT 2013 Q2
Pharma Market OTC & Nutrition Situation MAT 2013 Q2Pharma Market OTC & Nutrition Situation MAT 2013 Q2
Pharma Market OTC & Nutrition Situation MAT 2013 Q2Danny D. Kosasih
 
Direito Tributario
Direito TributarioDireito Tributario
Direito Tributariojuborde
 
Conference : Une utilisation professionnelle des Réseaux et Médias sociaux
Conference : Une utilisation professionnelle des Réseaux et Médias sociauxConference : Une utilisation professionnelle des Réseaux et Médias sociaux
Conference : Une utilisation professionnelle des Réseaux et Médias sociauxAlban Jarry
 
Ebook cupcakes
Ebook cupcakesEbook cupcakes
Ebook cupcakesmucamaba
 
Conservação e recuperação de areas degradas
Conservação e recuperação de areas degradasConservação e recuperação de areas degradas
Conservação e recuperação de areas degradasUERGS
 
Sistema hyundai de produção v1
Sistema hyundai de produção v1Sistema hyundai de produção v1
Sistema hyundai de produção v1Gustavo Dienstmann
 
Formation au métier de Product owner
Formation au métier de Product ownerFormation au métier de Product owner
Formation au métier de Product ownerYannick Quenec'hdu
 

En vedette (20)

Stratégies d'utilisation du Web 2.0
Stratégies d'utilisation du Web 2.0Stratégies d'utilisation du Web 2.0
Stratégies d'utilisation du Web 2.0
 
Amigos em silencio
Amigos em silencioAmigos em silencio
Amigos em silencio
 
Quelles méthodes de repérage de l’habitat indigne ? Constats et préconisation...
Quelles méthodes de repérage de l’habitat indigne ? Constats et préconisation...Quelles méthodes de repérage de l’habitat indigne ? Constats et préconisation...
Quelles méthodes de repérage de l’habitat indigne ? Constats et préconisation...
 
Smiths medical cadd-legacy_pca_-_bedienungsanleitung
Smiths medical cadd-legacy_pca_-_bedienungsanleitungSmiths medical cadd-legacy_pca_-_bedienungsanleitung
Smiths medical cadd-legacy_pca_-_bedienungsanleitung
 
Diagnostic technique et participative de l'Ile a Vache
Diagnostic technique et participative de l'Ile a Vache Diagnostic technique et participative de l'Ile a Vache
Diagnostic technique et participative de l'Ile a Vache
 
Kriminalitet og straff
Kriminalitet og straffKriminalitet og straff
Kriminalitet og straff
 
Zoneamento Nacional de Recursos de Óleo e Gás
Zoneamento Nacional de Recursos de Óleo e GásZoneamento Nacional de Recursos de Óleo e Gás
Zoneamento Nacional de Recursos de Óleo e Gás
 
CSS3 - nouveautes
CSS3 - nouveautesCSS3 - nouveautes
CSS3 - nouveautes
 
Generation Y - Ce qui les distingue (vraiment) des autres générations...
Generation Y - Ce qui les distingue (vraiment) des autres générations...Generation Y - Ce qui les distingue (vraiment) des autres générations...
Generation Y - Ce qui les distingue (vraiment) des autres générations...
 
Relatório Google sobre uso de smartphone no Brasil (Maio/2012)
Relatório Google sobre uso de smartphone no Brasil (Maio/2012)Relatório Google sobre uso de smartphone no Brasil (Maio/2012)
Relatório Google sobre uso de smartphone no Brasil (Maio/2012)
 
Gas lift design
Gas lift designGas lift design
Gas lift design
 
The Difference Between Yeast and Bacteria Probiotics
The Difference Between Yeast and Bacteria ProbioticsThe Difference Between Yeast and Bacteria Probiotics
The Difference Between Yeast and Bacteria Probiotics
 
Pharma Market OTC & Nutrition Situation MAT 2013 Q2
Pharma Market OTC & Nutrition Situation MAT 2013 Q2Pharma Market OTC & Nutrition Situation MAT 2013 Q2
Pharma Market OTC & Nutrition Situation MAT 2013 Q2
 
Direito Tributario
Direito TributarioDireito Tributario
Direito Tributario
 
Conference : Une utilisation professionnelle des Réseaux et Médias sociaux
Conference : Une utilisation professionnelle des Réseaux et Médias sociauxConference : Une utilisation professionnelle des Réseaux et Médias sociaux
Conference : Une utilisation professionnelle des Réseaux et Médias sociaux
 
Futur 2.0
Futur 2.0Futur 2.0
Futur 2.0
 
Ebook cupcakes
Ebook cupcakesEbook cupcakes
Ebook cupcakes
 
Conservação e recuperação de areas degradas
Conservação e recuperação de areas degradasConservação e recuperação de areas degradas
Conservação e recuperação de areas degradas
 
Sistema hyundai de produção v1
Sistema hyundai de produção v1Sistema hyundai de produção v1
Sistema hyundai de produção v1
 
Formation au métier de Product owner
Formation au métier de Product ownerFormation au métier de Product owner
Formation au métier de Product owner
 

Similaire à Comment écrire du code testable ?

Formation tests decembre2010
Formation tests decembre2010Formation tests decembre2010
Formation tests decembre2010Fou Cha
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introductionneuros
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application javaAntoine Rey
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !Paris Salesforce Developer Group
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 OverviewGregory Renard
 
PréSentation Qualoo Le Generateur De Code Java J2 Ee
PréSentation Qualoo   Le Generateur De Code Java J2 EePréSentation Qualoo   Le Generateur De Code Java J2 Ee
PréSentation Qualoo Le Generateur De Code Java J2 EeST informatique services
 
Chapitre4 cours de java
Chapitre4 cours de javaChapitre4 cours de java
Chapitre4 cours de javainfo1994
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Jean-Michel Doudoux
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
Découvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCLDécouvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCLDotNetHub
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expériencelouschwartz
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Guillaume Laforge
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdfPatiento Del Mar
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...fdussert
 
L'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringL'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringPascal Laurin
 
L'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringL'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringMSDEVMTL
 

Similaire à Comment écrire du code testable ? (20)

Formation tests decembre2010
Formation tests decembre2010Formation tests decembre2010
Formation tests decembre2010
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 Overview
 
Bbl sur les tests
Bbl sur les testsBbl sur les tests
Bbl sur les tests
 
PréSentation Qualoo Le Generateur De Code Java J2 Ee
PréSentation Qualoo   Le Generateur De Code Java J2 EePréSentation Qualoo   Le Generateur De Code Java J2 Ee
PréSentation Qualoo Le Generateur De Code Java J2 Ee
 
Chapitre4 cours de java
Chapitre4 cours de javaChapitre4 cours de java
Chapitre4 cours de java
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Découvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCLDécouvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCL
 
J Unit
J UnitJ Unit
J Unit
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérience
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
 
L'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringL'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoring
 
L'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringL'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoring
 
Les Threads.ppt
Les Threads.pptLes Threads.ppt
Les Threads.ppt
 

Plus de Fou Cha

Comment recruter des femmes* dans un milieu d'hommes - DevFest Lille 2022
Comment recruter des femmes* dans un milieu d'hommes - DevFest Lille 2022Comment recruter des femmes* dans un milieu d'hommes - DevFest Lille 2022
Comment recruter des femmes* dans un milieu d'hommes - DevFest Lille 2022Fou Cha
 
Le focus, votre meilleur ennemi
Le focus, votre meilleur ennemiLe focus, votre meilleur ennemi
Le focus, votre meilleur ennemiFou Cha
 
Cheap user testing
Cheap user testingCheap user testing
Cheap user testingFou Cha
 
Cheap user testing (english)
Cheap user testing (english)Cheap user testing (english)
Cheap user testing (english)Fou Cha
 
Comment obtenir des standup qui marchent - Agile France 2016
Comment obtenir des standup qui marchent - Agile France 2016Comment obtenir des standup qui marchent - Agile France 2016
Comment obtenir des standup qui marchent - Agile France 2016Fou Cha
 
Comment obtenir des standup qui marchent
Comment obtenir des standup qui marchent Comment obtenir des standup qui marchent
Comment obtenir des standup qui marchent Fou Cha
 
REX Le kanban va-t-il fluidifier notre chaîne ?
REX Le kanban va-t-il fluidifier notre chaîne ?REX Le kanban va-t-il fluidifier notre chaîne ?
REX Le kanban va-t-il fluidifier notre chaîne ?Fou Cha
 
AF2013 Mais pourquoi y m'écoute pas ?
AF2013 Mais pourquoi y m'écoute pas ?AF2013 Mais pourquoi y m'écoute pas ?
AF2013 Mais pourquoi y m'écoute pas ?Fou Cha
 
Af2012 abaisser les_barrieres
Af2012 abaisser les_barrieresAf2012 abaisser les_barrieres
Af2012 abaisser les_barrieresFou Cha
 
[Kit agile] Jeu Garderie Toutou
[Kit agile] Jeu Garderie Toutou[Kit agile] Jeu Garderie Toutou
[Kit agile] Jeu Garderie ToutouFou Cha
 
[Kit agile] Jeu Agiville
[Kit agile] Jeu Agiville[Kit agile] Jeu Agiville
[Kit agile] Jeu AgivilleFou Cha
 
[Kit agile] Jeu sur les principes scrum
[Kit agile] Jeu sur les principes scrum[Kit agile] Jeu sur les principes scrum
[Kit agile] Jeu sur les principes scrumFou Cha
 
[Kit agile] Jeu sur la microgestion
[Kit agile] Jeu sur la microgestion[Kit agile] Jeu sur la microgestion
[Kit agile] Jeu sur la microgestionFou Cha
 
[Kit agile] Jeu sur le Backlog
[Kit agile] Jeu sur le Backlog[Kit agile] Jeu sur le Backlog
[Kit agile] Jeu sur le BacklogFou Cha
 
[Kit agile] Formation scrum (explications jeux et points marquants)
[Kit agile] Formation scrum (explications jeux et points marquants)[Kit agile] Formation scrum (explications jeux et points marquants)
[Kit agile] Formation scrum (explications jeux et points marquants)Fou Cha
 
Backlog "Introduction à Scrum par la pratique"
Backlog "Introduction à Scrum par la pratique"Backlog "Introduction à Scrum par la pratique"
Backlog "Introduction à Scrum par la pratique"Fou Cha
 
Introduction à Scrum Par La Pratique
Introduction à Scrum Par La PratiqueIntroduction à Scrum Par La Pratique
Introduction à Scrum Par La PratiqueFou Cha
 

Plus de Fou Cha (17)

Comment recruter des femmes* dans un milieu d'hommes - DevFest Lille 2022
Comment recruter des femmes* dans un milieu d'hommes - DevFest Lille 2022Comment recruter des femmes* dans un milieu d'hommes - DevFest Lille 2022
Comment recruter des femmes* dans un milieu d'hommes - DevFest Lille 2022
 
Le focus, votre meilleur ennemi
Le focus, votre meilleur ennemiLe focus, votre meilleur ennemi
Le focus, votre meilleur ennemi
 
Cheap user testing
Cheap user testingCheap user testing
Cheap user testing
 
Cheap user testing (english)
Cheap user testing (english)Cheap user testing (english)
Cheap user testing (english)
 
Comment obtenir des standup qui marchent - Agile France 2016
Comment obtenir des standup qui marchent - Agile France 2016Comment obtenir des standup qui marchent - Agile France 2016
Comment obtenir des standup qui marchent - Agile France 2016
 
Comment obtenir des standup qui marchent
Comment obtenir des standup qui marchent Comment obtenir des standup qui marchent
Comment obtenir des standup qui marchent
 
REX Le kanban va-t-il fluidifier notre chaîne ?
REX Le kanban va-t-il fluidifier notre chaîne ?REX Le kanban va-t-il fluidifier notre chaîne ?
REX Le kanban va-t-il fluidifier notre chaîne ?
 
AF2013 Mais pourquoi y m'écoute pas ?
AF2013 Mais pourquoi y m'écoute pas ?AF2013 Mais pourquoi y m'écoute pas ?
AF2013 Mais pourquoi y m'écoute pas ?
 
Af2012 abaisser les_barrieres
Af2012 abaisser les_barrieresAf2012 abaisser les_barrieres
Af2012 abaisser les_barrieres
 
[Kit agile] Jeu Garderie Toutou
[Kit agile] Jeu Garderie Toutou[Kit agile] Jeu Garderie Toutou
[Kit agile] Jeu Garderie Toutou
 
[Kit agile] Jeu Agiville
[Kit agile] Jeu Agiville[Kit agile] Jeu Agiville
[Kit agile] Jeu Agiville
 
[Kit agile] Jeu sur les principes scrum
[Kit agile] Jeu sur les principes scrum[Kit agile] Jeu sur les principes scrum
[Kit agile] Jeu sur les principes scrum
 
[Kit agile] Jeu sur la microgestion
[Kit agile] Jeu sur la microgestion[Kit agile] Jeu sur la microgestion
[Kit agile] Jeu sur la microgestion
 
[Kit agile] Jeu sur le Backlog
[Kit agile] Jeu sur le Backlog[Kit agile] Jeu sur le Backlog
[Kit agile] Jeu sur le Backlog
 
[Kit agile] Formation scrum (explications jeux et points marquants)
[Kit agile] Formation scrum (explications jeux et points marquants)[Kit agile] Formation scrum (explications jeux et points marquants)
[Kit agile] Formation scrum (explications jeux et points marquants)
 
Backlog "Introduction à Scrum par la pratique"
Backlog "Introduction à Scrum par la pratique"Backlog "Introduction à Scrum par la pratique"
Backlog "Introduction à Scrum par la pratique"
 
Introduction à Scrum Par La Pratique
Introduction à Scrum Par La PratiqueIntroduction à Scrum Par La Pratique
Introduction à Scrum Par La Pratique
 

Comment écrire du code testable ?

  • 1. Comment écrire du code testable Conférence Agile France 2010 Florence CHABANOIS
  • 2.  
  • 3.  
  • 4. Frein ? Direction assistée? Boite de vitesse ? Pneus défectueux ?
  • 5.  
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.  
  • 12. Symptômes d’un code intestable Isolabilité Simplicité Classes hyperactives Méthodes chargées Interroger des collaborateurs Etats globaux Annuaires Blocs statiques Instanciation directe Constructeur cher Mélanger service et valeur Héritage
  • 14.  
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 32.
  • 33.
  • 34. Principe de responsabilité unique Etudes Fournisseur Bureautique
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49. Des dynasties de classes ?
  • 50.  
  • 51.
  • 52.
  • 53.  
  • 54.  
  • 55.
  • 56.
  • 57.
  • 58.  
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67. Je dev Je dev Je dev Je dev Je dev Je dev Je dev Je dev Mon code Il dev Il dev Il dev COMMIT Il dev Il dev Il dev Il dev Il dev COMMIT Son code
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 80.
  • 81.  
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107. Opération générerFacture entrée sortie Facilement instanciable Getter/Setter Avec un état Objet valeur Est Objet service Fait
  • 108.
  • 109.
  • 110. Service Valeur Service Valeur Service
  • 111. Symptômes d’un code intestable Isolabilité Simplicité Classes hyperactives Méthodes chargées Interroger des collaborateurs Etats globaux Annuaires Blocs statiques Instanciation directe Constructeur cher Mélanger service et valeur Héritage
  • 112. Vers du code testable Isolabilité Simplicité Passer les objets utilisés Directement en paramètre Pas de longues initialisations Injecter les dépendances Injecter les dépendances Injecter les dépendances Injecter les dépendances Donner des veines pour les mocks Limiter dépendances directes Supprimer les singletons, static et annuaires Petites classes 1 scénario = 1 test Séparer les responsabilités Composition plutôt Qu’héritage 1 classe = 1 responsabilité Petites méthodes Polymorphisme
  • 113.
  • 114.

Notes de l'éditeur

  1. On va commencer par un petit sondage En fait je veux dire unitaire Qui fait systématiquement des tests? Qui essaie toujours? Quels problemes? Des tests qui marchent tout seul et pas en groupe, au moment de la release. Des NPE à ajouter partout;
  2. http://www.internetkids.fr/public/plus-belle-plage.jpg
  3. http://www.thau-agglo.fr/IMG/jpg/13_Une_partie_de_Beach_Volley_x700_.jpg
  4. http://bichett01.skyrock.com/photo.html?id_article=1242496956&rev=0
  5. http://img.turbo.fr/02665474-photo-pieces-detachees-accessoires.jpg .. un pb et plusieurs causes possibles .. Unité avec branchement pour permettre tester isolément .. Et des cas d’erreurs (introduction de fakes)  voyants qui doivent apparaitre
  6. Qu’est ce qu’on y gagne? Satisfaction : on sait que ça marche Qd pb, on peut innocenter le code Specs Rassure, confiance pour remanier le code Il faut des branchements
  7. On ne veut pas d’effets de bord. Savoir d’où vient un pb. … donner des veines / des branchements l’intérieur d’un PC … exemple d’une boite noir : - un truc soudé - une freebox
  8. Given : carburant + huile moteur + batterie ok When : tourne la clef Then : démarrage du moteur
  9. Ok en théorie mais concrètement, comment reconnaître le loup? Savoir, mais c pas si evident de le reconnaître. L’idée c’est aussi de savoir reconnaître les signes d’un code intestable. Ce qui fait qu’on sait qu’un loup et un loup, meme s’il est déguisé en mere grand.
  10. Pour le premier symptome
  11. IO + boucle Lenteur à trimballer pour tous les cas de test
  12. Graphe d’objets / logique métier Dico : obtenir les définitions Factory : construire la référence des définitions
  13. Développer des logiciels Installer des logiciels et du matériel Fournir du matériel
  14. Développer des logiciels Installer des logiciels et du matériel Fournir du matériel
  15. Mélane logique métier + création du graphe d’objets
  16. Du coup quand on voit que DANS demarrer, on construit des objets, qq chose cloche
  17. Objet valeur ne coute pas à etre instancier.
  18. Mais dépendant du framework Un peu bourrin : toutes les instances sont mockées Peu répandu
  19. Le meme genre de probleme
  20. Impossible de simuler un autre comportement Impossible de changer son état une fois que c’est initialisé => Certains tests peuvent marcher
  21. Le meme genre de probleme
  22. L’héritage est une bonne idée mais il est souvent mal utilisé Un lion court comment? … à quatre pattes Souris aussi Donc j’en hérite – un peu extrême car ce n’est pas un « est »
  23. Toutes les sous classes sont fortement couplées aux implémentations de leur classe mère Des fois ça ne se justifie pas Des fois oui, mais ca rend les choses trop compliquées à tester. Est-ce que ça vaut le coup? seDeplacer manger
  24. - fragile aux modifications de la classe mere - potentiellement lent - pas la main sur le comportement hérité : on peut pas lui en simuler un autre
  25. - 5e symptome qui empeche le code d'etre isolable
  26. Les etats globaux sont un véritable fléau, alors pour eux, on va prendre un exemple un peu plus long.
  27. - tiers de la prez, c'est l'heure de prendre un café - "je vous propose de prendre un café"
  28. BDD pas completement initialisé
  29. Robinet est fermé par défaut.
  30. Ouf… mais il a quand meme fallu tatonné pour pouvoir tout initialisé. Autant de dépendances cachées.
  31. Débogage difficile Si oubli de réinitialiser l’état à la fin Pas de tests en parallèle Chaque test doit commencer avec un état présumé pour fonctionner. Mais cela peut avoir été modifié par un autre test. Impossible de lancer les tests en parallèle => + long Débogage difficile
  32. Un seul singleton = 100 valeurs partagées
  33. Mais modification du code de production pour le test… très intrusif. Violation de l’encapsulation. Et plus tard on croit que c’est pour la prod => jamais nettoyé. Meme si on spécifie que c’est pour les tests, on peut oublier de resetter l’état à la fin et perturber un autre test. Non unitaire Très difficile à déboguer Les tests s’impactent les uns les autres
  34. Static = classes manquantes. Identifier les différentes responsabilités et en extraire des classes.
  35. Le meme genre de probleme
  36. nous ne savons pas ce qu'il faut réellement mocker avant d'avoir lancé le code, bien qu'on puisse le soupçonner en regardant les attributs de la classe ; il est difficile de connaître les dépendances cachées de la classe ; si l'on ajoute une dépendance à la classe, cela ne se verra pas clairement à cause du Locator. Le code compilera toujours, certains tests passeront, d'autres pas ; pour avoir une House, nous avons besoin de manipuler un Locator dans le test. Cependant, ce dernier a aussi connaissance d'autres services, qu'il faut aussi créer. De fil en aiguille, c'est une application entière qu'il faut construire pour les tests... il faut rendre le Locator compatible avec nos tests en créant une interface spécifique, en le surchargeant, en le mockant ou en rajoutant des setters pour pouvoir y injecter nos dépendances ; ils mélangent la construction des objets avec les lookup d'objets.
  37. - on aborde maintenant des symptomes, qui sans etre intestables sont genantes.
  38. Le meme genre de probleme
  39. Est-ce qu’il vaut mieux acheter au producteur ou à un intermédiaire? Pourquoi? Plus direct Moins cher
  40. Violation du SRP (collaborateur qui sert de service locator)  Meme mensonge
  41. Violation du SRP (collaborateur qui sert de service locator) Pourquoi c’est mal Tromperie : on a besoin « Utilisateur et Commande » Il faut regarder dans le code Débogage complexifié : D’où vient telle exception? Gâchis et moins de lisibilité En se trainant cet objet qu’on n’utilise pas Couplage fort avec l’objet intermédiaire Difficile à enlever plus tard Une modification peut avoir beaucoup d’impacts Du côté des tests : Laborieux : on passe le context et corrige les NPE découvert au fur et à mesure Phase d’initialisation du test complexifiée Test fortement couplé à l’implémentation avec l’intermédiaire
  42. Fausse bonne idée car Induit en erreur car on croit réellement qu’on a juste besoin de « context ». Pour écrire le test, il faut corriger les NPE au fur et à mesure, à l’aveugle. Pas si flexible qu’on croit car on peut pas refactorer facilement. On ne sait pas quels sont les collab nécessaires juste en regardant l’API. On ne comprend pas les enjeux du code facilement du coup.
  43. Fausse bonne idée car Induit en erreur car on croit réellement qu’on a juste besoin de « context ». Pour écrire le test, il faut corriger les NPE au fur et à mesure, à l’aveugle. Pas si flexible qu’on croit car on peut pas refactorer facilement. On ne sait pas quels sont les collab nécessaires juste en regardant l’API. On ne comprend pas les enjeux du code facilement du coup.
  44. Le meme genre de probleme
  45. - lisibilité de la classe (ca revient à avoir un grand main et tout dedans, une appli en C) - enlever "test plus complexe" et remonter "lisibilité" et "maintenabilité" Pour chaque modif, ce sera elle à modifier Debogage : si beaucoup d
  46. Très très fréquent
  47. Méthode statique : méthode à qui il manque une classe
  48. Méthode statique : méthode à qui il manque une classe
  49. Méthode statique : méthode à qui il manque une classe
  50. - si condition 1 rempli, si 1 et 2, si 2 et 3, si 1 et 3 => false. Tests peu robuste aux changements.
  51. S’il y a plusieurs chemins d’exécutions possibles et que c’est confus Design pattern stratégies Vérification d’objets NULL
  52. Design pattern stratégies Surtout si if redondants
  53. Pour chaque des conditions, on verifie que facturer et appeler et que true est retourné
  54. Le meme genre de probleme
  55. GenererFacture Pour vérifier qu’un service marche
  56. Ont des données Font des choses
  57. Savoir, mais c pas si evident de le reconnaître. L’idée c’est aussi de savoir reconnaître les signes d’un code intestable. Ce qui fait qu’on sait qu’un loup et un loup, meme s’il est déguisé en mere grand.
  58. Exceptions Si l’objet global est une constante / immutable Et ses attributs transitifs aussi Ok si primitif, attention si objet (ça peut changer) Si l’information ne va que dans un sens Logger
  59. Pour les méthodes et classes longues