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

Preview:

Citation preview

&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 ROYING., 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 RoyIng., PSM, CSM, PMP

Félix-Antoine BourbonnaisB.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 çaprend pour comprendreun 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 requisSpécification du

comportement actuel

Régulier Caractérisation

En quoi un TC est-il différent?

Contexte d’utilisation

Comportement connuet 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

Mer

ciNotre siteelapsetech.com

Notre bloguedeveloppementagile.com

Nos Twitter@fbourbonnais | @elapsetech

Nos courrielsfbourbonnais@elapsetech.com

pascalroy@elapsetech.com

Nos LinkedInlinkedin.com/in/fbourbonnais/fr

ca.linkedin.com/in/roypa

conferences.elapsetech.com

Diapositives

Nos présentations, chez vous!

Recommended