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

Preview:

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

Refactorer legacy, même pas peur!

Johan MARTINSSON Développeur - Indépendantmartinsson.johan@gmail.com@johan_alps

Rémy SANLAVILLE Développeur - Orange Software

Expertremy.sanlaville@orange.com@sanlaville

Working with Legacy Code

LEGACY CODETESTS

REFACTORING

TESTS

Working with Legacy Code

LEGACY CODE

REFACTORING

Refactoring Legacy Code with Object Calisthenics2012 - 2013

Anonymous Developers - Season 1

TESTS

Working with Legacy Code

LEGACY CODE

REFACTORING

100% Legacy Code Coverage with Golden Master201

4

Anonymous Developers - Season 2

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

Working with Legacy Code

LEGACY CODE

REFACTORING

100% Legacy Code Coverage with Golden Master201

4

Anonymous Developers - Season 2

TEMPORARY REFACTORING

TESTS

MAINTAINABLE TESTS

Working with Legacy Code

LEGACY CODE

REFACTORING

MAINTAINABLE TESTS

TEMPORARY REFACTORING

TESTS

Don’t forget to replace tempory

refactoring tests by maintainable

tests

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 ?

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

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

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

Baby Steps

String comparison with ApprovalTests

Branch coverage by input parameter variation

Serializing a complex type

Mocking web services

Capturing side effects

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

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

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

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

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

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

Pourquoi ça marche?

Pas de rédaction d’assertion

Pas d’effort lié à la maintenance

De bons outils

Tests taillés pour le refactoring

Conclusion

LEGACY CODE

REFACTORING

TEMPORARY REFACTORING

TESTS

MAINTAINABLE TESTS

http://approvaltests.sourceforge.net/

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”

http://approvaltests.sourceforge.net/

Approval Tests only needs 2

lines!

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

http://approvaltests.sourceforge.net/

Result of the current testnamed received

http://approvaltests.sourceforge.net/

Result referencenamed approved

http://approvaltests.sourceforge.net/

Approve result and save file

http://approvaltests.sourceforge.net/

Recommended