World-Class Testing Development Pipeline for Android
-
Upload
pedro-vicente-gomez-sanchez -
Category
Engineering
-
view
7.842 -
download
3
Transcript of World-Class Testing Development Pipeline for Android
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
World-Class Testing Development Pipeline for AndroidPedro Vicente Gómez SánchezSenior Mobile Developer at Karumi
[email protected]@pedro_g_sgithub.com/pedrovgs
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Let’s talk about testing!
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
This talk starts with some common problems.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
What do we have to test and how?
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
What if our code is not testable?
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Any conclusions?
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
The Solution: Testable Code + Testing Pipeline
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
The Software Architecture used has to hide implementation details.
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Architecture is not enough.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Testing Development Pipeline
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
What do I want to test?
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Test my code implements the business requirements.
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Test the user is watching in the App UI the expected messages.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
In other words…
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
How are we going to test this?
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Test my code implements the business requirements.
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Show me the code!
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Infrastructure needed?
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @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 - [email protected] - @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 - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Show me the code!
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Given some HTTP responses the final
authentication state is correct.
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Infrastructure needed?
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Initializes a fake http server where we can configure responses.
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Test the user is watching in the App UI the expected messages.
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Show me the code!
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Code Injected from the test application.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Asserts from the UI point of view.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Asserts from the User Interface point of
view.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Helper methods or different creational patterns to create initial scenarios.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Infrastructure needed?
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Configure your dependency injection
library from your Application class.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Mocking Library
Helper Methods
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Replace Application’s dependency container
with a custom configuration.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Now we can write UI tests easily.
The Result
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Now we can trust our tests.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Tools and libraries?
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
Business Logic Tests
● JUnit.
● Mockito.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
API Client Tests
● JUnit.
● Mockito.
● MockWebServer.
Pedro V. Gómez Sánchez - [email protected] - @pedro_g_s - github.com/pedrovgs
UI Tests● JUnit.
● Mockito.
● Robolectric.
● Espresso.
● Dagger.
Pedro V. Gómez Sánchez - [email protected] - @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 - [email protected] - @pedro_g_s - github.com/pedrovgs
Questions?