SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
Android: Testes
Automatizados e TDD
Ivan de Aguirre
@IvAguirre
ivan.aguirre@dextra-sw.com
Agenda

• Conceitos e Terminologia.
• Overview do Framework de
testes.
• O que testar?
• TDD
Conceitos e Terminologia
Teste Unitário

•
•
•
•
•
•

Teste isolado de uma unidade do software.
Unidade precisa ser testável.
Uso de mocks, stubs e fakes.
Execução rápida.
Teste Unitário Clássico: unidade = classe.
TDD: unidade = comportamento.
Teste Unitário

•
•
•
•
•
•

Teste isolado de uma unidade do software.
Unidade precisa ser testável.
Uso de mocks, stubs e fakes.
Execução rápida.
Teste Unitário Clássico: unidade = classe.
TDD: unidade = comportamento.

You can't have unit tests if you don't have units.
@CompSciFact
•
•
•
•
•
•

Teste de API
Testes de endpoint.
Sistema integrado.
Asserções são mais difíceis.
Testes mais difíceis de manter.
Execução mais lenta.
Ex.: método de uma classe de
serviço, chamada à um webservice.
Teste Funcional

• Black Box.
• Execução manual.
• É o que o tester faz.
•
•
•

Teste de UI
Simula uma execução de teste
funcional.
Difíceis de manter.
Execução lenta.
Testes Automatizados

• Integrados à build contínua.
• Feedback constante.
• Todos os testes devem estar
passando sempre.

Não elimina a necessidade de testes manuais.
Afinal, o que esperamos ao escrever
testes?
Afinal, o que esperamos ao escrever
testes?
Feedback
Afinal, o que esperamos ao escrever
testes?
Feedback

Qualidade
Afinal, o que esperamos ao escrever
testes?
Feedback

Evitar bugs

Qualidade
Afinal, o que esperamos ao escrever
testes?
Feedback

Evitar bugs

Qualidade

Agilidade
Afinal, o que esperamos ao escrever
testes?
Feedback

Qualidade

Confiança
Evitar bugs

Agilidade
Framework
Testes Unitários

• Classe base: AndroidTestCase
• Especializações:
o ApplicationTestCase
o LoaderTestCase
o ServiceTestCase
o ProviderTestCase2
public class AppProviderTestCase extends
ProviderTestCase2<DataProvider> {
private MockContentResolver mMockResolver;

	
	
	
	
	

public AppProviderTestCase() {
super(DataProvider.class,
Question.AUTHORITY);
}
@Override
protected void setUp() throws Exception {
	 super.setUp();
	 mMockResolver = getMockContentResolver();
}
public void testInsertAndRetrieveQuestions2() {
Question q = new Question(1L, "Concorda ?");
q.addRecord(getMockContext());
Cursor c = mMockResolver.query(
Question.CONTENT_URI, null, null, null, null);
Question retrieved = new Question(c);
assertEquals(1, c.getCount());
assertEquals(q.getId(), retrieved.getId());
assertEquals(q.getQuestionText(),
retrieved.getQuestionText());
}
Testes com Instrumentação

• Classe base:
InstrumentationTestCase
• Especializações:
o ActivityTestCase
§ ActivityUnitTestCase (onCreate).
§ ActivityInstrumentationTestCase2
(ciclo completo).
public class QuestionActivityTestCase extends
ActivityUnitTestCase<QuestionActivity> {
...
public void testIntent() {
Intent intent = new Intent();
String question = "Pergunta !!!";
intent.putExtra(Question.Columns.QUESTIONTEXT,
question);
	
Activity activity = startActivity(intent, null, null);
	
TextView view = (TextView) activity.findViewById(
R.id.question_text);
	
assertEquals(question, view.getText());
}
}
public class MainActivityTestCase extends
ActivityInstrumentationTestCase2<MainActivity> {
	 public MainActivityTestCase() {
	 	 super(MainActivity.class);
	 }
	 public void testMainStarts() {
	 	 assertNotNull("Activity nao foi criada!",
getActivity());
	 }
}
Instrumentation in =
getInstrumentation();

Ao trabalhar com eventos (click, touch, etc..) cuidado
com atrasos da Thread de UI.
•
•

Testes de UI
uiautomatorview (android_sdk/tools): detecta Views
acessíveis pelo automator e "NAF" nodes.
uiautomator:
o http://developer.android.com/tools/help/uiautomator/
index.html

android:contentDescriptor:
ImageButton, ImageView,
CheckBox.
o android:hint: EditText.
o
Que testes escrever?
O que disse Kent Beck?
I get paid for code that works, not for tests, so my
philosophy is to test as little as possible to reach a given
level of confidence (I suspect this level of confidence is
high compared to industry standards, but that could just be
hubris). If I don't typically make a kind of mistake (like
setting the wrong variables in a constructor), I don't
test for it. I do tend to make sense of test errors, so I'm
extra careful when I have logic with complicated
conditionals. When coding on a team, I modify my
strategy to carefully test code that we, collectively,
tend to get wrong.
Different people will have different testing strategies based
on this philosophy, but that seems reasonable to me given
the immature state of understanding of how tests can best
fit into the inner loop of coding. Ten or twenty years from
now we'll likely have a more universal theory of which
tests to write, which tests not to write, and how to tell
the difference. In the meantime, experimentation seems
in order.
Android Facts
Android Facts

•
•
•
•
•
•

Receitas de bolo ("boilerplate code").
Emulador é uma beleza. Só que não...
Certas classes do framework são difíceis de mockar.
Sistema externo pode complicar os testes.
Asserções “visuais“ são díficeis de automatizar.
Mesmo testes unitários demoram pra executar.
Então: que testes escrever?

•
•
•

Você não precisa testar a API do Android.
Se necessário crie unidades testáveis fora dos
componentes Android e isole o boilerplate code.
Difícil de testar de forma automatizada: execução
assíncrona, layouts, dependência de sistema
remoto, dependência de outras aplicações,
boilerplate code, reação à "condições adversas",
etc.
Dicas

• Classes difíceis de mockar: crie um
wrapper.
• Content Providers são fáceis de testar.
• Testes funcionais automatizados podem ser
difíceis de manter.
• Testes difíceis de escrever ou de manter
podem indicar um problema de design.
• Instrumentação no lugar de testes de UI
automatizados.
Dicas

• Testes de sanidade ajudam a evitar erros.
Ex.: apenas iniciar uma Activity.
• É possível testar execução "assíncrona" de
•

forma unitária, por ex.: https://
android.googlesource.com/platform/
frameworks/base/+/master/test-runner/src/
android/test/LoaderTestCase.java
Teste de Stress com Monkey:http://
developer.android.com/tools/help/
monkey.html
Exemplo: Sincronização
Authenticator.java
AuthenticatorService.java
SyncAdapter.java
SyncService.java
authenticator.xml
syncadapter.xml
public class SyncAdapter extends
AbstractThreadedSyncAdapter{
...
	 @Override
	 public void onPerformSync(...) {
Código que faz a Sincronização

	
}
}
public class SyncAdapter extends
AbstractThreadedSyncAdapter{
...
	 @Override
	 public void onPerformSync(...) {
Código que faz a Sincronização

	
}
}

SyncAdapter é difícil de
testar com testes
unitários!!
public class SyncAdapter extends
AbstractThreadedSyncAdapter{
...
	 @Override
	 public void onPerformSync(...) {
	
}
}
public class SyncAdapter extends
AbstractThreadedSyncAdapter{
...
	 @Override
	 public void onPerformSync(...) {
new QuestionSync(getContext())
	
.doSync();
}
}
public class SyncAdapter extends
AbstractThreadedSyncAdapter{ é uma
QuestionSync
classe Java comum. É
...
mais fácil testá-la!!
	 @Override
	 public void onPerformSync(...) {
new QuestionSync(getContext())
	
.doSync();
}
}
public class QuestionSyncTest

extends
ProviderTestCase2<DataProvider> {

...
public void testReceiveOneQuestionWhenDataBaseIsEmpty() {
Cursor c = mMockResolver.query(Question.CONTENT_URI, null,
null, null, null);
assertEquals(0, c.getCount());
String json = "[{"id":1, "question": "nova pergunta"}]";
	
getSyncForWebServicesReturn(json).doSync();
	
c = mMockResolver.query(Question.CONTENT_URI, null, null,
null, null);
	
assertEquals(1, c.getCount());
}
}
private QuestionSync getSyncForWebServicesReturn(
final String wsReturn) {
	 final QuestionRemoteRepository mock = new
QuestionRemoteRepository() {
	 	 	 @Override
	 	 	 protected String fetchAll() {
	 	 	 	 return wsReturn;
	 	 	 }
	 	 };
	 return new QuestionSync(getMockContext()) {	
	 	
	 	 	 @Override
	 	 	 public void doSync() {
	 	 	 	 this.questionsRepository = mock;
	 	 	 	 super.doSync();
	 	 	 }
	 };
http://robolectric.org/
http://code.google.com/p/android-test-kit/
http://code.google.com/p/robotium/
http://bitbar.com/
TDD
while (true) {
Adicione um novo teste.
Faça o teste compilar.
Execute o teste: vai falhar !!
Implemente da forma mais
simples possível para o teste
passar.
Refatore e mantenha os testes
verdes.
}
TDD - Sugestão de Workflow

•

Execução dos testes é muito lenta para
TDD de fato.

•

Crie unidades com TDD (ou algo parecido
com isso).

•

Depois de alguma iterações adicione
componentes Android.
Perguntas?
Muito Obrigado!
Ivan de Aguirre
@IvAguirre
ivan.aguirre@dextra-sw.com

Mais conteúdo relacionado

Mais procurados

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
 
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
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Diego Pacheco
 
Apresentacao Testes de Unidade
Apresentacao Testes de UnidadeApresentacao Testes de Unidade
Apresentacao Testes de UnidadeAline Ferreira
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
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
 
Android DevConference - Refactoring for RxJava
Android DevConference - Refactoring for RxJavaAndroid DevConference - Refactoring for RxJava
Android DevConference - Refactoring for RxJavaiMasters
 
Teste unitário
Teste unitárioTeste unitário
Teste unitáriodist_bp
 
Indo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidIndo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidEduardo Carrara de Araujo
 
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
 
Testes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e DjangoTestes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e Djangofabiocerqueira
 
Mineração de Repositórios de Defeitos
Mineração de Repositórios de DefeitosMineração de Repositórios de Defeitos
Mineração de Repositórios de DefeitosRodrigo Rocha
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislAdriano Petrich
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddCarlos Santana
 

Mais procurados (19)

Java 12
Java 12Java 12
Java 12
 
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
 
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
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1
 
Testes de Sistema
Testes de SistemaTestes de Sistema
Testes de Sistema
 
Apresentacao Testes de Unidade
Apresentacao Testes de UnidadeApresentacao Testes de Unidade
Apresentacao Testes de Unidade
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
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...
 
Android DevConference - Refactoring for RxJava
Android DevConference - Refactoring for RxJavaAndroid DevConference - Refactoring for RxJava
Android DevConference - Refactoring for RxJava
 
Teste unitário
Teste unitárioTeste unitário
Teste unitário
 
Indo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidIndo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps Android
 
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
 
Testes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e DjangoTestes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e Django
 
Mineração de Repositórios de Defeitos
Mineração de Repositórios de DefeitosMineração de Repositórios de Defeitos
Mineração de Repositórios de Defeitos
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tdd
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 

Semelhante a Android: testes automatizados e TDD

Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidiMasters
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidadeTDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidadeStefan Teixeira
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizadosCristian R. Silva
 
Tdd em django sem desculpas versao final
Tdd em django sem desculpas versao finalTdd em django sem desculpas versao final
Tdd em django sem desculpas versao finalAdriano Petrich
 
JUnit - Selenium
JUnit - SeleniumJUnit - Selenium
JUnit - SeleniumCaue Guerra
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade IIIJoão Lourenço
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosElias Nogueira
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de softwarericardophp
 
Testes de unidade - RP Tec Com
Testes de unidade - RP Tec ComTestes de unidade - RP Tec Com
Testes de unidade - RP Tec ComIgor Rozani
 
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe muniz6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe munizMatheus de Lara Calache
 
Design Patterns (MSDN Webcast)
Design Patterns (MSDN Webcast)Design Patterns (MSDN Webcast)
Design Patterns (MSDN Webcast)Giovanni Bassi
 
CNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous DeliveryCNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous DeliverySamanta Cicilia
 

Semelhante a Android: testes automatizados e TDD (20)

JUnit Sample
JUnit SampleJUnit Sample
JUnit Sample
 
Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de 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 Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDD na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidadeTDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizados
 
Testes com JUnit
Testes com JUnitTestes com JUnit
Testes com JUnit
 
Tdd em django sem desculpas versao final
Tdd em django sem desculpas versao finalTdd em django sem desculpas versao final
Tdd em django sem desculpas versao final
 
Aula JPA
Aula JPAAula JPA
Aula JPA
 
JUnit - Selenium
JUnit - SeleniumJUnit - Selenium
JUnit - Selenium
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Testes unitários e Mocks
Testes unitários e MocksTestes unitários e Mocks
Testes unitários e Mocks
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Testes de unidade - RP Tec Com
Testes de unidade - RP Tec ComTestes de unidade - RP Tec Com
Testes de unidade - RP Tec Com
 
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe muniz6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
 
Design Patterns (MSDN Webcast)
Design Patterns (MSDN Webcast)Design Patterns (MSDN Webcast)
Design Patterns (MSDN Webcast)
 
CNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous DeliveryCNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous Delivery
 
Robotium_Sikuli
Robotium_SikuliRobotium_Sikuli
Robotium_Sikuli
 

Mais de Dextra

Digital Acceleration por Bill Coutinho
Digital Acceleration por Bill CoutinhoDigital Acceleration por Bill Coutinho
Digital Acceleration por Bill CoutinhoDextra
 
Dextra | Como acelerar o Digital na sua empresa usando Tecnologias em Nuvem
Dextra | Como acelerar o Digital na sua empresa usando Tecnologias em NuvemDextra | Como acelerar o Digital na sua empresa usando Tecnologias em Nuvem
Dextra | Como acelerar o Digital na sua empresa usando Tecnologias em NuvemDextra
 
Digital Acceleration
Digital AccelerationDigital Acceleration
Digital AccelerationDextra
 
Innovator's dilemma
Innovator's dilemma Innovator's dilemma
Innovator's dilemma Dextra
 
Design Thinking | Course Material
Design Thinking | Course MaterialDesign Thinking | Course Material
Design Thinking | Course MaterialDextra
 
Dextra mud-sustaining architecture withrefactoring
Dextra mud-sustaining architecture withrefactoringDextra mud-sustaining architecture withrefactoring
Dextra mud-sustaining architecture withrefactoringDextra
 
Classificação de documentos
Classificação de documentosClassificação de documentos
Classificação de documentosDextra
 
Recomendação de conteúdo com apache mahout
Recomendação de conteúdo com apache mahoutRecomendação de conteúdo com apache mahout
Recomendação de conteúdo com apache mahoutDextra
 
Ux na vida real deedz
Ux na vida real  deedzUx na vida real  deedz
Ux na vida real deedzDextra
 
IT For Digital Business | Transformação digital na Natura.
IT For Digital Business | Transformação digital na Natura.IT For Digital Business | Transformação digital na Natura.
IT For Digital Business | Transformação digital na Natura.Dextra
 
IT4DBiz - Tecnologia digital para melhorar a empregabilidade dos alunos Kroton
IT4DBiz - Tecnologia digital para melhorar a empregabilidade dos alunos KrotonIT4DBiz - Tecnologia digital para melhorar a empregabilidade dos alunos Kroton
IT4DBiz - Tecnologia digital para melhorar a empregabilidade dos alunos KrotonDextra
 
IT4DBiz - Inovação e Renovação: a nova agenda da TI moderna
IT4DBiz - Inovação e Renovação: a nova agenda da TI modernaIT4DBiz - Inovação e Renovação: a nova agenda da TI moderna
IT4DBiz - Inovação e Renovação: a nova agenda da TI modernaDextra
 
Desenvolvendo aplicações de negócio na velocidade do Google
Desenvolvendo aplicações de negócio na velocidade do GoogleDesenvolvendo aplicações de negócio na velocidade do Google
Desenvolvendo aplicações de negócio na velocidade do GoogleDextra
 
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...Dextra
 
PGAnalytics - Facilitando sua vida do DBA
PGAnalytics - Facilitando sua vida do DBAPGAnalytics - Facilitando sua vida do DBA
PGAnalytics - Facilitando sua vida do DBADextra
 
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...Dextra
 
IT for Digital Business 2014 - TI baseada em Valores
IT for Digital Business 2014 - TI baseada em ValoresIT for Digital Business 2014 - TI baseada em Valores
IT for Digital Business 2014 - TI baseada em ValoresDextra
 
It for Digital Business 2014 - Negócios Digitais e a Nova TI
It for Digital Business 2014 - Negócios Digitais e a Nova TIIt for Digital Business 2014 - Negócios Digitais e a Nova TI
It for Digital Business 2014 - Negócios Digitais e a Nova TIDextra
 
MobCamp 2014 :: HTML5 x App Store O pêndulo da Tecnologia - Bill Coutinho
MobCamp 2014 :: HTML5 x App Store O pêndulo da Tecnologia - Bill CoutinhoMobCamp 2014 :: HTML5 x App Store O pêndulo da Tecnologia - Bill Coutinho
MobCamp 2014 :: HTML5 x App Store O pêndulo da Tecnologia - Bill CoutinhoDextra
 
MobCamp 2014 :: Android em Tablets - Neto Marin
MobCamp 2014 :: Android em Tablets - Neto MarinMobCamp 2014 :: Android em Tablets - Neto Marin
MobCamp 2014 :: Android em Tablets - Neto MarinDextra
 

Mais de Dextra (20)

Digital Acceleration por Bill Coutinho
Digital Acceleration por Bill CoutinhoDigital Acceleration por Bill Coutinho
Digital Acceleration por Bill Coutinho
 
Dextra | Como acelerar o Digital na sua empresa usando Tecnologias em Nuvem
Dextra | Como acelerar o Digital na sua empresa usando Tecnologias em NuvemDextra | Como acelerar o Digital na sua empresa usando Tecnologias em Nuvem
Dextra | Como acelerar o Digital na sua empresa usando Tecnologias em Nuvem
 
Digital Acceleration
Digital AccelerationDigital Acceleration
Digital Acceleration
 
Innovator's dilemma
Innovator's dilemma Innovator's dilemma
Innovator's dilemma
 
Design Thinking | Course Material
Design Thinking | Course MaterialDesign Thinking | Course Material
Design Thinking | Course Material
 
Dextra mud-sustaining architecture withrefactoring
Dextra mud-sustaining architecture withrefactoringDextra mud-sustaining architecture withrefactoring
Dextra mud-sustaining architecture withrefactoring
 
Classificação de documentos
Classificação de documentosClassificação de documentos
Classificação de documentos
 
Recomendação de conteúdo com apache mahout
Recomendação de conteúdo com apache mahoutRecomendação de conteúdo com apache mahout
Recomendação de conteúdo com apache mahout
 
Ux na vida real deedz
Ux na vida real  deedzUx na vida real  deedz
Ux na vida real deedz
 
IT For Digital Business | Transformação digital na Natura.
IT For Digital Business | Transformação digital na Natura.IT For Digital Business | Transformação digital na Natura.
IT For Digital Business | Transformação digital na Natura.
 
IT4DBiz - Tecnologia digital para melhorar a empregabilidade dos alunos Kroton
IT4DBiz - Tecnologia digital para melhorar a empregabilidade dos alunos KrotonIT4DBiz - Tecnologia digital para melhorar a empregabilidade dos alunos Kroton
IT4DBiz - Tecnologia digital para melhorar a empregabilidade dos alunos Kroton
 
IT4DBiz - Inovação e Renovação: a nova agenda da TI moderna
IT4DBiz - Inovação e Renovação: a nova agenda da TI modernaIT4DBiz - Inovação e Renovação: a nova agenda da TI moderna
IT4DBiz - Inovação e Renovação: a nova agenda da TI moderna
 
Desenvolvendo aplicações de negócio na velocidade do Google
Desenvolvendo aplicações de negócio na velocidade do GoogleDesenvolvendo aplicações de negócio na velocidade do Google
Desenvolvendo aplicações de negócio na velocidade do Google
 
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...
 
PGAnalytics - Facilitando sua vida do DBA
PGAnalytics - Facilitando sua vida do DBAPGAnalytics - Facilitando sua vida do DBA
PGAnalytics - Facilitando sua vida do DBA
 
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...
IT for Digital Business 2014 - Como conciliar velocidade e governança numa ár...
 
IT for Digital Business 2014 - TI baseada em Valores
IT for Digital Business 2014 - TI baseada em ValoresIT for Digital Business 2014 - TI baseada em Valores
IT for Digital Business 2014 - TI baseada em Valores
 
It for Digital Business 2014 - Negócios Digitais e a Nova TI
It for Digital Business 2014 - Negócios Digitais e a Nova TIIt for Digital Business 2014 - Negócios Digitais e a Nova TI
It for Digital Business 2014 - Negócios Digitais e a Nova TI
 
MobCamp 2014 :: HTML5 x App Store O pêndulo da Tecnologia - Bill Coutinho
MobCamp 2014 :: HTML5 x App Store O pêndulo da Tecnologia - Bill CoutinhoMobCamp 2014 :: HTML5 x App Store O pêndulo da Tecnologia - Bill Coutinho
MobCamp 2014 :: HTML5 x App Store O pêndulo da Tecnologia - Bill Coutinho
 
MobCamp 2014 :: Android em Tablets - Neto Marin
MobCamp 2014 :: Android em Tablets - Neto MarinMobCamp 2014 :: Android em Tablets - Neto Marin
MobCamp 2014 :: Android em Tablets - Neto Marin
 

Android: testes automatizados e TDD

  • 1. Android: Testes Automatizados e TDD Ivan de Aguirre @IvAguirre ivan.aguirre@dextra-sw.com
  • 2. Agenda • Conceitos e Terminologia. • Overview do Framework de testes. • O que testar? • TDD
  • 4. Teste Unitário • • • • • • Teste isolado de uma unidade do software. Unidade precisa ser testável. Uso de mocks, stubs e fakes. Execução rápida. Teste Unitário Clássico: unidade = classe. TDD: unidade = comportamento.
  • 5. Teste Unitário • • • • • • Teste isolado de uma unidade do software. Unidade precisa ser testável. Uso de mocks, stubs e fakes. Execução rápida. Teste Unitário Clássico: unidade = classe. TDD: unidade = comportamento. You can't have unit tests if you don't have units. @CompSciFact
  • 6. • • • • • • Teste de API Testes de endpoint. Sistema integrado. Asserções são mais difíceis. Testes mais difíceis de manter. Execução mais lenta. Ex.: método de uma classe de serviço, chamada à um webservice.
  • 7. Teste Funcional • Black Box. • Execução manual. • É o que o tester faz.
  • 8. • • • Teste de UI Simula uma execução de teste funcional. Difíceis de manter. Execução lenta.
  • 9. Testes Automatizados • Integrados à build contínua. • Feedback constante. • Todos os testes devem estar passando sempre. Não elimina a necessidade de testes manuais.
  • 10. Afinal, o que esperamos ao escrever testes?
  • 11. Afinal, o que esperamos ao escrever testes? Feedback
  • 12. Afinal, o que esperamos ao escrever testes? Feedback Qualidade
  • 13. Afinal, o que esperamos ao escrever testes? Feedback Evitar bugs Qualidade
  • 14. Afinal, o que esperamos ao escrever testes? Feedback Evitar bugs Qualidade Agilidade
  • 15. Afinal, o que esperamos ao escrever testes? Feedback Qualidade Confiança Evitar bugs Agilidade
  • 17. Testes Unitários • Classe base: AndroidTestCase • Especializações: o ApplicationTestCase o LoaderTestCase o ServiceTestCase o ProviderTestCase2
  • 18. public class AppProviderTestCase extends ProviderTestCase2<DataProvider> { private MockContentResolver mMockResolver; public AppProviderTestCase() { super(DataProvider.class, Question.AUTHORITY); } @Override protected void setUp() throws Exception { super.setUp(); mMockResolver = getMockContentResolver(); }
  • 19. public void testInsertAndRetrieveQuestions2() { Question q = new Question(1L, "Concorda ?"); q.addRecord(getMockContext()); Cursor c = mMockResolver.query( Question.CONTENT_URI, null, null, null, null); Question retrieved = new Question(c); assertEquals(1, c.getCount()); assertEquals(q.getId(), retrieved.getId()); assertEquals(q.getQuestionText(), retrieved.getQuestionText()); }
  • 20. Testes com Instrumentação • Classe base: InstrumentationTestCase • Especializações: o ActivityTestCase § ActivityUnitTestCase (onCreate). § ActivityInstrumentationTestCase2 (ciclo completo).
  • 21. public class QuestionActivityTestCase extends ActivityUnitTestCase<QuestionActivity> { ... public void testIntent() { Intent intent = new Intent(); String question = "Pergunta !!!"; intent.putExtra(Question.Columns.QUESTIONTEXT, question); Activity activity = startActivity(intent, null, null); TextView view = (TextView) activity.findViewById( R.id.question_text); assertEquals(question, view.getText()); } }
  • 22. public class MainActivityTestCase extends ActivityInstrumentationTestCase2<MainActivity> { public MainActivityTestCase() { super(MainActivity.class); } public void testMainStarts() { assertNotNull("Activity nao foi criada!", getActivity()); } }
  • 23. Instrumentation in = getInstrumentation(); Ao trabalhar com eventos (click, touch, etc..) cuidado com atrasos da Thread de UI.
  • 24. • • Testes de UI uiautomatorview (android_sdk/tools): detecta Views acessíveis pelo automator e "NAF" nodes. uiautomator: o http://developer.android.com/tools/help/uiautomator/ index.html android:contentDescriptor: ImageButton, ImageView, CheckBox. o android:hint: EditText. o
  • 26. O que disse Kent Beck?
  • 27. I get paid for code that works, not for tests, so my philosophy is to test as little as possible to reach a given level of confidence (I suspect this level of confidence is high compared to industry standards, but that could just be hubris). If I don't typically make a kind of mistake (like setting the wrong variables in a constructor), I don't test for it. I do tend to make sense of test errors, so I'm extra careful when I have logic with complicated conditionals. When coding on a team, I modify my strategy to carefully test code that we, collectively, tend to get wrong.
  • 28. Different people will have different testing strategies based on this philosophy, but that seems reasonable to me given the immature state of understanding of how tests can best fit into the inner loop of coding. Ten or twenty years from now we'll likely have a more universal theory of which tests to write, which tests not to write, and how to tell the difference. In the meantime, experimentation seems in order.
  • 30. Android Facts • • • • • • Receitas de bolo ("boilerplate code"). Emulador é uma beleza. Só que não... Certas classes do framework são difíceis de mockar. Sistema externo pode complicar os testes. Asserções “visuais“ são díficeis de automatizar. Mesmo testes unitários demoram pra executar.
  • 31. Então: que testes escrever? • • • Você não precisa testar a API do Android. Se necessário crie unidades testáveis fora dos componentes Android e isole o boilerplate code. Difícil de testar de forma automatizada: execução assíncrona, layouts, dependência de sistema remoto, dependência de outras aplicações, boilerplate code, reação à "condições adversas", etc.
  • 32. Dicas • Classes difíceis de mockar: crie um wrapper. • Content Providers são fáceis de testar. • Testes funcionais automatizados podem ser difíceis de manter. • Testes difíceis de escrever ou de manter podem indicar um problema de design. • Instrumentação no lugar de testes de UI automatizados.
  • 33. Dicas • Testes de sanidade ajudam a evitar erros. Ex.: apenas iniciar uma Activity. • É possível testar execução "assíncrona" de • forma unitária, por ex.: https:// android.googlesource.com/platform/ frameworks/base/+/master/test-runner/src/ android/test/LoaderTestCase.java Teste de Stress com Monkey:http:// developer.android.com/tools/help/ monkey.html
  • 35. public class SyncAdapter extends AbstractThreadedSyncAdapter{ ... @Override public void onPerformSync(...) { Código que faz a Sincronização } }
  • 36. public class SyncAdapter extends AbstractThreadedSyncAdapter{ ... @Override public void onPerformSync(...) { Código que faz a Sincronização } } SyncAdapter é difícil de testar com testes unitários!!
  • 37. public class SyncAdapter extends AbstractThreadedSyncAdapter{ ... @Override public void onPerformSync(...) { } }
  • 38. public class SyncAdapter extends AbstractThreadedSyncAdapter{ ... @Override public void onPerformSync(...) { new QuestionSync(getContext()) .doSync(); } }
  • 39. public class SyncAdapter extends AbstractThreadedSyncAdapter{ é uma QuestionSync classe Java comum. É ... mais fácil testá-la!! @Override public void onPerformSync(...) { new QuestionSync(getContext()) .doSync(); } }
  • 40. public class QuestionSyncTest extends ProviderTestCase2<DataProvider> { ... public void testReceiveOneQuestionWhenDataBaseIsEmpty() { Cursor c = mMockResolver.query(Question.CONTENT_URI, null, null, null, null); assertEquals(0, c.getCount()); String json = "[{"id":1, "question": "nova pergunta"}]"; getSyncForWebServicesReturn(json).doSync(); c = mMockResolver.query(Question.CONTENT_URI, null, null, null, null); assertEquals(1, c.getCount()); } }
  • 41. private QuestionSync getSyncForWebServicesReturn( final String wsReturn) { final QuestionRemoteRepository mock = new QuestionRemoteRepository() { @Override protected String fetchAll() { return wsReturn; } }; return new QuestionSync(getMockContext()) { @Override public void doSync() { this.questionsRepository = mock; super.doSync(); } };
  • 43. TDD
  • 44. while (true) { Adicione um novo teste. Faça o teste compilar. Execute o teste: vai falhar !! Implemente da forma mais simples possível para o teste passar. Refatore e mantenha os testes verdes. }
  • 45. TDD - Sugestão de Workflow • Execução dos testes é muito lenta para TDD de fato. • Crie unidades com TDD (ou algo parecido com isso). • Depois de alguma iterações adicione componentes Android.
  • 47. Muito Obrigado! Ivan de Aguirre @IvAguirre ivan.aguirre@dextra-sw.com