Unittesting onAndroid:why and how?DevFest Bucharest
DannyPreussler@PreusslerBerlin
UntestedCode istheDarkMatterofSoftware
'ElGordo'GalaxyClusterEvenBiggerThanThought(NASA,Chandra,04/03/14)byNASA'sMarshallSpaceFlightCenter,CCby2.0;flickr.com/photos/nasamarshall/13901530984
itmakesupto 90%ofthesoftwareuniverse
UntestedCode istheDarkMatterofSoftware
'ElGordo'GalaxyClusterEvenBiggerThanThought(NASA,Chandra,04/03/14)byNASA'sMarshallSpaceFlightCenter,CCby2.0;flickr.com/photos/nasamarshall/13901530984
Howdowetestourappstoday?
http://martinfowler.com/bliki/TestPyramid.html
Manual
UI
Service
Unit
Champ!®MiniSwirlsBirthdayPartyIceCreamConesbyBlueBunny®,CCby2.0;www.flickr.com/photos/bluebunnyicecream/5449137794
http://martinfowler.com/bliki/TestPyramid.html
Theproblem offunctionaltests
Something isbroken!
@PreusslerBerlin
Whatisbroken?
@PreusslerBerlin
Whereit’sbroken?
@PreusslerBerlin
It’sendtoend bydefinition!
@PreusslerBerlin
Productionfailureshttps://www.usenix.org/system/files/conference/osdi14/osdi14-paper-yuan.pdf
77%ofthefailurescouldbe reproduced
byaunittest
@PreusslerBerlin
74%ofthefailuresaredeterministic
@PreusslerBerlin
58%ofthecatastrophicfailureswhereerrorhandling
@PreusslerBerlin
TrustbyPROTerry Johnston, CCby2.0;flickr.com/photos/powerbooktrance/466709245
FearbyPRObrx0;CCby2.0;flickr.com/photos/atul666/5429073525
Documentation!
mutuallybyBruceDenis;CCby2.0;flickr.com/photos/f2point8/5896153192
Unittestsslow medown!?
Unittestsslow medown!?
Featuredevelopmentwillslowdown
longterm
@PreusslerBerlin
Customerswillloosetrust
@PreusslerBerlin
Codewritteninrushwillbethrownaway
@PreusslerBerlin
Thenextdeveloperwillthrowit away
@PreusslerBerlin
Thevaluethatseparatesamateursfromprofessionalsisthatvelocityisadirectfunction
ofquality.
Thevaluethatseparatesamateursfromprofessionalsisthatvelocityisadirectfunctionofquality.Novicesbelieve..thathackingisfast.
Thevaluethatseparatesamateursfromprofessionalsisthatvelocityisadirectfunctionofquality.Novicesbelieve..thathackingisfast.
Thehigherthequality,thefasteryougo.
Thevaluethatseparatesamateursfromprofessionalsisthatvelocityisadirectfunctionofquality.Novicesbelieve..thathackingisfast.
Thehigherthequality,thefasteryougo.Everytimeyoutradequalityforspeed,youslow
down.Everytime.
- UncleBob
YOU aretheexpert!
@PreusslerBerlin
Don’tletsomeonetellYOU howtocode!
@PreusslerBerlin
Theonly waytogofastistogowell
@PreusslerBerlin
Beprofessional!
@PreusslerBerlin
YOU arenotpaidtowrite legacycode
@PreusslerBerlin
Don’tshipcrap!
@PreusslerBerlin
Yourtest codeismoreimportant
thanproductioncode
@PreusslerBerlin
Writetestablecode
@PreusslerBerlin
InversionofControl
@PreusslerBerlin
void doSomething() {
new Something().doWhatISay();}
Nottestable!
void doSomething(Something something) {
something.doWhatISay();}
class MyClass {@Inject Something something;
void doSomething() {something.doWhatISay();
}} Dependency
Injection
Single responsibilities
Clean Code
@PreusslerBerlin
RespectLawofDemeter
http://enterprisecraftsmanship.com/2016/09/29/law-of-demeter-and-immutability/ @PreusslerBerlin
Avoidstatic
@PreusslerBerlin
Avoid singletons
@PreusslerBerlin
Wrapallthethings
@PreusslerBerlin
ButwhataboutLegacyCode?
New featuresmusthavetests!
@PreusslerBerlin
Investigatebugswithexploratorytests
@PreusslerBerlin
Explorecodewithcharacterizationtests
@PreusslerBerlinhttps://michaelfeathers.silvrback.com/characterization-testing
Testswillchangeyourarchitecture
stepbystep
@PreusslerBerlin
Untestablecodeisbadcode!
@PreusslerBerlin
Ifyouseecrap,replace it!
@PreusslerBerlin
Addtestinginfeatureplanning
@PreusslerBerlin
StrictDefinitionofDone
@PreusslerBerlin
YOU shouldsignthemanifesto!
@PreusslerBerlin
manifesto.softwarecraftsmanship.org
TestDrivenDevelopment
@PreusslerBerlin
TDD isfun
@PreusslerBerlin
Pairprogrammingisfun
@PreusslerBerlin
Evertriedthe“evilcoder”?
Testingisfun
@PreusslerBerlin
Playgroundforlanguagesandlibraries
Don‘t ship crap!@PreusslerBerlin
Thank you!@PreusslerBerlin
We are [email protected]