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

Automated Testing in Android

Automated Testing in Android

Presentation I gave at Internal forum at work, looking at how to best struture your code for unit testing and Espresso testing.

Rebecca Franks

November 25, 2015

More Decks by Rebecca Franks

Other Decks in Programming


  1. Agenda • A solution to messy android codebases • Types

    of Testing • Setting up for Tests • Unit Tests • Instrumentation Tests • Code Coverage Reports • Google Cloud Test Lab
  2. Meet Bleep He wants to make a quick POC for

    business. Activity Content Provider API Manager API Requests
  3. Meet Bleep He wants to make a quick POC for

    business. Meet Ms. Pink She Hears about a cool library Activity Content Provider API Requests API Manager Retrofit New Fragments + Features
  4. Meet Ms. Pink She Hears about a cool library Meet

    Bleep He wants to make a quick POC for business. Meet Mr Test Heard about tests – Wants to add unit test but tricky with android and too much that is not tested Activity Content Provider API Requests API Manager Retrofit New Fragments + Features Adds some Flaky UI Tests Story inspired by Romain Piel. Link at end
  5. Observations • Android has no clear way to structure apps

    • Activities get messy. Everything ends up sitting in the activity class. • Difficult to test this kind of structure. • Hard to make changes • Almost always require a context for android tests.
  6. App Structure User Actions Presenter Updates View Model Updates Model

    State-change events View (Activities, Fragments) API (DB, file, REST API) Repositories
  7. Example App Loads a list of books that a user

    can click on and download. Can change language preference.
  8. Example: Folder Structure Data Folder: - Contains Repositories & APIs

    - Fetching stuff from server and/or device storage - Grouped by functionality Domain Folder: - POJOs - Possibly some business logic classes if wishing to separate it out Presentation Folder: - Grouped by functionality not class type - Contains MVP related classes per functionality folder
  9. Example:View Contract & Actions Contract Actions that can be executed

    from the View Methods that the presenter will call on the View
  10. • Unit Testing • A unit test generally exercises the

    functionality of the smallest possible unit of code (which could be a method, class, or component) in a repeatable way. • JUnit • Mockito • PowerMockito • Two types of Unit testing: • Local Testing - Doesn’t run on physical device • Instrumentation Tests - Runs on an android device or emulator. • UI Testing • Mocking of typical user actions with your application. Clicking on buttons, typing in text etc. • Espresso • Robotium • Appium • Calabash • UIAutomator • Robolectric Types of Testing
  11. Where? • Unit Tests - typically live in the test/

    folder.* • Instrumentation Tests (UI Tests) - live in the androidTest/ folder. Unit Tests - Don’t need an android device or android APIs Android Instrumentation Tests - UI Tests - Unit tests that need an android device
  12. What? • Unit Tests • Repositories • BookDetailRepositoryImpl • Presenters

    • ListBooksPresenter • Any logic - calculations etc • UI Tests • Activities & Fragments • ListBooksActivity
  13. • Set up folders in the following way • Using

    gradle build flavors – we can now have different APKs to use to test with • prodDebug • prodRelease • mockDebug • This can extend to point to have different folders per build environment.
  14. Structure • GWT • Given • When • Then •

    Example: • Given I am logged in • When I click logout • Then I should see a login button
  15. List Books Presenter Test • Given: I have my language

    preference saved as English • When: I try load my english books • Then: The View should show the list of English Books
  16. • Given: I have a language preference saved as English

    • When: I load books and there is an error loading • Then: The loading indicator should stop and I should see the error screen with a retry button.
  17. Tips • Try to avoid passing a context around further

    than your View • Try keep android specific things in isolation • Possible to emulate some android.jar functions using PowerMockito
  18. • Android Testing Framework • Provided by Google in support

    libraries • Instrumentation Based • Simulates User interactions – Clicks , Swipes etc • Automatic synchronisation of test actions • Waits for App to be “idle” before continuing with operations: • No UI events in the message queue • No Async Tasks running in default Async Task thread pool.
  19. Setup • Build Variants Dialog > Android Instrumentation Tests •

    Switch environment here too - mockDebug • Need to disable animations on device
  20. Setup • androidTest • Tests that should pass regardless of

    environment • androidTestMock • Tests that will run using the classes from the mock folder • Run the tests: ./gradlew connectedMockDebugAndroidTest Can setup a build server to run these instrumentation tests that will deploy to a device and test.
  21. Google Cloud Test Lab • Upload Test APK and Real

    APK • Select Devices to run it on • Get reports for the tests
  22. Links • MVP Code Lab - http://www.code-labs.io/codelabs/android- testing/index.html • Ingredients

    for a healthy codebase - http:// www.slideshare.net/mobile/pileromain/ingredients-for-a- healthy-codebase • Espresso Testing Documentation - http://developer.android.com/ training/testing/ui-testing/espresso-testing.html • Espresso Cheat Sheet - https://github.com/googlesamples/ android-testing/blob/master/downloads/Espresso%20Cheat%20Sheet %20Master.pdf • Hamcrest Cheat Sheet -http://www.marcphilipp.de/downloads/ posts/2013-01-02-hamcrest-quick-reference/Hamcrest-1.3.pdf • Espresso Examples https://github.com/chiuki/espresso-samples • Johannesburg Android Developers Community - https:// plus.google.com/communities/107730573804920392616