SlideShare a Scribd company logo
1 of 33
Comment rendre testable du code qui ne l’est pas ? 
Christophe HERAL 
@ChrisHeral 
Neotech Solutions - Bordeaux
Qui suis-je ? 
• Consultant .NET à Bordeaux 
• Agiliste 
Et surtout : 
• Artisan logiciel
Une attention continue à l'excellence 
technique et à une bonne conception 
renforce l’Agilité. 
Les meilleures architectures, 
spécifications et conceptions 
émergent d'équipes auto-organisées.
Code existant 
Méconnaissance des méthodes d’ingénierie 
Fortement couplé / trop de responsabilités 
Sans tests -> Difficilement testable 
Architecture classique en couches
Les choses à ne pas faire : STUPID 
Singleton 
Tight Coupling 
Untestable 
Premature Optimization 
Indescriptive Naming 
Duplication
Clean Code 
Définition : 
1. Passe tous les tests 
2. N’est pas redondant 
3. Exprime clairement les intentions du programmeur 
4. Minimise le nombre d’entités (classes et méthodes) 
“Writing code that a computer can understand is 
science, but writing code another programmer can 
understand is an art” - Jason Gorman
Clean Code – Comment y parvenir 
TDD 
Principes SOLID 
KISS / YAGNI / DRY 
Règle du boy-scout : « Toujours laisser le code plus 
propre que vous ne l’avez trouvé en arrivant. »
SOLID : 5 principes de base 
Principes d’architecture logicielle en programmation orientée objet 
Objectif : permettre un développement plus fiable et plus robuste 
S Responsabilité unique 
(Single responsibility principle) 
O Ouvert/fermé 
(Open/closed principle) 
L Substitution de Liskov 
(Liskov Substitution Principle) 
I Ségrégation des interfaces 
(Interface Segregation Principle) 
D Inversion des dépendances 
(Dependency Inversion Principle)
SRP - Single Responsability Principle 
(Responsabilité unique) 
« Si une classe a plus d'une responsabilité, alors 
ces responsabilités deviennent couplées. (…) » 
- Robert C. Martin
SRP - Avant
SRP - Après
OCP – Open/Closed Principle 
(Ouvert/fermé) 
« Les modules qui se conforment au principe ouvert/fermé 
ont deux attributs principaux : 
1 - Ils sont "Ouverts pour l'extension". (...) 
2 - Ils sont "Fermés à la modification". (…) » 
- Robert C. Martin
OCP – Avant
OCP – Après
LSP – Liskov Substitution Principle 
(Substitution de Liskov) 
« Les sous-types doivent être remplaçables 
par leur type de base. » - Robert C. Martin
LSP – Avant
LSP – Après
ISP – Interface Segregation Principle 
(Séparation des interfaces) 
Les clients d'une entité logicielle ne doivent 
pas avoir à dépendre d'une interface qu'ils 
n'utilisent pas.
ISP – Avant
ISP – Après
DIP – Dependency Inversion Principle 
(Inversion des dépendances) 
Principe d’Hollywood : 
« Ne nous appelez pas, nous vous appellerons. » 
Dépendance 
A B 
A I 
Dépendance Implémente 
B
DIP – Avant
DIP – Après
SOLID en 5 images
Soyez indépendants ! 
Ne pas dépendre d’un service / une API externe 
Ne pas dépendre d’une base de données 
Ne pas dépendre de données de production 
Ne pas dépendre du jour et de l’heure
Simuler des dépendances 
Isolation = Fondamental 
Rend le test véritablement unitaire 
SUT 
Dépendance 
Doublure 
Interface 
On simule 
= 
l’implémentation attendue 
Automatisation avec un framework de mocking (ex : Moq)
Code écrit par Kévin remasterisé
DRY – Don’t Repeat Yourself 
« Dans un système, toute connaissance doit avoir une 
représentation unique, non-ambiguë, faisant autorité. » 
- Andy Hunt et Dave Thomas (The Pragmatic Programmer)
Composition over inheritance 
• « Is a » VS « Has a » 
• Meilleure testabilité 
• Casse l’encapsulation 
• Nécessaire pour l’application de certains patterns
Code Smells (« Odeurs du code ») 
• Méthodes longues / Grosses classes 
• Longue liste de paramètres 
• Utilisation de switch 
• GOTO / Codes de retour d’erreur 
• Noms de méthodes avec ET/OU 
• Code dupliqué 
• Code mort 
• Navigation transitive 
• Nombres magiques 
• Généralité spéculative 
• Commentaires 
• Séparation verticale 
• Chirurgie avec fusil à pompe 
• Héritage parallèle
Repérer les Code Smells 
• Relecture de code 
-> Pair Programming 
-> « Clean Code Cheat Sheet » de Urs Enzler 
• Analyse statique de code 
-> Repère des erreurs de conception / programmation 
-> Outils : FxCop, StyleCop, Resharper, NDepend
Pour aller plus loin…
Merci !

More Related Content

Similar to [Agile Tour Paris 2014] Comment rendre testable du code qui ne l'est pas ?

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
 
AgileTour Toulouse 2012 : clean code en pratique
AgileTour Toulouse 2012 : clean code en pratiqueAgileTour Toulouse 2012 : clean code en pratique
AgileTour Toulouse 2012 : clean code en pratique
Agile Toulouse
 
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
French Scrum User Group
 
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Normandie Web Xperts
 

Similar to [Agile Tour Paris 2014] Comment rendre testable du code qui ne l'est pas ? (20)

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...
 
Une architecture agile et testable
Une architecture agile et testableUne architecture agile et testable
Une architecture agile et testable
 
AgileTour Toulouse 2012 : clean code en pratique
AgileTour Toulouse 2012 : clean code en pratiqueAgileTour Toulouse 2012 : clean code en pratique
AgileTour Toulouse 2012 : clean code en pratique
 
Clean code en pratique
Clean code en pratiqueClean code en pratique
Clean code en pratique
 
Design Patterns Java
Design Patterns JavaDesign Patterns Java
Design Patterns Java
 
4-Cours de Géniel Logiciel
4-Cours de Géniel Logiciel4-Cours de Géniel Logiciel
4-Cours de Géniel Logiciel
 
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
 
Une application sans framework en 2019
Une application sans framework en 2019Une application sans framework en 2019
Une application sans framework en 2019
 
OOP and Design Patterns
OOP and Design PatternsOOP and Design Patterns
OOP and Design Patterns
 
OOP & Design Pattern - Algiers Developers Meetup August 2015
OOP & Design Pattern - Algiers Developers Meetup August 2015OOP & Design Pattern - Algiers Developers Meetup August 2015
OOP & Design Pattern - Algiers Developers Meetup August 2015
 
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
 
20070925 04 - Panorama des outils Open Source / Qualité des développements
20070925 04 - Panorama des outils Open Source / Qualité des développements20070925 04 - Panorama des outils Open Source / Qualité des développements
20070925 04 - Panorama des outils Open Source / Qualité des développements
 
Test Driven Development (aka TDD) for agile teams
Test Driven Development (aka TDD) for agile teamsTest Driven Development (aka TDD) for agile teams
Test Driven Development (aka TDD) for agile teams
 
Paris Chaos Engineering Meetup #6
Paris Chaos Engineering Meetup #6Paris Chaos Engineering Meetup #6
Paris Chaos Engineering Meetup #6
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
 
Cours 1 les principes de base
Cours 1 les principes de baseCours 1 les principes de base
Cours 1 les principes de base
 
Les Code Reviews : le guide de survie
Les Code Reviews : le guide de survieLes Code Reviews : le guide de survie
Les Code Reviews : le guide de survie
 
Pratiques de développement pour équipes Agile
Pratiques de développement pour équipes AgilePratiques de développement pour équipes Agile
Pratiques de développement pour équipes Agile
 
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
 
Ecrire un code Testable
Ecrire un code TestableEcrire un code Testable
Ecrire un code Testable
 

More from Christophe HERAL (6)

[Agile Tour Toulouse 2016] Développeur après 30 ans, n'as-tu donc aucune ambi...
[Agile Tour Toulouse 2016] Développeur après 30 ans, n'as-tu donc aucune ambi...[Agile Tour Toulouse 2016] Développeur après 30 ans, n'as-tu donc aucune ambi...
[Agile Tour Toulouse 2016] Développeur après 30 ans, n'as-tu donc aucune ambi...
 
L’art d’avoir tort
L’art d’avoir tortL’art d’avoir tort
L’art d’avoir tort
 
[Techdays Tour 2015] Améliorez la qualité de votre code avec Roslyn !
[Techdays Tour 2015] Améliorez la qualité de votre code avec Roslyn ![Techdays Tour 2015] Améliorez la qualité de votre code avec Roslyn !
[Techdays Tour 2015] Améliorez la qualité de votre code avec Roslyn !
 
Scrum Day 2013 - L'agilité selon Starcraft 2
Scrum Day 2013 - L'agilité selon Starcraft 2Scrum Day 2013 - L'agilité selon Starcraft 2
Scrum Day 2013 - L'agilité selon Starcraft 2
 
TFS 2012 : un pas vers l'agilité... en avant ou en arrière ?
TFS 2012 : un pas vers l'agilité... en avant ou en arrière ? TFS 2012 : un pas vers l'agilité... en avant ou en arrière ?
TFS 2012 : un pas vers l'agilité... en avant ou en arrière ?
 
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
 

[Agile Tour Paris 2014] Comment rendre testable du code qui ne l'est pas ?

  • 1. Comment rendre testable du code qui ne l’est pas ? Christophe HERAL @ChrisHeral Neotech Solutions - Bordeaux
  • 2. Qui suis-je ? • Consultant .NET à Bordeaux • Agiliste Et surtout : • Artisan logiciel
  • 3. Une attention continue à l'excellence technique et à une bonne conception renforce l’Agilité. Les meilleures architectures, spécifications et conceptions émergent d'équipes auto-organisées.
  • 4. Code existant Méconnaissance des méthodes d’ingénierie Fortement couplé / trop de responsabilités Sans tests -> Difficilement testable Architecture classique en couches
  • 5. Les choses à ne pas faire : STUPID Singleton Tight Coupling Untestable Premature Optimization Indescriptive Naming Duplication
  • 6. Clean Code Définition : 1. Passe tous les tests 2. N’est pas redondant 3. Exprime clairement les intentions du programmeur 4. Minimise le nombre d’entités (classes et méthodes) “Writing code that a computer can understand is science, but writing code another programmer can understand is an art” - Jason Gorman
  • 7. Clean Code – Comment y parvenir TDD Principes SOLID KISS / YAGNI / DRY Règle du boy-scout : « Toujours laisser le code plus propre que vous ne l’avez trouvé en arrivant. »
  • 8. SOLID : 5 principes de base Principes d’architecture logicielle en programmation orientée objet Objectif : permettre un développement plus fiable et plus robuste S Responsabilité unique (Single responsibility principle) O Ouvert/fermé (Open/closed principle) L Substitution de Liskov (Liskov Substitution Principle) I Ségrégation des interfaces (Interface Segregation Principle) D Inversion des dépendances (Dependency Inversion Principle)
  • 9. SRP - Single Responsability Principle (Responsabilité unique) « Si une classe a plus d'une responsabilité, alors ces responsabilités deviennent couplées. (…) » - Robert C. Martin
  • 12. OCP – Open/Closed Principle (Ouvert/fermé) « Les modules qui se conforment au principe ouvert/fermé ont deux attributs principaux : 1 - Ils sont "Ouverts pour l'extension". (...) 2 - Ils sont "Fermés à la modification". (…) » - Robert C. Martin
  • 15. LSP – Liskov Substitution Principle (Substitution de Liskov) « Les sous-types doivent être remplaçables par leur type de base. » - Robert C. Martin
  • 18. ISP – Interface Segregation Principle (Séparation des interfaces) Les clients d'une entité logicielle ne doivent pas avoir à dépendre d'une interface qu'ils n'utilisent pas.
  • 21. DIP – Dependency Inversion Principle (Inversion des dépendances) Principe d’Hollywood : « Ne nous appelez pas, nous vous appellerons. » Dépendance A B A I Dépendance Implémente B
  • 24. SOLID en 5 images
  • 25. Soyez indépendants ! Ne pas dépendre d’un service / une API externe Ne pas dépendre d’une base de données Ne pas dépendre de données de production Ne pas dépendre du jour et de l’heure
  • 26. Simuler des dépendances Isolation = Fondamental Rend le test véritablement unitaire SUT Dépendance Doublure Interface On simule = l’implémentation attendue Automatisation avec un framework de mocking (ex : Moq)
  • 27. Code écrit par Kévin remasterisé
  • 28. DRY – Don’t Repeat Yourself « Dans un système, toute connaissance doit avoir une représentation unique, non-ambiguë, faisant autorité. » - Andy Hunt et Dave Thomas (The Pragmatic Programmer)
  • 29. Composition over inheritance • « Is a » VS « Has a » • Meilleure testabilité • Casse l’encapsulation • Nécessaire pour l’application de certains patterns
  • 30. Code Smells (« Odeurs du code ») • Méthodes longues / Grosses classes • Longue liste de paramètres • Utilisation de switch • GOTO / Codes de retour d’erreur • Noms de méthodes avec ET/OU • Code dupliqué • Code mort • Navigation transitive • Nombres magiques • Généralité spéculative • Commentaires • Séparation verticale • Chirurgie avec fusil à pompe • Héritage parallèle
  • 31. Repérer les Code Smells • Relecture de code -> Pair Programming -> « Clean Code Cheat Sheet » de Urs Enzler • Analyse statique de code -> Repère des erreurs de conception / programmation -> Outils : FxCop, StyleCop, Resharper, NDepend
  • 32. Pour aller plus loin…

Editor's Notes

  1. www.agiletour.org
  2. Présentation orientée Software Craftsmanship Valable quelque soit la techno utilisée. Démos effectuées dans les technos .NET (C#, NUnit, Moq, …).
  3. Méconnaissance des méthodes d’ingénierie Fortement couplé / trop de responsabilités Sans tests -> Difficilement testable Architecture classique en couches
  4. Méthodes statiques / singletons / instanciations directes Fort couplage entre classes / dépendances Remplacement systématique de la duplication par de l’héritage Classes avec trop de responsabilités Mélange de l’IHM avec la logique métier
  5. TDD Utilisation d’interfaces Principes SOLID KISS / YAGNI / DRY Design Patterns Détection de Code Smells
  6. Principes d’architecture logicielle en programmation orientée objet Objectif : permettre un développement plus fiable et plus robuste Diminuer le couplage Favoriser l’encapsulation
  7. « Si une classe a plus d'une responsabilité, alors ces responsabilités deviennent couplées. Des modifications apportées à l'une des responsabilités peuvent porter atteinte ou inhiber la capacité de la classe de remplir les autres. Ce genre de couplage amène à des architectures fragiles qui dysfonctionnent de façon inattendues lorsqu'elles sont modifiées. » - Robert C. Martin
  8. « Les modules qui se conforment au principe ouvert/fermé ont deux attributs principaux : 1 - Ils sont "Ouverts pour l'extension". Cela signifie que le comportement du module peut être étendu, que l'on peut faire se comporter ce module de façons nouvelles et différentes si les exigences de l'application sont modifiées, ou pour remplir les besoins d'une autre application. 2 - Ils sont "Fermés à la modification". Le code source d'un tel module ne peut pas être modifié. Personne n'est autorisé à y apporter des modifications. » - Robert C. Martin
  9. Préférer plusieurs interfaces spécifiques pour chaque client plutôt qu'une seule interface générale.
  10. Les modules de haut niveau ne doivent pas dépendre des modules de bas niveau. Les deux doivent dépendre d'abstractions. Les abstractions ne doivent pas dépendre des détails. Les détails doivent dépendre des abstractions. Représentation de l’inversion de contrôle
  11. Injection par constructeur. Configuration par code. Librairie légère, facile d’utilisation et rapide. Ex : SimpleInjector
  12. Injection par constructeur. Configuration par code. Librairie légère, facile d’utilisation et rapide. Ex : SimpleInjector
  13. Les modifications de code n’ont pas à être à impacter à différents endroits. Essence même de l’utilisation des fonctions et des méthodes.
  14. Sous-jacent au principe de substitution de Liskov Meilleure testabilité : Mock possible sur la dépendance, pas sur les méthodes dont on dérive Casse l’encapsulation: Le comportement des classes dérivées peut être cassé par une modification de la classe de base Nécessaire pour l’application de certains patterns (Strategy, Decorator) Pas d’héritage multiple « Is a » VS « Has a »
  15. Différents types Analyse des binaires Analyse du code source