Upload
martinsson
View
597
Download
3
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
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
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/