World-Class Testing Development Pipeline for Android

Post on 12-Apr-2017

7.797 views 2 download

Transcript of World-Class Testing Development Pipeline for Android

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

World-Class Testing Development Pipeline for AndroidPedro Vicente Gómez SánchezSenior Mobile Developer at Karumi

pedro@karumi.com@pedro_g_sgithub.com/pedrovgs

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Alberto GrageraTechnical Director

Jorge BarrosoGoogle Developer Expert

Davide MendoliaSenior Full Stack Engineer

Sergio GutierrezSenior Mobile Engineer

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Let’s talk about testing!

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

This talk starts with some common problems.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

What do we have to test and how?

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

What if our code is not testable?

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Just because our tests are passing doesn’t mean your code is working.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Any conclusions?

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

We are doing something wrong if we can’t trust our tests. We need a solution.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

The Solution: Testable Code + Testing Pipeline

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

The Software Architecture used has to hide implementation details.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Dependency Inversion Principle is going to guide your Architecture.

DIP is the most important S.O.L.I.D. principle.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Architecture - Testable Code

Activity

View

Presenter

Use Case

Repository

Repository

Domain Model

Data Source

Data Source

Data Source Implementation

Data Source Implementation

Use Case

Use Case

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Architecture is not enough.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Testing Development Pipeline

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Your Testing Development Pipeline should define what you are going to test and how.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

What do I want to test?

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Test my code implements the business requirements.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Test my API Client, HTTP requests/responses and JSON parsing, are working as expected.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Test the user is watching in the App UI the expected messages.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

In other words…

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Test our Business Logic independently of frameworks or libraries.

Test our integration with the API.

Test our application UI.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

These three points define part of the Testing Development Pipeline.

These three points define what we want to test.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

How are we going to test this?

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Test my code implements the business requirements.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Think in the test scope and try to check the state of the software at the end of the test execution.

Use the Dependency Inversion Principle to be able to use test doubles to simulate different test

scenarios and adjust the test scope.

Business Logic Tests

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Show me the code!

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Check the state of the software at the end of

the test execution

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Implementation Details are replaced using Test Doubles.

The SUT is the GameBoy, the GBZ80

and the GPU.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Infrastructure needed?

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

The usage of test doubles are the key to adjust the test scope.

The Application architecture will help use to hide

implementation details applying the dependency

inversion principle

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Now we can test our business logic without depending on any framework

or library. Inside an isolated environment.

The Result

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Test my API Client, HTTP requests/responses and JSON parsing, are working as expected.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Start a fake server we have under control checking the API client is working given some

preconfigured scenarios.

API Client tests

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Show me the code!

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Given some HTTP responses the final

authentication state is correct.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Given a Json file with the response, an http status code, and an

endpoint the parsing is correct.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Infrastructure needed?

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Initializes a fake http server where we can configure responses.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Now we can check if our integration with the API Client is working as it

should.

The Result

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Test the user is watching in the App UI the expected messages.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

UI Tests

Replace some dependencies using test doubles from the testing application to be able to simulate different

scenarios and check the UI is showing the correct information.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Show me the code!

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Code Injected from the test application.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Asserts from the UI point of view.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Asserts from the User Interface point of

view.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Helper methods or different creational patterns to create initial scenarios.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Infrastructure needed?

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Configure your dependency injection

library from your Application class.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Mocking Library

Helper Methods

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Replace Application’s dependency container

with a custom configuration.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Now we can write UI tests easily.

The Result

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

The Testing Development Pipeline is complete now.

Now we know what to test and how.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Now we can trust our tests.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Tools and libraries?

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Business Logic Tests

● JUnit.

● Mockito.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

API Client Tests

● JUnit.

● Mockito.

● MockWebServer.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

UI Tests● JUnit.

● Mockito.

● Robolectric.

● Espresso.

● Dagger.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

References● World-Class Testing Development Pipeline for Android blog post series.

● Kata Contacts. GitHub Repository.

● Kata TODO API Client. GitHub Repository.

● Kata Super Heroes. GitHub Repository.

● Android GameBoy Emulator. GitHub Repository.

● Google Testing Blog. Testing state vs interaction.

Pedro V. Gómez Sánchez - pedro@karumi.com - @pedro_g_s - github.com/pedrovgs

Questions?