SlideShare une entreprise Scribd logo
1  sur  51
Télécharger pour lire hors ligne
Indo Além com Automação e Testes de Apps
Android
Eduardo Carrara
@DuCarrara
Você já se sentiu
assim em seus
projetos?
Infelizmente não há bala de prata...
Precisamos de segurança,
para Iterações Rápidas.
Testes Automatizados podem ajudar
Então o que vamos explorar hoje?
Recursos Externos & Test Flakiness
Simplificação de Dependências com Mocks
UI Tests e as Camadas de Testes
Recursos Externos e Test Flakiness
“Non-deterministic tests have two problems,
firstly they are useless, secondly they are a
virulent infection that can completely ruin your
entire test suite.” - Martin Fowler
Test Flakiness
Falham e passam aleatoriamente
Diminuem a confiança na suite de testes
Escondem bugs
São difíceis de corrigir
Principais Causas
Concorrência
Dependência de comportamentos indefinidos ou não determinísticos
Código de terceiros que falham e funcionam aleatoriamente
Problemas de infraestrutura
<adicione sua causa aqui>
O que acontece no Android?
Rede
Recursos de Hardware do telefone (ex.: sensores)
Interação com outros apps
Dependências de serviços, apis e sdks externos
Exemplificando
Caso comum: chamadas a serviços REST
Dependência de recursos de rede, disponibilidade de serviços etc
Como resolver o flakiness no teste da chamada de um serviço?
Resposta: Desacoplar e Isolar
Desacoplando e Isolando
Presentation Domain Data
Activity
Fragment
Views
Use Cases
Repositories
Biz Entities
Data Sources
Data Entities
RestAPI
Network
Latency
Service Errs.
etc...
Origem do flakiness
Desacoplando e Isolando
Data
Layer
RestAPI
Server
RestApi
Connection
RestApi
Interface
API Calls
Retrofit
OkHttp
etc
<<builds>>
<<network calls>>
Produção
App
Config
Base URL
<<provides>>
<<injects>>
Desacoplando e Isolando
Test
Mock Local
Server
RestApi
Connection
RestApi
Interface
Retrofit
OkHttp
etc
<<builds>>
<<local calls>>
Teste
Test URL
Test Responses
<<provides>>
<<injects>>
<<creates>>
E o código...
Com Retrofit + OkHttp + MockWebServer
dependencies {
testCompile 'com.squareup.okhttp3:mockwebserver:3.3.0'
}
E o código...
@Before public void setUp() throws IOException {
prepareExpectedTestData();
server = new MockWebServer();
server.enqueue(
new MockResponse()
.setBody(TestServiceResponseFor20150907.getJson())
);
server.start();
restApi = new RestApi(server.url("/").toString());
}
@After public void tearDown() throws IOException {
server.shutdown();
}
Exemplo em NEOM on Github: ListNearEarthObjectsTest.java
E o código...
@Test
public void testSuccessfulListNearEarthObjects() throws Exception {
List<NearEarthObjectJsonEntity> nearEarthObjectJsonEntityList =
restApi.listNearEarthObjectsFor(requestDate);
assertThat(nearEarthObjectJsonEntityList,
is(expectedNearEarthObjectJsonEntityList));
}
Exemplo em NEOM on Github: ListNearEarthObjectsTest.java
Em nosso exemplo...
Isolamos a chamada à nossos serviços
Substituímos o servidor por um componente sob nosso controle
Podemos testar esta camada com testes unitários
Tomamos controle sobre um recurso que poderia ser Flaky
Simplificação com Mocks
Dependências
+ Dependências = + Acoplamento
Alto acoplamento dificulta a criação de testes e a automação
Sistemas 100% desacoplados são raros
Mocking
Objetos dublês
Controle sobre o comportamento e estado
Isolamento da unidade a ser testada
Deve nos ajudar a lidar com as dependências de maneira simples
O que acontece no Android?
Dependência de componentes do framework é frequente
Ex.: Context, Dados de Sensores, Services, Activities etc
Complexidade dos testes aumenta muito
Mockito
API fácil de entender
Configuração de comportamentos e Stubs
Permite a verificação de comportamentos
Mas como funciona?
Exemplo em NEOM on Github: NearEarthObjectListPresenterTest.java
@RunWith(MockitoJUnitRunner. class)
public class NearEarthObjectListPresenterTest {
NearEarthObjectListPresenter presenter;
@Mock private ObservableInteractor<List<NearEarthObject>> mockInteractor;
@Mock private NearEarthObjectsListView mockView;
@Captor
private ArgumentCaptor<Observer<List<NearEarthObject>>> observerArgumentCaptor;
@Before private void setUp() {
presenter = new NearEarthObjectListPresenter( mockInteractor);
}
}
Mas como funciona?
Exemplo em NEOM on Github: NearEarthObjectListPresenterTest.java
@Test public void testSuccessfulPresenterInitialization() {
presenter.attachTo(mockView);
verify(mockView).hideRetry();
verify(mockView).showLoading();
// Here we capture the observer registration to mock the update call
verify(mockInteractor, times(1))
.addObserver(observerArgumentCaptor.capture());
verify(mockInteractor).execute();
observerArgumentCaptor.getValue()
.update(mockInteractor, new ArrayList<NearEarthObject>());
verify(mockView).renderNearEarthObjectsList(any(List.class));
verify(mockView).hideLoading();
}
Robolectric
Testes que dependem do Android na JVM
Provê mocks e stubs ao Android SDK
Execução mais rápida de testes
Demora para disponibilizar versões mais recentes do SDK
Mas como funciona?
Exemplo em NEOM on Github: NearEarthObjectsListActivityTest.java
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP)
public class NearEarthObjectsListActivityTest {
private NearEarthObjectsListActivity nearEarthObjectsListActivity;
@Before
public void setup() {
nearEarthObjectsListActivity =
Robolectric.setupActivity(NearEarthObjectsListActivity.class);
}
}
Mas como funciona?
Exemplo em NEOM on Github: NearEarthObjectsListActivityTest.java
@Test
public void testErrorMessageDisplay() {
final String expectedErrorMessage = "Error message";
nearEarthObjectsListActivity.showError(expectedErrorMessage);
View errorView = findById(nearEarthObjectsListActivity, R.id.error_view);
TextView errorTextView = findById(nearEarthObjectsListActivity,
R.id.error_message_text_view);
assertThat(errorView.getVisibility(), is(VISIBLE));
assertThat(errorTextView.getText().toString(), is(expectedErrorMessage));
}
+
Combinação Poderosa
Testes Rodando na JVM Local = Produtividade
Ajuda com dependências indiretas do Android Framework
Permite o mocking e uso de classes do Android na JVM Local
Exemplificando
Caso: Uso de dados obtidos de um Content Provider
O Content Provider nos provê um Cursor
Como testar um componente que dependa de um Cursor?
Resposta: Mocks*
* A classe MockCursor do Android Framework foi Deprecated na API Level 24. Uma das sugestões é usar o Mockito com ATSL.
Mocking
Component
Content
Provider
Content
Resolver
<<creates>><<uses>>
Produção
<<queries>>
Cursor
<<queries>>
Mocking
Component
Content
Provider
Content
Resolver
<<creates>><<uses>>
Teste
<<queries>>
Cursor
<<queries>>
Componente
a ser Testado
Boilerplate
Mocking
Component
<<mocks>>
<<uses>>
Teste
Cursor
Test
<<tests>>
E o código...
Com Mockito + Robolectric
dependencies {
testCompile 'org.robolectric:robolectric:3.0'
testCompile 'org.mockito:mockito-core:2.+'
}
E o código...
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class BookBorrowingContentProviderMapperTest {
@Before public void prepareTest() {
this.bookBorrowingContentProviderMapper = new BookBorrowingContentProviderMapper();
}
@Test public void testTransformEmptyCursorToBookBorrowing() throws Exception {
Cursor cursor = mock(Cursor.class);
when(cursor.moveToFirst()).thenReturn(false);
List<BookBorrowing> bookBorrowings =
this.bookBorrowingContentProviderMapper.transform(cursor);
assertThat(bookBorrowings, is(empty()));
}
}
Exemplo em Vilibra on Github: BookBorrowingContentProviderMapperTest.java
Em nosso exemplo...
Isolamos o componente a ser testado de dependências boilerplate
Usamos mocks para criar as situações de teste desejadas
Podemos rodar nossos testes como testes unitários na JVM
Usando mocks lembre-se...
Se você cria mocks para tudo você não testa nada
Mocks nos ajudam a isolar o componente a ser testado e
a ter controle sobre dependências e comportamentos externos
Podem ajudar a reduzir flakiness
UI Tests e as Camadas de Testes
Fonte: Layers of Test Automation by Stuart Ashman
Camadas de Testes
Estratégia para automação
de testes
Onde investir nossos
recursos para automação?
Layers of Test by Mike Cohn
Criação e
Manutenção
Execução e
Criação
Custo Tempo
$
$$
$$$
Testes Unitários
Testes de
Integração
UI
Testes Manuais e
Exploratórios $$$$
Testes de Interface do Usuário (UI)
Devem focar em funcionalidades, user stories, casos de uso etc
Testes do ponto de vista do usuário (UI)
Retira o trabalho repetitivo do time
QA pode se dedicar a testes mais complexos
ATST
Algumas Ferramentas
Android Testing Support Library
Execução relativamente rápida
Bem próximo da plataforma e exige conhecimentos de dev.
Utiliza as mesmas ferramentas que usamos para criar as apps
Difícil para não desenvolvedores
Android Testing Support Library
Ferramentas específicas para testes de componentes Android
AndroidJUnitRunner + JUnit4 Rules + Espresso + UIAutomator
Em geral compatível com Api Level 8 ou superior
UIAutomator é compatível com Api Level 18 ou superior
UI Tests
App
External
Dependency
<<mocks>>
Uma abordagem possível
External
DependencyExternal
Dependency
External
Dependency
Test
<<instruments>>
<<tests>>
Espresso
UIAutomator
<<uses>>
Um exemplo simples...
android {
defaultConfig{
testInstrumentationRunner ”android.support.test.runner.AndroidJUnitRunner”
}
}
dependencies {
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}
Exemplo em Vilibra on Github: TestEmptyLoanedBooksList.java
Um exemplo simples...
Exemplo em Vilibra on Github: TestEmptyLoanedBooksList.java
@RunWith(AndroidJUnit4.class)
public class TestEmptyLoanedBooksList {
private Context context;
@Rule public ActivityTestRule<BookListActivity> activityRule =
new ActivityTestRule<>(BookListActivity.class);
@Before public void setUp() {
this.context = getTargetContext();
clearTestData();
}
@Test public void simpleTestEmptyStateOfLoanedBooksList() {
onView(withId(R.id.loaned_book_list_view)).check(matches(not(isDisplayed())));
onView(withId(R.id.empty_book_list_icon)).check(matches(isDisplayed()));
}
}
Testes de Interface do Usuário (UI)
São difíceis de criar e manter
Sua execução geralmente é mais lenta, deixe-os para o final
Selecione a ferramenta adequada aos conhecimentos do time
Quer saber mais? Dê uma olhada em minhas outras apresentações!
Pensamentos Finais
Mantenha o Test Flakiness sob controle
Mocks podem aumentar sua produtividade e controlar o flakiness
Testes de UI são difíceis de criar e manter, use-os sabiamente
Cuide de seus códigos de testes assim como você
cuida de seus códigos de produção!
“… if you are afraid to
change something it is
clearly poorly designed.”
- Martin Fowler
Perguntas?
http://goo.gl/oms4Hs
Material em:
Eduardo Carrara
@DuCarrara
Obrigado!
github.com/ecarrara-araujo
Referências
1. Building Effective Unit Tests by Android Documentation
2. How to Deal With and Eliminate Flaky Tests
3. Flaky Tests at Google and How We Mitigate Them
4. Eradicating Non-Determinism in Tests by Martin Fowler
5. Retrofit 2 – Mocking HTTP Responses
6. The Difference Between Mocks and Stubs by Martin Fowler
7. Mockito
8. Robolectric
9. Layers of Test Automation
10. Android Test Support Library
11. Espresso Test Recorder Docs

Contenu connexe

Tendances

Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitAdolfo Neto
 
Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnitLeonardo Soares
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Android DevConference - Dagger 2: uso avançado em projetos Android
Android DevConference - Dagger 2: uso avançado em projetos AndroidAndroid DevConference - Dagger 2: uso avançado em projetos Android
Android DevConference - Dagger 2: uso avançado em projetos AndroidiMasters
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelManoel Pimentel Medeiros
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDDDextra
 
Teste unitário
Teste unitárioTeste unitário
Teste unitáriodist_bp
 
TDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSTDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSFábio Miranda
 
DevFest 2012 - Esquartejando sua Activity com Fragments
DevFest 2012 - Esquartejando sua Activity com FragmentsDevFest 2012 - Esquartejando sua Activity com Fragments
DevFest 2012 - Esquartejando sua Activity com FragmentsSuelen Carvalho
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIVinícius Thiengo
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComunidade NetPonto
 
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidade
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidadeWordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidade
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidadeWordCamp Floripa
 

Tendances (19)

Palestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnitPalestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnit
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com Junit
 
Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnit
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
Junit
JunitJunit
Junit
 
JUnit
JUnitJUnit
JUnit
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Android DevConference - Dagger 2: uso avançado em projetos Android
Android DevConference - Dagger 2: uso avançado em projetos AndroidAndroid DevConference - Dagger 2: uso avançado em projetos Android
Android DevConference - Dagger 2: uso avançado em projetos Android
 
Java 12
Java 12Java 12
Java 12
 
Power mock
Power mockPower mock
Power mock
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel Pimentel
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDD
 
Fragmentos
FragmentosFragmentos
Fragmentos
 
Teste unitário
Teste unitárioTeste unitário
Teste unitário
 
TDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSTDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOS
 
DevFest 2012 - Esquartejando sua Activity com Fragments
DevFest 2012 - Esquartejando sua Activity com FragmentsDevFest 2012 - Esquartejando sua Activity com Fragments
DevFest 2012 - Esquartejando sua Activity com Fragments
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State API
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
 
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidade
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidadeWordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidade
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidade
 

En vedette

Android DevConference - SOLID no Android
Android DevConference - SOLID no AndroidAndroid DevConference - SOLID no Android
Android DevConference - SOLID no AndroidiMasters
 
InterCon 2016 - Performance, anti-patterns e stacks para desenvolvimento ágil
InterCon 2016 - Performance, anti-patterns e stacks para desenvolvimento ágilInterCon 2016 - Performance, anti-patterns e stacks para desenvolvimento ágil
InterCon 2016 - Performance, anti-patterns e stacks para desenvolvimento ágiliMasters
 
InterCon 2016 - Desafios de conectividade de dispositivos em realtime
InterCon 2016 - Desafios de conectividade de dispositivos em realtimeInterCon 2016 - Desafios de conectividade de dispositivos em realtime
InterCon 2016 - Desafios de conectividade de dispositivos em realtimeiMasters
 
15 Práticas para você aplicar hoje em Search Marketing e Melhorar o seu ROI
15 Práticas para você aplicar hoje em Search Marketing e Melhorar o seu ROI15 Práticas para você aplicar hoje em Search Marketing e Melhorar o seu ROI
15 Práticas para você aplicar hoje em Search Marketing e Melhorar o seu ROITomás Händel Trojan
 
InterCon 2016 - BioHacking: criando dispositivos de biotecnologia OpenSource/...
InterCon 2016 - BioHacking: criando dispositivos de biotecnologia OpenSource/...InterCon 2016 - BioHacking: criando dispositivos de biotecnologia OpenSource/...
InterCon 2016 - BioHacking: criando dispositivos de biotecnologia OpenSource/...iMasters
 
InterCon 2016 - Segurança de identidade digital levando em consideração uma a...
InterCon 2016 - Segurança de identidade digital levando em consideração uma a...InterCon 2016 - Segurança de identidade digital levando em consideração uma a...
InterCon 2016 - Segurança de identidade digital levando em consideração uma a...iMasters
 
Android DevConference - Firebase para desenvolvedores
Android DevConference - Firebase para desenvolvedoresAndroid DevConference - Firebase para desenvolvedores
Android DevConference - Firebase para desenvolvedoresiMasters
 
InterCon 2012 - Metricas - Search Marketing Optimization na Prática
InterCon 2012 - Metricas - Search Marketing Optimization na PráticaInterCon 2012 - Metricas - Search Marketing Optimization na Prática
InterCon 2012 - Metricas - Search Marketing Optimization na PráticaiMasters
 
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...Android DevConference - Live code with Kotlin: construindo o primeiro app usa...
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...iMasters
 
InterCon 2016 - Internet of “Thinking” – IoT sem BS com ESP8266
InterCon 2016 - Internet of “Thinking” – IoT sem BS com ESP8266InterCon 2016 - Internet of “Thinking” – IoT sem BS com ESP8266
InterCon 2016 - Internet of “Thinking” – IoT sem BS com ESP8266iMasters
 
Android DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureAndroid DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureiMasters
 
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecerInterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouqueceriMasters
 
InterCon 2016 - Backend do IoT com RethinkDB e Python
InterCon 2016 - Backend do IoT com RethinkDB e PythonInterCon 2016 - Backend do IoT com RethinkDB e Python
InterCon 2016 - Backend do IoT com RethinkDB e PythoniMasters
 
Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no AndroidNelson Glauber Leal
 

En vedette (14)

Android DevConference - SOLID no Android
Android DevConference - SOLID no AndroidAndroid DevConference - SOLID no Android
Android DevConference - SOLID no Android
 
InterCon 2016 - Performance, anti-patterns e stacks para desenvolvimento ágil
InterCon 2016 - Performance, anti-patterns e stacks para desenvolvimento ágilInterCon 2016 - Performance, anti-patterns e stacks para desenvolvimento ágil
InterCon 2016 - Performance, anti-patterns e stacks para desenvolvimento ágil
 
InterCon 2016 - Desafios de conectividade de dispositivos em realtime
InterCon 2016 - Desafios de conectividade de dispositivos em realtimeInterCon 2016 - Desafios de conectividade de dispositivos em realtime
InterCon 2016 - Desafios de conectividade de dispositivos em realtime
 
15 Práticas para você aplicar hoje em Search Marketing e Melhorar o seu ROI
15 Práticas para você aplicar hoje em Search Marketing e Melhorar o seu ROI15 Práticas para você aplicar hoje em Search Marketing e Melhorar o seu ROI
15 Práticas para você aplicar hoje em Search Marketing e Melhorar o seu ROI
 
InterCon 2016 - BioHacking: criando dispositivos de biotecnologia OpenSource/...
InterCon 2016 - BioHacking: criando dispositivos de biotecnologia OpenSource/...InterCon 2016 - BioHacking: criando dispositivos de biotecnologia OpenSource/...
InterCon 2016 - BioHacking: criando dispositivos de biotecnologia OpenSource/...
 
InterCon 2016 - Segurança de identidade digital levando em consideração uma a...
InterCon 2016 - Segurança de identidade digital levando em consideração uma a...InterCon 2016 - Segurança de identidade digital levando em consideração uma a...
InterCon 2016 - Segurança de identidade digital levando em consideração uma a...
 
Android DevConference - Firebase para desenvolvedores
Android DevConference - Firebase para desenvolvedoresAndroid DevConference - Firebase para desenvolvedores
Android DevConference - Firebase para desenvolvedores
 
InterCon 2012 - Metricas - Search Marketing Optimization na Prática
InterCon 2012 - Metricas - Search Marketing Optimization na PráticaInterCon 2012 - Metricas - Search Marketing Optimization na Prática
InterCon 2012 - Metricas - Search Marketing Optimization na Prática
 
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...Android DevConference - Live code with Kotlin: construindo o primeiro app usa...
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...
 
InterCon 2016 - Internet of “Thinking” – IoT sem BS com ESP8266
InterCon 2016 - Internet of “Thinking” – IoT sem BS com ESP8266InterCon 2016 - Internet of “Thinking” – IoT sem BS com ESP8266
InterCon 2016 - Internet of “Thinking” – IoT sem BS com ESP8266
 
Android DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureAndroid DevConference - Android Clean Architecture
Android DevConference - Android Clean Architecture
 
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecerInterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
 
InterCon 2016 - Backend do IoT com RethinkDB e Python
InterCon 2016 - Backend do IoT com RethinkDB e PythonInterCon 2016 - Backend do IoT com RethinkDB e Python
InterCon 2016 - Backend do IoT com RethinkDB e Python
 
Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no Android
 

Similaire à Indo Além com Automação e Testes de Apps Android

TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Mock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasMock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasDenis L Presciliano
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizadosThiago Ghisi
 
Descomplicando os mocks - pyse
Descomplicando os mocks - pyseDescomplicando os mocks - pyse
Descomplicando os mocks - pyseDouglas Bastos
 
Como testar sua aplicação Android com Robotium
Como testar sua aplicação Android com RobotiumComo testar sua aplicação Android com Robotium
Como testar sua aplicação Android com RobotiumThayse Severiano
 
Automacão de Testes Funcionais com Selenium
Automacão de Testes Funcionais com SeleniumAutomacão de Testes Funcionais com Selenium
Automacão de Testes Funcionais com SeleniumFabrício Lemos
 
CNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous DeliveryCNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous DeliverySamanta Cicilia
 
Paletra sobre TDD, ocorrida no #DevDojo
Paletra sobre TDD, ocorrida no #DevDojoPaletra sobre TDD, ocorrida no #DevDojo
Paletra sobre TDD, ocorrida no #DevDojoflavio1110
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Claudinei Brito Junior
 
Testando sua aplicação asp.net mvc de forma automatizada de ponta a ponta
Testando sua aplicação asp.net mvc de forma automatizada de ponta a pontaTestando sua aplicação asp.net mvc de forma automatizada de ponta a ponta
Testando sua aplicação asp.net mvc de forma automatizada de ponta a pontatdc-globalcode
 

Similaire à Indo Além com Automação e Testes de Apps Android (20)

TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Testes com JUnit
Testes com JUnitTestes com JUnit
Testes com JUnit
 
TDD Primeiro Contato
TDD Primeiro ContatoTDD Primeiro Contato
TDD Primeiro Contato
 
Mock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasMock objects - Teste de código com dependências
Mock objects - Teste de código com dependências
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizados
 
Descomplicando os mocks - pyse
Descomplicando os mocks - pyseDescomplicando os mocks - pyse
Descomplicando os mocks - pyse
 
JUnit Sample
JUnit SampleJUnit Sample
JUnit Sample
 
Robotium_Sikuli
Robotium_SikuliRobotium_Sikuli
Robotium_Sikuli
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Como testar sua aplicação Android com Robotium
Como testar sua aplicação Android com RobotiumComo testar sua aplicação Android com Robotium
Como testar sua aplicação Android com Robotium
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Automacão de Testes Funcionais com Selenium
Automacão de Testes Funcionais com SeleniumAutomacão de Testes Funcionais com Selenium
Automacão de Testes Funcionais com Selenium
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Testes de Sofware
Testes de SofwareTestes de Sofware
Testes de Sofware
 
CNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous DeliveryCNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous Delivery
 
Paletra sobre TDD, ocorrida no #DevDojo
Paletra sobre TDD, ocorrida no #DevDojoPaletra sobre TDD, ocorrida no #DevDojo
Paletra sobre TDD, ocorrida no #DevDojo
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
 
Testando sua aplicação asp.net mvc de forma automatizada de ponta a ponta
Testando sua aplicação asp.net mvc de forma automatizada de ponta a pontaTestando sua aplicação asp.net mvc de forma automatizada de ponta a ponta
Testando sua aplicação asp.net mvc de forma automatizada de ponta a ponta
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 

Plus de iMasters

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroiMasters
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesiMasters
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesiMasters
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...iMasters
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesiMasters
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...iMasters
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsiMasters
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...iMasters
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudiMasters
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza LeiteiMasters
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesiMasters
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosiMasters
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeiMasters
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle MonteiroiMasters
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujoriMasters
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaiMasters
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiiMasters
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...iMasters
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisiMasters
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoiMasters
 

Plus de iMasters (20)

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio Telles
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen Moraes
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita Bernardes
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana Arnos
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio Maujor
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina Karklis
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
 

Indo Além com Automação e Testes de Apps Android

  • 1. Indo Além com Automação e Testes de Apps Android Eduardo Carrara @DuCarrara
  • 2. Você já se sentiu assim em seus projetos?
  • 3. Infelizmente não há bala de prata...
  • 4. Precisamos de segurança, para Iterações Rápidas.
  • 5. Testes Automatizados podem ajudar Então o que vamos explorar hoje? Recursos Externos & Test Flakiness Simplificação de Dependências com Mocks UI Tests e as Camadas de Testes
  • 6. Recursos Externos e Test Flakiness “Non-deterministic tests have two problems, firstly they are useless, secondly they are a virulent infection that can completely ruin your entire test suite.” - Martin Fowler
  • 7. Test Flakiness Falham e passam aleatoriamente Diminuem a confiança na suite de testes Escondem bugs São difíceis de corrigir
  • 8. Principais Causas Concorrência Dependência de comportamentos indefinidos ou não determinísticos Código de terceiros que falham e funcionam aleatoriamente Problemas de infraestrutura <adicione sua causa aqui>
  • 9. O que acontece no Android? Rede Recursos de Hardware do telefone (ex.: sensores) Interação com outros apps Dependências de serviços, apis e sdks externos
  • 10. Exemplificando Caso comum: chamadas a serviços REST Dependência de recursos de rede, disponibilidade de serviços etc Como resolver o flakiness no teste da chamada de um serviço? Resposta: Desacoplar e Isolar
  • 11. Desacoplando e Isolando Presentation Domain Data Activity Fragment Views Use Cases Repositories Biz Entities Data Sources Data Entities RestAPI Network Latency Service Errs. etc... Origem do flakiness
  • 12. Desacoplando e Isolando Data Layer RestAPI Server RestApi Connection RestApi Interface API Calls Retrofit OkHttp etc <<builds>> <<network calls>> Produção App Config Base URL <<provides>> <<injects>>
  • 13. Desacoplando e Isolando Test Mock Local Server RestApi Connection RestApi Interface Retrofit OkHttp etc <<builds>> <<local calls>> Teste Test URL Test Responses <<provides>> <<injects>> <<creates>>
  • 14. E o código... Com Retrofit + OkHttp + MockWebServer dependencies { testCompile 'com.squareup.okhttp3:mockwebserver:3.3.0' }
  • 15. E o código... @Before public void setUp() throws IOException { prepareExpectedTestData(); server = new MockWebServer(); server.enqueue( new MockResponse() .setBody(TestServiceResponseFor20150907.getJson()) ); server.start(); restApi = new RestApi(server.url("/").toString()); } @After public void tearDown() throws IOException { server.shutdown(); } Exemplo em NEOM on Github: ListNearEarthObjectsTest.java
  • 16. E o código... @Test public void testSuccessfulListNearEarthObjects() throws Exception { List<NearEarthObjectJsonEntity> nearEarthObjectJsonEntityList = restApi.listNearEarthObjectsFor(requestDate); assertThat(nearEarthObjectJsonEntityList, is(expectedNearEarthObjectJsonEntityList)); } Exemplo em NEOM on Github: ListNearEarthObjectsTest.java
  • 17. Em nosso exemplo... Isolamos a chamada à nossos serviços Substituímos o servidor por um componente sob nosso controle Podemos testar esta camada com testes unitários Tomamos controle sobre um recurso que poderia ser Flaky
  • 19. Dependências + Dependências = + Acoplamento Alto acoplamento dificulta a criação de testes e a automação Sistemas 100% desacoplados são raros
  • 20. Mocking Objetos dublês Controle sobre o comportamento e estado Isolamento da unidade a ser testada Deve nos ajudar a lidar com as dependências de maneira simples
  • 21. O que acontece no Android? Dependência de componentes do framework é frequente Ex.: Context, Dados de Sensores, Services, Activities etc Complexidade dos testes aumenta muito
  • 22. Mockito API fácil de entender Configuração de comportamentos e Stubs Permite a verificação de comportamentos
  • 23. Mas como funciona? Exemplo em NEOM on Github: NearEarthObjectListPresenterTest.java @RunWith(MockitoJUnitRunner. class) public class NearEarthObjectListPresenterTest { NearEarthObjectListPresenter presenter; @Mock private ObservableInteractor<List<NearEarthObject>> mockInteractor; @Mock private NearEarthObjectsListView mockView; @Captor private ArgumentCaptor<Observer<List<NearEarthObject>>> observerArgumentCaptor; @Before private void setUp() { presenter = new NearEarthObjectListPresenter( mockInteractor); } }
  • 24. Mas como funciona? Exemplo em NEOM on Github: NearEarthObjectListPresenterTest.java @Test public void testSuccessfulPresenterInitialization() { presenter.attachTo(mockView); verify(mockView).hideRetry(); verify(mockView).showLoading(); // Here we capture the observer registration to mock the update call verify(mockInteractor, times(1)) .addObserver(observerArgumentCaptor.capture()); verify(mockInteractor).execute(); observerArgumentCaptor.getValue() .update(mockInteractor, new ArrayList<NearEarthObject>()); verify(mockView).renderNearEarthObjectsList(any(List.class)); verify(mockView).hideLoading(); }
  • 25. Robolectric Testes que dependem do Android na JVM Provê mocks e stubs ao Android SDK Execução mais rápida de testes Demora para disponibilizar versões mais recentes do SDK
  • 26. Mas como funciona? Exemplo em NEOM on Github: NearEarthObjectsListActivityTest.java @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP) public class NearEarthObjectsListActivityTest { private NearEarthObjectsListActivity nearEarthObjectsListActivity; @Before public void setup() { nearEarthObjectsListActivity = Robolectric.setupActivity(NearEarthObjectsListActivity.class); } }
  • 27. Mas como funciona? Exemplo em NEOM on Github: NearEarthObjectsListActivityTest.java @Test public void testErrorMessageDisplay() { final String expectedErrorMessage = "Error message"; nearEarthObjectsListActivity.showError(expectedErrorMessage); View errorView = findById(nearEarthObjectsListActivity, R.id.error_view); TextView errorTextView = findById(nearEarthObjectsListActivity, R.id.error_message_text_view); assertThat(errorView.getVisibility(), is(VISIBLE)); assertThat(errorTextView.getText().toString(), is(expectedErrorMessage)); }
  • 28. + Combinação Poderosa Testes Rodando na JVM Local = Produtividade Ajuda com dependências indiretas do Android Framework Permite o mocking e uso de classes do Android na JVM Local
  • 29. Exemplificando Caso: Uso de dados obtidos de um Content Provider O Content Provider nos provê um Cursor Como testar um componente que dependa de um Cursor? Resposta: Mocks* * A classe MockCursor do Android Framework foi Deprecated na API Level 24. Uma das sugestões é usar o Mockito com ATSL.
  • 33. E o código... Com Mockito + Robolectric dependencies { testCompile 'org.robolectric:robolectric:3.0' testCompile 'org.mockito:mockito-core:2.+' }
  • 34. E o código... @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class) public class BookBorrowingContentProviderMapperTest { @Before public void prepareTest() { this.bookBorrowingContentProviderMapper = new BookBorrowingContentProviderMapper(); } @Test public void testTransformEmptyCursorToBookBorrowing() throws Exception { Cursor cursor = mock(Cursor.class); when(cursor.moveToFirst()).thenReturn(false); List<BookBorrowing> bookBorrowings = this.bookBorrowingContentProviderMapper.transform(cursor); assertThat(bookBorrowings, is(empty())); } } Exemplo em Vilibra on Github: BookBorrowingContentProviderMapperTest.java
  • 35. Em nosso exemplo... Isolamos o componente a ser testado de dependências boilerplate Usamos mocks para criar as situações de teste desejadas Podemos rodar nossos testes como testes unitários na JVM
  • 36. Usando mocks lembre-se... Se você cria mocks para tudo você não testa nada Mocks nos ajudam a isolar o componente a ser testado e a ter controle sobre dependências e comportamentos externos Podem ajudar a reduzir flakiness
  • 37. UI Tests e as Camadas de Testes
  • 38. Fonte: Layers of Test Automation by Stuart Ashman Camadas de Testes Estratégia para automação de testes Onde investir nossos recursos para automação? Layers of Test by Mike Cohn
  • 39. Criação e Manutenção Execução e Criação Custo Tempo $ $$ $$$ Testes Unitários Testes de Integração UI Testes Manuais e Exploratórios $$$$
  • 40. Testes de Interface do Usuário (UI) Devem focar em funcionalidades, user stories, casos de uso etc Testes do ponto de vista do usuário (UI) Retira o trabalho repetitivo do time QA pode se dedicar a testes mais complexos
  • 42. Android Testing Support Library Execução relativamente rápida Bem próximo da plataforma e exige conhecimentos de dev. Utiliza as mesmas ferramentas que usamos para criar as apps Difícil para não desenvolvedores
  • 43. Android Testing Support Library Ferramentas específicas para testes de componentes Android AndroidJUnitRunner + JUnit4 Rules + Espresso + UIAutomator Em geral compatível com Api Level 8 ou superior UIAutomator é compatível com Api Level 18 ou superior
  • 44. UI Tests App External Dependency <<mocks>> Uma abordagem possível External DependencyExternal Dependency External Dependency Test <<instruments>> <<tests>> Espresso UIAutomator <<uses>>
  • 45. Um exemplo simples... android { defaultConfig{ testInstrumentationRunner ”android.support.test.runner.AndroidJUnitRunner” } } dependencies { androidTestCompile 'com.android.support.test:runner:0.5' androidTestCompile 'com.android.support.test:rules:0.5' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' } Exemplo em Vilibra on Github: TestEmptyLoanedBooksList.java
  • 46. Um exemplo simples... Exemplo em Vilibra on Github: TestEmptyLoanedBooksList.java @RunWith(AndroidJUnit4.class) public class TestEmptyLoanedBooksList { private Context context; @Rule public ActivityTestRule<BookListActivity> activityRule = new ActivityTestRule<>(BookListActivity.class); @Before public void setUp() { this.context = getTargetContext(); clearTestData(); } @Test public void simpleTestEmptyStateOfLoanedBooksList() { onView(withId(R.id.loaned_book_list_view)).check(matches(not(isDisplayed()))); onView(withId(R.id.empty_book_list_icon)).check(matches(isDisplayed())); } }
  • 47. Testes de Interface do Usuário (UI) São difíceis de criar e manter Sua execução geralmente é mais lenta, deixe-os para o final Selecione a ferramenta adequada aos conhecimentos do time Quer saber mais? Dê uma olhada em minhas outras apresentações!
  • 48. Pensamentos Finais Mantenha o Test Flakiness sob controle Mocks podem aumentar sua produtividade e controlar o flakiness Testes de UI são difíceis de criar e manter, use-os sabiamente Cuide de seus códigos de testes assim como você cuida de seus códigos de produção!
  • 49. “… if you are afraid to change something it is clearly poorly designed.” - Martin Fowler Perguntas? http://goo.gl/oms4Hs Material em:
  • 51. Referências 1. Building Effective Unit Tests by Android Documentation 2. How to Deal With and Eliminate Flaky Tests 3. Flaky Tests at Google and How We Mitigate Them 4. Eradicating Non-Determinism in Tests by Martin Fowler 5. Retrofit 2 – Mocking HTTP Responses 6. The Difference Between Mocks and Stubs by Martin Fowler 7. Mockito 8. Robolectric 9. Layers of Test Automation 10. Android Test Support Library 11. Espresso Test Recorder Docs