28
Refactorer legacy, même pas peur! Johan MARTINSSON Développeur - Indépendant martinsson.johan@gmai l.com @ johan_alps Rémy SANLAVILLE Développeur - Orange Software Expert [email protected] @ sanlaville

Refactorer du legacy, même pas peur! Agile France

Embed Size (px)

DESCRIPTION

tldr; L’approche classique des tests n’est pas adapté pour le refactoring dans le legacy. Il vaut mieux écrire des tests automatiques jetables. Du fait qu’il y ait 0 besoin de maintenance et avec l’outillage adapté cela est très TRES rapide (ex 200 lignes en 5min). http://martinsson-johan.blogspot.fr/2014/05/refactorer-legacy-meme-pas-peur.html https://www.youtube.com/watch?v=qEPb7eqvxes

Citation preview

Page 1: Refactorer du legacy, même pas peur! Agile France

Refactorer legacy, même pas peur!

Johan MARTINSSON Développeur - Indé[email protected]@johan_alps

Rémy SANLAVILLE Développeur - Orange Software

[email protected]@sanlaville

Page 2: Refactorer du legacy, même pas peur! Agile France

Working with Legacy Code

LEGACY CODETESTS

REFACTORING

Page 3: Refactorer du legacy, même pas peur! Agile France

TESTS

Working with Legacy Code

LEGACY CODE

REFACTORING

Refactoring Legacy Code with Object Calisthenics2012 - 2013

Anonymous Developers - Season 1

Page 4: Refactorer du legacy, même pas peur! Agile France

TESTS

Working with Legacy Code

LEGACY CODE

REFACTORING

100% Legacy Code Coverage with Golden Master201

4

Anonymous Developers - Season 2

Page 5: Refactorer du legacy, même pas peur! Agile France

Le problème – dans le legacy

Long d’écrire les tests

Les tests haut niveau sont longs à éxécuter

Les tests unitiare adhèrent au code

Page 6: Refactorer du legacy, même pas peur! Agile France

Working with Legacy Code

LEGACY CODE

REFACTORING

100% Legacy Code Coverage with Golden Master201

4

Anonymous Developers - Season 2

TEMPORARY REFACTORING

TESTS

MAINTAINABLE TESTS

Page 7: Refactorer du legacy, même pas peur! Agile France

Working with Legacy Code

LEGACY CODE

REFACTORING

MAINTAINABLE TESTS

TEMPORARY REFACTORING

TESTS

Don’t forget to replace tempory

refactoring tests by maintainable

tests

Page 8: Refactorer du legacy, même pas peur! Agile France

Trivia Challenge http://www.hasbro.com/games/en_US/shop/details.cfm?R=93C6EE71-6D40-1014-8BF0-9EFBF894F9D4:en_US

https://github.com/jbrains/trivia

It simulates a trivia gameusing a randomizer

for correct and wrong answers

How long do you need to reach ~100% code

coverage ?

Page 9: Refactorer du legacy, même pas peur! Agile France

Trivia Challengehttps://github.com/jbrains/trivia

http://www.hasbro.com/games/en_US/shop/details.cfm?R=93C6EE71-6D40-1014-8BF0-9EFBF894F9D4:en_US

It works well because there are no dependencies

1

1

Serialize game state and compare it with Approval Tests

1

Cover all branches by variying the results of the randomizer

2

2

Page 10: Refactorer du legacy, même pas peur! Agile France

Server 1Server 2

EncodeAudioLegacy Challenge

Remote Server 1

Audio File

encoding

HTTPS Server 2

Audio File

Encoded Audio File

Audio File available at

Remote Server 1

Encoded Audio File available

download uploadEncode Audio Engine

Page 11: Refactorer du legacy, même pas peur! Agile France

Server 1Server 2

EncodeAudioLegacy Challenge

Remote Server 1

Audio File

encoding

HTTPS Server 2

Audio File available at

Remote Server 1

downloadEncode Audio Engine

upload

AudioAnnouceTmlgURL Remote

Server 1formatfilename

audioConfigTmptarget audio

file extension target

encoding propertieshttpConfigTmpLocal Tempory

Folder path, URL Remote

HTTPS Server 2

Local Tempory Folder

Audio File

Encoded Audio File

Local HTTP Server

Encoded Audio File

Encoded Audio File available

AudioFile

name

format

Page 12: Refactorer du legacy, même pas peur! Agile France

Baby Steps

String comparison with ApprovalTests

Branch coverage by input parameter variation

Serializing a complex type

Mocking web services

Capturing side effects

Page 13: Refactorer du legacy, même pas peur! Agile France

Step 0: Development environment validation

EclEmmaJUnit

Technical Solution: Unit Testing + Code Coverage Tools

Context: Launch UT + Code Coverage

Server 1

Remote Server 1

Audio File

download

Server 2

encoding

HTTPS Server 2

Audio File available at

Remote Server 1

Encode Audio Engineupload

AudioAnnouceTmlgURL Remote

Server 1formatfilename

Local Tempory Folder

Audio File

Encoded Audio File

Local HTTP Server

Encoded Audio File

Encoded Audio File available

AudioFile

name

format

Page 14: Refactorer du legacy, même pas peur! Agile France

Step 1: Method returns a primitive type

Technical Solution: Approval Tests (string comparison)

Context: No side effect + Method returns a primitive type

Server 1

Remote Server 1

Audio File

download

Server 2

encoding

HTTPS Server 2

Audio File available at

Remote Server 1

Encode Audio Engineupload

AudioAnnouceTmlgURL Remote

Server 1formatfilename

Local Tempory Folder

Audio File

Encoded Audio File

Local HTTP Server

Encoded Audio File

Encoded Audio File available

AudioFile

name

format

String

Page 15: Refactorer du legacy, même pas peur! Agile France

Step 2: Branch coverage by input parameter

variation

Technical Solution: Approval Tests (legacyApprovals)

Context: No side effect + Method returns a primitive type

Server 1

Remote Server 1

Audio File

download

Server 2

encoding

HTTPS Server 2

Audio File available at

Remote Server 1

Encode Audio Engineupload

AudioAnnouceTmlgURL Remote

Server 1formatfilename

Local Tempory Folder

Audio File

Encoded Audio File

Local HTTP Server

Encoded Audio File

Encoded Audio File available

AudioFile

name

format

Page 16: Refactorer du legacy, même pas peur! Agile France

Step 3: Method returns a complex type

Note: encoding + date issues

Context: No side effect + Method returns a complex type

Technical Solution: Approval Tests + XStream

Server 1

Remote Server 1

Audio File

download

Server 2

encoding

HTTPS Server 2

Audio File available at

Remote Server 1

Encode Audio Engineupload

AudioAnnouceTmlgURL Remote

Server 1formatfilename

Local Tempory Folder

Audio File

Encoded Audio File

Local HTTP Server

Encoded Audio File

Encoded Audio File available

AudioFile

name

format

Comple

x type

Page 17: Refactorer du legacy, même pas peur! Agile France

Step 4: Third-party services

Context: WebService difficult to configure or/and not avalaible

Technical Solution: Moco

Server 2

encoding

HTTPS Server 2

Audio File available at

Remote Server 1

Encode Audio Engineupload

AudioAnnouceTmlgURL Remote

Server 1formatfilename

Local Tempory Folder

Audio File

Encoded Audio File

Local HTTP Server

Encoded Audio File

Encoded Audio File available

AudioFile

name

format

Server 1

Remote Server 1

Audio File

downloadWeb

Server

Page 18: Refactorer du legacy, même pas peur! Agile France

Step 5: Capturing side effects

Note:can be used for context with void methodsnot mocking side effect

Context: Side effects

Technical Solution: State, Side Effects Serialization + Approval Tests

Server 2

encoding

HTTPS Server 2

Audio File available at

Remote Server 1

Encode Audio Engineupload

AudioAnnouceTmlgURL Remote

Server 1formatfilename

Local Tempory Folder

Audio File

Encoded Audio File

Local HTTP Server

Encoded Audio File

Encoded Audio File available

AudioFile

name

format

Server 1

Remote Server 1

Audio File

download

File

System

state

Page 19: Refactorer du legacy, même pas peur! Agile France

Pourquoi ça marche?

Pas de rédaction d’assertion

Pas d’effort lié à la maintenance

De bons outils

Tests taillés pour le refactoring

Page 20: Refactorer du legacy, même pas peur! Agile France

Conclusion

LEGACY CODE

REFACTORING

TEMPORARY REFACTORING

TESTS

MAINTAINABLE TESTS

Page 21: Refactorer du legacy, même pas peur! Agile France

http://approvaltests.sourceforge.net/

Page 22: Refactorer du legacy, même pas peur! Agile France

Ensuite

http://approvaltests.sourceforge.net/

http://martinsson-johan.blogspot.fr/

http://github.com/dreamhead/moco

https://github.com/pearlfish/pearlfish-javaUI visual diffinghttps://www.youtube.com/watch?v=UMnZiTL0tUcWorking Effectively with Legacy Code – in particular for creating “seams”

Page 23: Refactorer du legacy, même pas peur! Agile France

http://approvaltests.sourceforge.net/

Approval Tests only needs 2

lines!

Page 24: Refactorer du legacy, même pas peur! Agile France

http://approvaltests.sourceforge.net/

Run your test

Diff Tool (by default TortoiseMerge)

Cf. Using Reporters in Approval Testshttp://blog.approvaltests.com/2011/12/using-reporters-in-approval-tests.html

Page 25: Refactorer du legacy, même pas peur! Agile France

http://approvaltests.sourceforge.net/

Result of the current testnamed received

Page 26: Refactorer du legacy, même pas peur! Agile France

http://approvaltests.sourceforge.net/

Result referencenamed approved

Page 27: Refactorer du legacy, même pas peur! Agile France

http://approvaltests.sourceforge.net/

Approve result and save file

Page 28: Refactorer du legacy, même pas peur! Agile France

http://approvaltests.sourceforge.net/