11. Server 1
Server 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 upload
Encode Audio Engine
12. Baby Steps
Step0: Development environment validation
Step1: String comparison with ApprovalTests
Step2: Branch coverage by input parameter variation
Step3: Serializing a complex type
Step4: Mocking web services
Step5: Capturing side effects
13. Step 0: Development environment validation
EclEmmaJUnit
Technical Solution: Unit Testing + Code Coverage Tool + Diff
Tool
Context: Launch UT + Code Coverage + String comparison
Server 1
Remote Server 1
Audio File
download
Server 2
encoding
HTTPS Server 2
Audio File available
at Remote Server 1
Encode Audio Engine
upload
Audio File Encoded
Audio File
Encoded
Audio File
Encoded Audio File
available
Meld
WinMerge…
14. 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 Engine
upload
Audio File Encoded
Audio File
Encoded
Audio File
Encoded Audio File
available
Note: encoding issues
15. Step 2: Branches coverage by input
parameters variation
Technical Solution: Approval Tests (legacyApprovals)
Context: No side effect + Method returns a primitive type
Server 2
encoding
HTTPS Server 2
Audio File available
at Remote Server 1
Encode Audio Engine
upload
Audio File Encoded
Audio File
Encoded
Audio File
Encoded Audio File
available
Server 1
Remote Server 1
Audio File
download
16. Step 3: Method returns a complex type
Note: 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 Engine
upload
Audio File Encoded
Audio File
Encoded
Audio File
Encoded Audio File
available
IFluxTmlg
IBodyTmlg
ITravelInfoTmlg
IAudioAnnounceTmlg
17. Server 2
encoding
HTTPS Server 2
Audio File available
at Remote Server 1
Encode Audio Engine
upload
Audio File Encoded
Audio File
Encoded
Audio File
Encoded Audio File
available
Step 4: Third-party services
Context: WebService difficult to configure or/and not
avalaible
Technical Solution: Moco
Server 1
Remote Server 1
Audio File
download
18. Step 5: Capturing side effects
Note: can be used for context with void methods
not mocking side effect
Context: Side effects
Technical Solution: State, Side Effects Serialization + Approval
Tests
Server 1
Remote Server 1
Audio File
download
Server 2
encoding
HTTPS Server 2
Audio File available
at Remote Server 1
Encode Audio Engine
upload
Audio File Encoded
Audio File
Encoded
Audio File
Encoded Audio File
available
19. Conclusion - Why it’s working?
Easy assertion: record and replay
Even ugly tests do the job (Temporary tests)
Fast to execute
Available good libraries:
Approval Tests, XStream, Moco…
Tests are resilient to refactoring
30. Server 1
Server 2
EncodeAudioLegacy Challenge
Remote Server 1
Audio File encoding
HTTPS Server 2
Audio File available
at Remote Server 1
download
Encode Audio Engine
upload
AudioAnnouceTmlg
URL Remote Server 1
format
filename
audioConfigTmp
target audio file extension
target encoding properties
httpConfigTmp
Local 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