refactorer du legacy, même pas peur! agile france
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=qEPb7eqvxesTRANSCRIPT
![Page 1: Refactorer du legacy, même pas peur! Agile France](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/1.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/2.jpg)
Working with Legacy Code
LEGACY CODETESTS
REFACTORING
![Page 3: Refactorer du legacy, même pas peur! Agile France](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/3.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/4.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/7.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/20.jpg)
Conclusion
LEGACY CODE
REFACTORING
TEMPORARY REFACTORING
TESTS
MAINTAINABLE TESTS
![Page 22: Refactorer du legacy, même pas peur! Agile France](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/23.jpg)
http://approvaltests.sourceforge.net/
Approval Tests only needs 2
lines!
![Page 24: Refactorer du legacy, même pas peur! Agile France](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/25.jpg)
http://approvaltests.sourceforge.net/
Result of the current testnamed received
![Page 26: Refactorer du legacy, même pas peur! Agile France](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/26.jpg)
http://approvaltests.sourceforge.net/
Result referencenamed approved
![Page 27: Refactorer du legacy, même pas peur! Agile France](https://reader033.vdocuments.us/reader033/viewer/2022061202/547b0d48b4af9faa158b4d78/html5/thumbnails/27.jpg)
http://approvaltests.sourceforge.net/
Approve result and save file