48
@iordanis_g @geeky_android #shazam_testing KEEPING 100+ MILLION USERS HAPPY HOW WE TEST SHAZAM ON ANDROID Iordanis Giannakakis @iordanis_g Savvas Dalkitsis @geeky_android

Keeping 100m+ users happy: How we test Shazam on Android

Embed Size (px)

Citation preview

Page 1: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

KEEPING 100+ MILLION USERS HAPPY HOW WE TEST SHAZAM ON ANDROID

Iordanis Giannakakis @iordanis_g Savvas Dalkitsis @geeky_android

Page 2: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

How Shazam works

Page 3: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

100+ million users

Page 4: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Happy users

Even developers?

Page 5: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Android testing

Page 6: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Faster release cycles

Page 7: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Better code

Page 8: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Cheaper

http://testdroid.com/testdroid/5851

Page 9: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Easy

Page 10: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

A user walks into a bar

Page 11: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Doing it the test driven way

Write UI test

Implement

Refactor

Write unit test

BDD

TDD

Page 12: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

“To TDD or not to TDD?

...That is not the question” Seb Rose

http://claysnow.co.uk/to-tdd-or-not-to-tdd/

Page 13: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Test first

•  Generally easier

•  Eliminates external dependencies

•  Easily repeatable

Page 14: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

The Acceptance tests cycle

Write UI test

Implement

Refactor

Write unit test

BDD

TDD

Page 15: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Acceptance criteria

Given : arrange

When : act

Then : assert

Page 16: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Example

Given a user is near a music venue And the server always returns a known result When the user Shazams Then the user can check-in their discovery

Page 17: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

given(user).isNear(lexington()); given(server).returns(lustForLife()); when(user).shazams(); then(user).canCheckIn(lustForLife(), lexington());

gwen

https://github.com/shazam/gwen

Page 18: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Acceptance test technologies

•  Instrumentation •  JUnit 3 •  Robotium & Espresso •  gwen •  HamMock Server

Page 19: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

The Unit tests cycle

Write UI test

Implement

Refactor

Write unit test

BDD

TDD

Page 20: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

What we don’t test

Activities & Fragments

https://github.com/xxv/android-lifecycle

Page 21: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

What we don’t test

Page 22: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

What we do unit test

•  Presentation logic

•  Business logic

•  That’s all!

Page 23: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

The MVP pattern

Presenter

Model View

Page 24: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

The MVP pattern for Android

Presenter

Model

View

start

stop

Android

Page 25: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

The MVP pattern

•  Makes presentation logic testable

•  No need to test the “dummy” view

•  Avoid Android dependencies

Page 26: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Dependency Injection, Yourself (DIY)

•  Break hardcoded dependencies

•  Behaviour vs Implementation

•  Swappable dependencies for test and production

runtimes

Page 27: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Hardcoded dependencies

Client

Feature X Feature X

Page 28: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Dependency Injection

Client

Injector

Feature X Interface

Page 29: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

 public  interface  VenueRetriever  {          void  findClosestVenue(VenueFoundCallback  callback);    }      public  class  NetworkVenueRetriever  implements  VenueRetriever  {          public  void  findClosestVenue(VenueFoundCallback  callback)  {                //  Some  slow  networking          }    }      public  class  LocalVenueRetriever  implements  VenueRetriever  {          public  void  findClosestVenue(VenueFoundCallback  callback)  {                //  DB  look-­‐up  /  caching  layer,  perhaps?          }    }

Model

Page 30: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

 public  class  ResultActivity  extends  Activity  implements  ResultView  {          private  final  VenueRetriever  venueRetriever;          private  ResultPresenter  resultPresenter;            public  ResultActivity()  {                venueRetriever  =  venueRetriever();          }            public  void  onCreate(Bundle  savedInstanceState)  {                //  TODO:  Setup  layouts  &  views                  Result  result  =  resultToDisplay();                resultPresenter  =  new  ResultPresenter(this,  venueRetriever,  result);          }            public  void  onStart()  {                resultPresenter.startPresenting();          }    }

Activity

Page 31: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

 public  class  ResultPresenter  {            public  ResultPresenter(ResultView  resultView,  VenueRetriever                        venueRetriever,  Result  result)  {                this.resultView  =  resultView;                this.venueRetriever  =  venueRetriever;                this.result  =  result;          }            public  void  startPresenting()  {                resultView.showResult(result);                venueRetriever.findClosestVenue(new  VenueFoundCallback()  {                      public  void  venueFound(Venue  venue)  {                            resultView.showCheckInPrompt(venue);                      }                });          }    }

Presenter

Page 32: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

 public  interface  ResultView  {            void  showResult(Result  track);            void  showCheckInPrompt(Venue  venue);    }  

View

Page 33: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

 public  class  ResultActivity  extends  Activity  implements  ResultView  {            public  void  showResult(Result  result)  {                //TODO  show  the  result  screen  &  bind  result  data          }            public  void  showCheckInPrompt(Venue  venue)  {                //TODO  bind  the  venue  with  check-­‐in  prompt  view          }    }

Activity

Page 34: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Unit tests technologies

•  JUnit 4

•  Robolectric java.lang.RuntimeException: Stub!

•  Hamcrest

•  JMock

Page 35: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Test execution

Page 36: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Continuous Integration

Page 37: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Speed (Hint: slow)

Page 38: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Usual execution

Test Suite

Page 39: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Spoon

http://square.github.io/spoon

Page 40: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Fork

Test Suite

Page 41: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Fork

•  Inspired by Spoon, but faster •  Infinitely scalable •  Current setup 1 test / 2 seconds •  Pooled execution

Page 42: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

Flakiness monitor

Page 43: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

ADB Remote

https://github.com/sleekweasel/CgiAdbRemote

Page 44: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

If all else fails…

Page 45: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

If all else fails…

Page 46: Keeping 100m+ users happy: How we test Shazam on Android

@iordanis_g @geeky_android #shazam_testing

If all else fails…

Page 47: Keeping 100m+ users happy: How we test Shazam on Android

@YourTwitterHandle #DVXFR14{session hashtag} @iordanis_g @geeky_android #shazam_testing

•  Testing is easier than you may think •  Practice, practice, practice •  Toolset is limited •  Ship it!

Page 48: Keeping 100m+ users happy: How we test Shazam on Android

@YourTwitterHandle #DVXFR14{session hashtag} @iordanis_g @geeky_android #shazam_testing

Hiring...