Slide 1

Slide 1 text

Automated Testing 
 in Android

Slide 2

Slide 2 text

Rebecca Franks @riggaroo www.riggaroo.co.za Android Developer @DStv for DVT

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Let me tell you a story…

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

???? Crash reports keep coming in One year later…

Slide 9

Slide 9 text

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.

Slide 10

Slide 10 text

A Better Solution

Slide 11

Slide 11 text

App Structure User Actions Presenter Updates View Model Updates Model State-change events View (Activities, Fragments) API (DB, file, REST API) Repositories

Slide 12

Slide 12 text

Example App Loads a list of books that a user can click on and download. Can change language preference.

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Example:View Contract & Actions Contract Actions that can be executed from the View Methods that the presenter will call on the View

Slide 15

Slide 15 text

Example: Activity Activity will then implement the View Contract and have a reference to a UserActionsListener

Slide 16

Slide 16 text

Example: Presenter

Slide 17

Slide 17 text

Example: Repository Could hit a cache here

Slide 18

Slide 18 text

Example: API

Slide 19

Slide 19 text

Types of Testing

Slide 20

Slide 20 text

• 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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

What? • Unit Tests • Repositories • BookDetailRepositoryImpl • Presenters • ListBooksPresenter • Any logic - calculations etc • UI Tests • Activities & Fragments • ListBooksActivity

Slide 23

Slide 23 text

Setting up Project for tests

Slide 24

Slide 24 text

• 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.

Slide 25

Slide 25 text

Gradle Flavors org.bookdash.android: app-prod-release.apk app-prod-debug.apk org.bookdash.android.mock: app-mock-debug.apk

Slide 26

Slide 26 text

Dependencies

Slide 27

Slide 27 text

Unit Tests

Slide 28

Slide 28 text

Structure • GWT • Given • When • Then • Example: • Given I am logged in • When I click logout • Then I should see a login button

Slide 29

Slide 29 text

• Within the test/ directory

Slide 30

Slide 30 text

List Books Presenter Test

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

• 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.

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

PowerMockito

Slide 35

Slide 35 text

Instrumentation Tests

Slide 36

Slide 36 text

What is Espresso?

Slide 37

Slide 37 text

• 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.

Slide 38

Slide 38 text

Formula ViewMatcher ViewAction ViewAssertation Basic Espresso Forumla

Slide 39

Slide 39 text

Espresso Cheat Sheet

Slide 40

Slide 40 text

Hamcrest Cheat Sheet

Slide 41

Slide 41 text

Setup • Build Variants Dialog > Android Instrumentation Tests • Switch environment here too - mockDebug • Need to disable animations on device

Slide 42

Slide 42 text

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.

Slide 43

Slide 43 text

Fake Book Data

Slide 44

Slide 44 text

Basic View Assertions

Slide 45

Slide 45 text

Intent Testing

Slide 46

Slide 46 text

WebView Testing

Slide 47

Slide 47 text

Idling Resource

Slide 48

Slide 48 text

Code Coverage Reports

Slide 49

Slide 49 text

Unit Test Coverage

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

Instrumentation Test Coverage • ./gradlew createMockDebugCoverageReport

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

Google Cloud Test Lab • Upload Test APK and Real APK • Select Devices to run it on • Get reports for the tests

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

Questions?

Slide 56

Slide 56 text

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