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 Android
Pedro Vicente Gómez Sánchez
Senior Mobile Developer at Karumi
pedro@karumi.com
@pedro_g_s
github.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 Gragera
Technical Director
Jorge Barroso
Google Developer Expert
Davide Mendolia
Senior Full Stack Engineer
Sergio Gutierrez
Senior 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
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?