Upload
allon-mureinik
View
124
Download
0
Embed Size (px)
DESCRIPTION
Unit testing is easy... In a perfect world. Our world is not. This talk will cover a bunch of tips, tricks, and techniques to retrofit ugly legacy applications so parts of them can be unit tested. (Examples given in Java using JUnit and Mockito)
Citation preview
1Allon Mureinik - Retro Testing
Retro Testing
Allon MureinikTeam Lead, Cloud Storage, Red [email protected] / @mureinik
January 2014
2Allon Mureinik - Retro Testing
TDD Is Easy...
3Allon Mureinik - Retro Testing
... or is it?
● The first two part should be● Write a test● Make sure it fails
● The question is why it fails.
● In a legacy system, it will often fail for “bad” reasons:● Unable to access the database● Some static resource not set up● Need to spin up an application server● Etc., etc., etc...
4Allon Mureinik - Retro Testing
Will the mistakes of the past haunt me forever?
5Allon Mureinik - Retro Testing
It’s not an all-or-nothing situation
6Allon Mureinik - Retro Testing
One baby step at a time
7Allon Mureinik - Retro Testing
Refactor, refactor, refactor
● Your first task would probably be to do some refactoring
● Resist the urge to improve the code● Frankly, this step may make the code look worse
● Your only goal here is to create an opportunity to write tests
8Allon Mureinik - Retro Testing
Refacroting with no tests is like...
9Allon Mureinik - Retro Testing
Example : Bad Code
10Allon Mureinik - Retro Testing
Some minimal refactoring
11Allon Mureinik - Retro Testing
Now we can start writing tests...
● Now we have the tools to separate external resources from logic
● There are a couple of ways to do so:● Override the relevant methods in your test● Use Mockito/EasyMock to spy the tested object● Use @Rules to set up common mocking once
12Allon Mureinik - Retro Testing
I @Spy With My Little Eye
13Allon Mureinik - Retro Testing
Some more refactoring
14Allon Mureinik - Retro Testing
Let’s modernize our code
15Allon Mureinik - Retro Testing
But how can I write asserts?
● Overriding, mocking and all that jazz are fine and well
● But any test boils down to writing an assert...
● ... and I have no idea what this function is supposed to do
● Remember this is a legacy system
● You may not need to test it for correctness ...
● Just for backwards compatibility
16Allon Mureinik - Retro Testing
17Allon Mureinik - Retro Testing
The real challenge is changing mindset
● We can discusses refactoring till we’re blue in the face
● But the real challenge isn’t changing the way we code
● It’s changing the way we approach the problem
18Allon Mureinik - Retro Testing
It’s all too easy to slip back to bad habits
● This bug is blocking the release...
● It’s a ton of work to refactor this logic out...
● The rest of the code is bad anyway...
19Allon Mureinik - Retro Testing
Have the courage to stand up to excuses
20Allon Mureinik - Retro Testing
Questions?