Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Testable Android Architecture

Chuck Greb
September 29, 2016

Testable Android Architecture

So many testing tools exist for Android including JUnit, Mockito, Robolectric, and Espresso. But how can you design your application to leverage each one most effectively? This talk introduces a modified version of the Model View Presenter (MVP) architecture to organize your code to be more flexible, maintainable, and testable.

Chuck Greb

September 29, 2016
Tweet

More Decks by Chuck Greb

Other Decks in Technology

Transcript

  1. Testable Android
    Architecture
    29 Sept 2016 / Chuck Greb

    View Slide

  2. Clean code
    Software Craftsmanship

    View Slide

  3. Art is anything you can do
    well. Anything you can do
    with Quality.


    - Robert M. Pirsig

    View Slide

  4. View Slide

  5. Clean Architecture
    MVC <> MVP <> MVVM

    View Slide

  6. In the beginning

    View Slide

  7. Activity

    View Slide

  8. Activity
    Activity
    Lifecycle
    System
    Services

    View Slide

  9. Activity
    EditText
    Button
    Activity
    Lifecycle
    System
    Services

    View Slide

  10. Activity
    EditText
    Button
    Web
    Service
    Storage
    AsyncTask
    Activity
    Lifecycle
    System
    Services

    View Slide

  11. Fragment
    Activity
    EditText
    Button
    Web
    Service
    Storage
    AsyncTask
    Activity
    Lifecycle
    System
    Services
    Fragment
    Fragment
    Lifecycle

    View Slide

  12. Fragment
    Activity
    EditText
    Button
    Web
    Service
    Storage
    AsyncTask
    Activity
    Lifecycle
    System
    Services
    Fragment
    Fragment
    Lifecycle
    User
    Input
    Input
    Validation

    View Slide

  13. Fragment
    Activity
    Web
    Service
    Storage
    AsyncTask
    Activity
    Lifecycle
    System
    Services
    Fragment
    Fragment
    Lifecycle
    User
    Input
    setRetainInstance(true)
    EditText
    Button
    Input
    Validation

    View Slide

  14. Fragment
    Activity
    Web
    Service
    Storage
    AsyncTask
    Activity
    Lifecycle
    System
    Services
    Fragment
    Fragment
    Lifecycle
    User
    Input
    setRetainInstance(true)
    Intent
    Parcelable
    Extras
    EditText
    Button
    Input
    Validation

    View Slide

  15. Web
    Service
    Storage
    Activity
    Fragment
    Fragment
    AsyncTask
    setRetainInstance(true)
    Activity
    Lifecycle
    Fragment
    Lifecycle
    System
    Services
    User
    Input
    Intent
    ActivityInstrumentati
    onTestCase2
    Parcelable
    Extras
    EditText
    Button
    Input
    Validation

    View Slide

  16. View Slide

  17. There has to be a
    better way

    View Slide

  18. Activity Logic

    View Slide

  19. Activity Logic
    Data

    View Slide

  20. Activity Logic
    Data
    View

    View Slide

  21. View
    (Activity)
    Controller
    (Logic)
    Model
    (Data)
    View

    View Slide

  22. View
    (Activity)
    Presenter
    (Logic)
    Model
    (Data)
    View

    View Slide

  23. View
    (Activity)
    ViewModel
    (Logic)
    Model
    (Data)
    View

    View Slide

  24. Controller
    (Activity)
    Subcontroller
    (Logic)
    Model
    (Data)
    View

    View Slide

  25. - Phil Karlton
    There are two hard things in
    computer science: cache
    invalidation, naming things,
    [and errors off by one.]


    View Slide

  26. Clean Architecture
    Model View
    Presenter Controller
    MVP(C)

    View Slide

  27. Controller
    (Activity)
    Presenter
    (Logic)
    Model
    (Data)
    View

    View Slide

  28. Activity Presenter
    (Logic)
    Model
    (Data)
    View
    Controller

    View Slide

  29. Web
    Service
    Storage
    Activity
    Activity
    Lifecycle
    System
    Services
    User
    Input
    Presenter
    View Model
    Controller
    Button
    EditText
    Thread
    Input
    Validation

    View Slide

  30. Web
    Service
    Storage
    Activity
    Activity
    Lifecycle
    System
    Services
    User
    Input
    Presenter
    View Model
    Controller
    Thread
    Button
    EditText
    Input
    Validation

    View Slide

  31. Mock
    Service
    Mock
    Storage
    Test
    Controller
    Presenter
    Model
    Controller
    Thread
    JUnit
    TestRunner

    View Slide

  32. A test is not a unit test if:
    → It talks to the database
    → It communicates across the network
    → It touches the file system
    → It can't run at the same time as any of
    your other unit tests
    → You have to do special things to your
    environment (such as editing config files)
    to run it.
    Michael Feathers, 2005
    A Set of Unit Test Rules

    View Slide

  33. Mock
    Service
    Mock
    Storage
    Test
    Controller
    Presenter
    Model
    Controller
    Thread
    JUnit
    TestRunner

    View Slide

  34. Activity
    Robolectric
    TestRunner
    Robolectric
    Runtime
    Environment
    Simulated
    Input
    Stub
    Presenter
    View
    Button
    EditText
    Input
    Validation

    View Slide

  35. Demo App
    https://github.com/ecgreb/mvpc

    View Slide

  36. Eraser Map

    View Slide

  37. View Slide

  38. Start where you are

    View Slide