SlideShare une entreprise Scribd logo
1  sur  64
Télécharger pour lire hors ligne
&
FÉLIX-ANTOINE
BOURBONNAIS
B.ING., M.SC, PSM
Agile tour Québec 2016
Tests de caractérisation :
à l’assaut de votre
code « Legacy » patrimonial
PASCAL ROY
ING., CSM, PSM, PMP
Nous voulons vous introduire aux tests de
caractérisation, un concept et un outil essentiel
pour les développeurs qui travaillent dans du code
patrimonial
Pourquoi cette présentation ?
4 4
Qui sommes-nous ?
Pascal Roy
Ing., PSM, CSM, PMP
Félix-Antoine Bourbonnais
B.ing., PSM, M.Sc.
5
Conférenciers
Formateurs
Mentors
Tech.
ÉQUIPE
GestionTDD
Architecture
évolutive
Essais
automatisés
DDD
…
Scrum
QA Agile
Gestion de
projets
Agilité
BDD
> Nous sommes
Conseils
stratégiques
> Spécialités
LE CODE PATRIMONIAL
Selon vous…
Qu’est ce que du code
patrimonial (« Legacy Code »)?
• Du code écrit par d’autres
• Du code que plus personne ne veut toucher
• Du code qui n’est plus supporté par ceux qui l’ont écrit
• Du code qui pourrait être réécrit en utilisant de meilleures
pratiques de code, d’outils ou de langages
• ...
Quelques définitions possibles…
Du code sans tests
Michael Feathers,
Working Effectively with Legacy Code
C’est du code difficile à
faire évoluer.
Peu importe
son âge ou la raison.
En gros…
11
La peur : le pire ennemi du
développement logiciel
Deux grandes approches…
13
Tanné de stresser pour une
livraison, de débogger,
d’avoir peur de briser?
14 14
S.v.p. donnez-moi un
nouveau projet
!@/$%!/%
Les tests sont essentiels pour
maintenir une vélocité!
Oups…
COMMENT S’ATTAQUER AU CODE PATRIMONIAL?
Le paradoxe des tests et du ré-usinage…
Bien outillé, vous pouvez rénover !
Vos options
Vos options
Vous avez 2 choix…
Une dépense
Big Bang
Risque très élevé
Pas de nouvelle valeur
Paiements accélérés
Étape par étape
Risque moindre
Produit de la valeur
Rebâtir de zéro Rénover / revitaliser
Pourquoi les gestionnaires ne
veulent pas vous laisser faire
votre “refactoring” ?!?
C’est un trou noir...!
S’attaquer au coût du changement en
ramenant le système dans un état stable
et en le maintenant dans cet état par la suite !
Le but de la rénovation?
Graduellement,
tout en produisant
de la valeur
Comment ?
Sélectionnez votre prochaine « Story » et
commencez vos paiements de dette!
Comment?
LE TEST DE CARACTÉRISATION
Un outil important pour vous
permettre de rénover votre
code patrimonial
Le test de caractérisation…
30
Un test de caractérisation est une
description du comportement
actuel d’un bout de code.
- Michael Feathers
Définition : Test de caractérisation
Il permet de protéger le comportement existant
contre toute modification non désirée.
C’est notre briseur de peur!
Et par la suite…
LA STRATÉGIE DE RÉ-USINAGE UTILISANT LES TESTS DE
CARACTÉRISATION
1. Identifier un point de changement
2. Trouver les points de tests (« seam »)
3. Briser les dépendances pour pouvoir tester
4. Écrire les tests de caractérisation
5. Faire le changement + ré-usiner
Les 5 grandes étapes
On peut toujours améliorer le code patrimonial…
Attention de focaliser sur notre but:
entourer de tests et faire le minimum
Une prise en charge dans une urgence:
on veut limiter les dommages
et on focalise sur l’objectif le plus pressant
(ex.: briser les dépendances, caractériser …)
Le « Legacy code », c’est comme…
Le changement à faire !
Quel est l’objectif ?
Qu’est-ce qui nous guide?
Attention de ne pas
arrêter la chaîne de
production de valeur!
Attention au Big Bang !
38
ÉCRITURE D’UN TEST DE CARACTÉRISATION
1. Identifier et isoler un bout de code et le rendre accessible
dans un harnais de tests
2. Écrire une assertion qui ne passe pas
3. Exécuter le test et le laisser vous dire quel est le
comportement actuel
4. Changer votre assertion pour tenir compte du comportement
actuel
5. Répéter…
La mécanique d’écriture d’un test de caractérisation
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
public double calculate(double tSales) {
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR + (tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1 +
(tSales - BQ * 2) * BCR * OQM2;
}
}
}
http://s3.amazonaws.com/giles/demons_010609/wtfm.jpg
Un exemple simple de code patrimonial?
WTF?
WTF?
WTF?
Étape 1: identifier un bout de code et le rendre accessible
dans un harnais de tests
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
public double calculate(double tSales){
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1 +
(tSales - BQ * 2) * BCR * OQM2;
}
}
}
@Test
public void test… {
assert(...)
}
1
?
2
? ?
1
2
Étape 2: écrire une assertion qui ne passe pas
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
double calculate(double tSales) {
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1+
(tSales - BQ*2)*BCR * OQM2;
}
}
}
@Test
public void testCalculate() {
assertEquals(
0.0,
SalesUtil.calculate(1000.0)
);
}
1
?
2
? ?
1
2
Étape 3: exécuter le test
+ trouver le comportement actuel
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
double calculate(double tSales) {
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1 +
(tSales - BQ * 2) * BCR * OQM2;
}
}
}
@Test
public void testCalculate() {
assertEquals(
0.0,
SalesUtil.calculate(1000.0)
);
}
> junit.framework.AssertionFailedError:
expected:<0.0> but was:<200.0>1
?
2
? ?
1
2
Étape 4: Remplacer par le comportement découvert
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
double calculate(double tSales) {
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1+
(tSales – BQ*2)*BCR * OQM2;
}
}
}
@Test
public void testCalculate2() {
assertEquals(
200.0,
SalesUtil.calculate(1000.0)
);
}
1
200.0
2
? ?
1
2
Étape 5: Répéter
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
double calculate(double tSales) {
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR*OQM1+
(tSales – BQ*2) * BCR*OQM2;
}
}
}
…
@Test
public void testCalculate() {
assertEquals(
0.0,
SalesUtil.calculate(2000.0)
);
}
1
200.0
2
? ?
1
2
Attention aux « tant qu’à y être » !
Ciblez uniquement ce que vous voulez modifier.
On n’a pas le temps
de faire ça ?!?
Combien de temps ça
prend pour comprendre
un bout de code Legacy
avant de le modifier?
Réponse…
PARTICULARITÉS
D’UN TEST DE CARACTÉRISATION
En quoi un TC est-il différent?
Objectif
Spécification du
comportement requis
Spécification du
comportement actuel
Régulier Caractérisation
En quoi un TC est-il différent?
Contexte d’utilisation
Comportement connu
et nouveau code
Code patrimonial,
comportement flou ou
perdu
Régulier Caractérisation
En quoi un TC est-il différent?
Durée de vie
Permanent Temporaire
Régulier Caractérisation
Quel niveau ?
Est-ce que d’entourer mon
application avec des tests bout-
en-bout peut m’aider à
caractériser ?
Le nouveau code doit être testé et écrit avec les
meilleures pratiques… n’ajoutez pas encore plus de
patrimoine douteux !
Avertissement !
58
Le défi moderne…
La maintenabilité !
59
60
La pourriture du code n’est pas
une « loi naturelle »…
Although our first joy of programming
may have been intense, the misery of
dealing with legacy code is often
sufficient to extinguish that flame.
Michael Feathers,
Working Effectively with Legacy Code
Le code patrimonial tue la flamme!
Image de http://beinweb.fr/wp-content/uploads/2014/04/boite-a-outils-entrepreneurs.jpg
Le test de caractérisation…
À ajouter dans votre boîte à outils!
La « patrimonialite »
ça se soigne !
Merci .
65
Merci
Notre site
elapsetech.com
Notre blogue
developpementagile.com
Nos Twitter
@fbourbonnais | @elapsetech
Nos courriels
fbourbonnais@elapsetech.com
pascalroy@elapsetech.com
Nos LinkedIn
linkedin.com/in/fbourbonnais/fr
ca.linkedin.com/in/roypa
conferences.elapsetech.com
Diapositives
Nos présentations, chez vous!

Contenu connexe

En vedette

Cine y literatura el problema del espacio
Cine y literatura el problema del espacioCine y literatura el problema del espacio
Cine y literatura el problema del espacio
Roberto Córdoba
 
Programa de formación continua rochester
Programa de formación continua rochesterPrograma de formación continua rochester
Programa de formación continua rochester
Galoppo
 
Compren lujoyglamour.net
Compren lujoyglamour.netCompren lujoyglamour.net
Compren lujoyglamour.net
Juan J. Merelo
 
BEYROUTH ENFER ESTHETIQUE, ET ENCORE
BEYROUTH ENFER ESTHETIQUE, ET ENCOREBEYROUTH ENFER ESTHETIQUE, ET ENCORE
BEYROUTH ENFER ESTHETIQUE, ET ENCORE
Layal Yacoub
 
Pre mínima Varones
Pre mínima VaronesPre mínima Varones
Pre mínima Varones
Juan 23
 
El paisaje de españa y andalucia en los viajeros romanticos
El paisaje de españa y andalucia en los viajeros romanticosEl paisaje de españa y andalucia en los viajeros romanticos
El paisaje de españa y andalucia en los viajeros romanticos
Roberto Córdoba
 
Presentación
PresentaciónPresentación
Presentación
Laaurita
 
Zona contigua copy
Zona contigua copyZona contigua copy
Zona contigua copy
Elena Tapias
 
Conociendo a los nuevos autores
Conociendo a los nuevos autoresConociendo a los nuevos autores
Conociendo a los nuevos autores
wilderfabio
 

En vedette (20)

Cine y literatura el problema del espacio
Cine y literatura el problema del espacioCine y literatura el problema del espacio
Cine y literatura el problema del espacio
 
Grupo 12 Selección del Método y Trabajo de Investigación
Grupo 12 Selección del Método y Trabajo de InvestigaciónGrupo 12 Selección del Método y Trabajo de Investigación
Grupo 12 Selección del Método y Trabajo de Investigación
 
Amarilla nicolas energia
Amarilla nicolas energiaAmarilla nicolas energia
Amarilla nicolas energia
 
Programa de formación continua rochester
Programa de formación continua rochesterPrograma de formación continua rochester
Programa de formación continua rochester
 
Blog formationinnovation.net
Blog formationinnovation.netBlog formationinnovation.net
Blog formationinnovation.net
 
Compren lujoyglamour.net
Compren lujoyglamour.netCompren lujoyglamour.net
Compren lujoyglamour.net
 
BEYROUTH ENFER ESTHETIQUE, ET ENCORE
BEYROUTH ENFER ESTHETIQUE, ET ENCOREBEYROUTH ENFER ESTHETIQUE, ET ENCORE
BEYROUTH ENFER ESTHETIQUE, ET ENCORE
 
Pre mínima Varones
Pre mínima VaronesPre mínima Varones
Pre mínima Varones
 
Dossier clientes - Worcy
Dossier clientes - WorcyDossier clientes - Worcy
Dossier clientes - Worcy
 
Tangram solicitud demostracion
Tangram solicitud demostracionTangram solicitud demostracion
Tangram solicitud demostracion
 
Kit media de Culture Cible 2016
Kit media de Culture Cible 2016Kit media de Culture Cible 2016
Kit media de Culture Cible 2016
 
Aprender por proyectos
Aprender por proyectosAprender por proyectos
Aprender por proyectos
 
El paisaje de españa y andalucia en los viajeros romanticos
El paisaje de españa y andalucia en los viajeros romanticosEl paisaje de españa y andalucia en los viajeros romanticos
El paisaje de españa y andalucia en los viajeros romanticos
 
Web 08 OFF - Fermiers d'a cote
Web 08 OFF - Fermiers d'a coteWeb 08 OFF - Fermiers d'a cote
Web 08 OFF - Fermiers d'a cote
 
Butterfly Comunicació
Butterfly ComunicacióButterfly Comunicació
Butterfly Comunicació
 
Presentación
PresentaciónPresentación
Presentación
 
Glosar
GlosarGlosar
Glosar
 
Zona contigua copy
Zona contigua copyZona contigua copy
Zona contigua copy
 
Constitución política
Constitución políticaConstitución política
Constitución política
 
Conociendo a los nuevos autores
Conociendo a los nuevos autoresConociendo a los nuevos autores
Conociendo a los nuevos autores
 

Similaire à À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine Bourbonnais, Pascal Roy

Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
cyrilgandon
 

Similaire à À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine Bourbonnais, Pascal Roy (20)

Pytong2015
Pytong2015Pytong2015
Pytong2015
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et Catalyst
 
Comment passer d'un POC en prod @ plusieurs milliards de rêquetes
Comment passer d'un POC en prod @ plusieurs milliards de rêquetesComment passer d'un POC en prod @ plusieurs milliards de rêquetes
Comment passer d'un POC en prod @ plusieurs milliards de rêquetes
 
Optimisations et Performances d'un POC en prod @ plusieurs milliards de requê...
Optimisations et Performances d'un POC en prod @ plusieurs milliards de requê...Optimisations et Performances d'un POC en prod @ plusieurs milliards de requê...
Optimisations et Performances d'un POC en prod @ plusieurs milliards de requê...
 
Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement Java
 
cours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhouminecours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhoumine
 
JSS2014 – Optimisation many-to-many SSAS
JSS2014 – Optimisation many-to-many SSASJSS2014 – Optimisation many-to-many SSAS
JSS2014 – Optimisation many-to-many SSAS
 
Présentation de jBPM 3.1
Présentation de jBPM 3.1Présentation de jBPM 3.1
Présentation de jBPM 3.1
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
20100121 01 - Présentation Renault
20100121 01 - Présentation Renault20100121 01 - Présentation Renault
20100121 01 - Présentation Renault
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
 
Tester du legacy code, mission impossible ?
Tester du legacy code, mission impossible ?Tester du legacy code, mission impossible ?
Tester du legacy code, mission impossible ?
 
Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1
 
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
 
Linq Tech Days08 Lux
Linq Tech Days08 LuxLinq Tech Days08 Lux
Linq Tech Days08 Lux
 
2024-01 - slides du meetup devops aix-marseille
2024-01 - slides du meetup devops aix-marseille2024-01 - slides du meetup devops aix-marseille
2024-01 - slides du meetup devops aix-marseille
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
 
Agilité et SharePoint: Incompatible? On gage que non!
Agilité et SharePoint: Incompatible? On gage que non!Agilité et SharePoint: Incompatible? On gage que non!
Agilité et SharePoint: Incompatible? On gage que non!
 
Le BDD est bien plus qu’une technique de test!
 Le BDD est bien plus qu’une technique de test! Le BDD est bien plus qu’une technique de test!
Le BDD est bien plus qu’une technique de test!
 
Gestion des index SQL : Soyez AWARE !
Gestion des index SQL : Soyez  AWARE !Gestion des index SQL : Soyez  AWARE !
Gestion des index SQL : Soyez AWARE !
 

Plus de Agile Montréal

Plus de Agile Montréal (20)

ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...
ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...
ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...
 
ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...
ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...
ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...
 
ATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander Dur
ATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander DurATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander Dur
ATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander Dur
 
ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...
ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...
ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...
 
ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...
ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...
ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...
 
ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...
ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...
ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...
 
ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...
ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...
ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...
 
ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...
ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...
ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...
 
ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...
ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...
ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...
 
ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...
ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...
ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...
 
ATMTL23 - Le Developer Experience au service de la livraison en continu par A...
ATMTL23 - Le Developer Experience au service de la livraison en continu par A...ATMTL23 - Le Developer Experience au service de la livraison en continu par A...
ATMTL23 - Le Developer Experience au service de la livraison en continu par A...
 
ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...
ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...
ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...
 
ATMTL23 - Atelier PNL pour ameliorer la communication par Remi Roche
ATMTL23 - Atelier PNL pour ameliorer la communication par Remi RocheATMTL23 - Atelier PNL pour ameliorer la communication par Remi Roche
ATMTL23 - Atelier PNL pour ameliorer la communication par Remi Roche
 
ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...
ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...
ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...
 
ATMTL23 - La collaboration intergénérationnelle au travail par Apolline Tissier
ATMTL23 - La collaboration intergénérationnelle au travail par Apolline  TissierATMTL23 - La collaboration intergénérationnelle au travail par Apolline  Tissier
ATMTL23 - La collaboration intergénérationnelle au travail par Apolline Tissier
 
ATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl Métivier
ATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl MétivierATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl Métivier
ATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl Métivier
 
ATMTL23 - Économie coopérative et agilité par Dominique Pothier
ATMTL23 - Économie coopérative et agilité par Dominique PothierATMTL23 - Économie coopérative et agilité par Dominique Pothier
ATMTL23 - Économie coopérative et agilité par Dominique Pothier
 
ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...
ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...
ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...
 
ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...
ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...
ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...
 
ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...
ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...
ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...
 

À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine Bourbonnais, Pascal Roy

  • 1. & FÉLIX-ANTOINE BOURBONNAIS B.ING., M.SC, PSM Agile tour Québec 2016 Tests de caractérisation : à l’assaut de votre code « Legacy » patrimonial PASCAL ROY ING., CSM, PSM, PMP
  • 2. Nous voulons vous introduire aux tests de caractérisation, un concept et un outil essentiel pour les développeurs qui travaillent dans du code patrimonial Pourquoi cette présentation ?
  • 3.
  • 4. 4 4 Qui sommes-nous ? Pascal Roy Ing., PSM, CSM, PMP Félix-Antoine Bourbonnais B.ing., PSM, M.Sc.
  • 7. Selon vous… Qu’est ce que du code patrimonial (« Legacy Code »)?
  • 8. • Du code écrit par d’autres • Du code que plus personne ne veut toucher • Du code qui n’est plus supporté par ceux qui l’ont écrit • Du code qui pourrait être réécrit en utilisant de meilleures pratiques de code, d’outils ou de langages • ... Quelques définitions possibles…
  • 9. Du code sans tests Michael Feathers, Working Effectively with Legacy Code
  • 10. C’est du code difficile à faire évoluer. Peu importe son âge ou la raison. En gros…
  • 11. 11 La peur : le pire ennemi du développement logiciel
  • 13. 13 Tanné de stresser pour une livraison, de débogger, d’avoir peur de briser?
  • 14. 14 14 S.v.p. donnez-moi un nouveau projet !@/$%!/%
  • 15. Les tests sont essentiels pour maintenir une vélocité!
  • 17. COMMENT S’ATTAQUER AU CODE PATRIMONIAL?
  • 18. Le paradoxe des tests et du ré-usinage…
  • 19. Bien outillé, vous pouvez rénover !
  • 22. Vous avez 2 choix… Une dépense Big Bang Risque très élevé Pas de nouvelle valeur Paiements accélérés Étape par étape Risque moindre Produit de la valeur Rebâtir de zéro Rénover / revitaliser
  • 23. Pourquoi les gestionnaires ne veulent pas vous laisser faire votre “refactoring” ?!?
  • 24. C’est un trou noir...!
  • 25. S’attaquer au coût du changement en ramenant le système dans un état stable et en le maintenant dans cet état par la suite ! Le but de la rénovation?
  • 27. Sélectionnez votre prochaine « Story » et commencez vos paiements de dette! Comment?
  • 28. LE TEST DE CARACTÉRISATION
  • 29. Un outil important pour vous permettre de rénover votre code patrimonial Le test de caractérisation…
  • 30. 30
  • 31. Un test de caractérisation est une description du comportement actuel d’un bout de code. - Michael Feathers Définition : Test de caractérisation
  • 32. Il permet de protéger le comportement existant contre toute modification non désirée. C’est notre briseur de peur! Et par la suite…
  • 33. LA STRATÉGIE DE RÉ-USINAGE UTILISANT LES TESTS DE CARACTÉRISATION
  • 34. 1. Identifier un point de changement 2. Trouver les points de tests (« seam ») 3. Briser les dépendances pour pouvoir tester 4. Écrire les tests de caractérisation 5. Faire le changement + ré-usiner Les 5 grandes étapes
  • 35. On peut toujours améliorer le code patrimonial… Attention de focaliser sur notre but: entourer de tests et faire le minimum
  • 36. Une prise en charge dans une urgence: on veut limiter les dommages et on focalise sur l’objectif le plus pressant (ex.: briser les dépendances, caractériser …) Le « Legacy code », c’est comme…
  • 37. Le changement à faire ! Quel est l’objectif ? Qu’est-ce qui nous guide?
  • 38. Attention de ne pas arrêter la chaîne de production de valeur! Attention au Big Bang ! 38
  • 39. ÉCRITURE D’UN TEST DE CARACTÉRISATION
  • 40. 1. Identifier et isoler un bout de code et le rendre accessible dans un harnais de tests 2. Écrire une assertion qui ne passe pas 3. Exécuter le test et le laisser vous dire quel est le comportement actuel 4. Changer votre assertion pour tenir compte du comportement actuel 5. Répéter… La mécanique d’écriture d’un test de caractérisation
  • 41. public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; public double calculate(double tSales) { if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1 + (tSales - BQ * 2) * BCR * OQM2; } } } http://s3.amazonaws.com/giles/demons_010609/wtfm.jpg Un exemple simple de code patrimonial? WTF? WTF? WTF?
  • 42. Étape 1: identifier un bout de code et le rendre accessible dans un harnais de tests public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; public double calculate(double tSales){ if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1 + (tSales - BQ * 2) * BCR * OQM2; } } } @Test public void test… { assert(...) } 1 ? 2 ? ? 1 2
  • 43. Étape 2: écrire une assertion qui ne passe pas public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; double calculate(double tSales) { if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1+ (tSales - BQ*2)*BCR * OQM2; } } } @Test public void testCalculate() { assertEquals( 0.0, SalesUtil.calculate(1000.0) ); } 1 ? 2 ? ? 1 2
  • 44. Étape 3: exécuter le test + trouver le comportement actuel public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; double calculate(double tSales) { if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1 + (tSales - BQ * 2) * BCR * OQM2; } } } @Test public void testCalculate() { assertEquals( 0.0, SalesUtil.calculate(1000.0) ); } > junit.framework.AssertionFailedError: expected:<0.0> but was:<200.0>1 ? 2 ? ? 1 2
  • 45. Étape 4: Remplacer par le comportement découvert public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; double calculate(double tSales) { if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1+ (tSales – BQ*2)*BCR * OQM2; } } } @Test public void testCalculate2() { assertEquals( 200.0, SalesUtil.calculate(1000.0) ); } 1 200.0 2 ? ? 1 2
  • 46. Étape 5: Répéter public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; double calculate(double tSales) { if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR*OQM1+ (tSales – BQ*2) * BCR*OQM2; } } } … @Test public void testCalculate() { assertEquals( 0.0, SalesUtil.calculate(2000.0) ); } 1 200.0 2 ? ? 1 2
  • 47. Attention aux « tant qu’à y être » ! Ciblez uniquement ce que vous voulez modifier.
  • 48.
  • 49. On n’a pas le temps de faire ça ?!?
  • 50. Combien de temps ça prend pour comprendre un bout de code Legacy avant de le modifier? Réponse…
  • 51. PARTICULARITÉS D’UN TEST DE CARACTÉRISATION
  • 52. En quoi un TC est-il différent? Objectif Spécification du comportement requis Spécification du comportement actuel Régulier Caractérisation
  • 53. En quoi un TC est-il différent? Contexte d’utilisation Comportement connu et nouveau code Code patrimonial, comportement flou ou perdu Régulier Caractérisation
  • 54. En quoi un TC est-il différent? Durée de vie Permanent Temporaire Régulier Caractérisation
  • 55. Quel niveau ? Est-ce que d’entourer mon application avec des tests bout- en-bout peut m’aider à caractériser ?
  • 56. Le nouveau code doit être testé et écrit avec les meilleures pratiques… n’ajoutez pas encore plus de patrimoine douteux ! Avertissement !
  • 57. 58
  • 58. Le défi moderne… La maintenabilité ! 59
  • 59. 60 La pourriture du code n’est pas une « loi naturelle »…
  • 60. Although our first joy of programming may have been intense, the misery of dealing with legacy code is often sufficient to extinguish that flame. Michael Feathers, Working Effectively with Legacy Code Le code patrimonial tue la flamme!
  • 61. Image de http://beinweb.fr/wp-content/uploads/2014/04/boite-a-outils-entrepreneurs.jpg Le test de caractérisation… À ajouter dans votre boîte à outils!
  • 62. La « patrimonialite » ça se soigne !
  • 64. 65 Merci Notre site elapsetech.com Notre blogue developpementagile.com Nos Twitter @fbourbonnais | @elapsetech Nos courriels fbourbonnais@elapsetech.com pascalroy@elapsetech.com Nos LinkedIn linkedin.com/in/fbourbonnais/fr ca.linkedin.com/in/roypa conferences.elapsetech.com Diapositives Nos présentations, chez vous!