SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
Testes: Por onde Começar?
Eduardo Carrara
@DuCarrara
Por que criar testes
Automatizados?
Encontre a motivação certa para fazê-lo!
Eliminar a parte chata do trabalho
Qualidade de Vida do Time o/
Medo de mexer no código?
Refatorar nem pensar?
Em momentos diferentes...
Projetos Novos (do zero)
Projetos Antigos (legados)
Adicionando Novas Funcionalidades
Dando Manutenção ao Código
Todos estamos
então...
Por onde começar?
Comece Pequeno
Testes Unitários Rulez!
Del N on Flicker - CC BY 2.0
Escolha o Megazord
Extraia a funcionalidade
Crie o teste
Refatore
Seu primeiro Teste Unitário
Inclua as dependências
Crie os testes
Rode os Testes
Inclua as Dependências
dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.hamcrest:hamcrest-integration:1.3'
}
Crie o Teste
public class UtilityTest {
private static final String inputDateString = "20150403";
@Test
public void testIfGetFormattedMonthDayReturnExpectedFormat() throws Exception {
final String expectedDateFormat = "yyyy, MMMM dd";
final String expectedResult = (new SimpleDateFormat(expectedDateFormat))
.format(getExpectedDate());
String result = Utility.getFormattedMonthDay(expectedDateFormat, inputDateString);
//Hamcrest
assertThat("Date was not correctly formatted.", result, is(expectedResult));
//JUnit Puro
assertEquals("Date was not correctly formatted.", expectedResult, result);
}
}
Local: <caminho para seu projeto>/app/src/test/java
Rode o Teste
Rode o Teste
/build/reports/tests
Dicas para criar seus Testes Unitários
#1 Foque em partes pequenas e independentes do código
#2 Cuidado com as Dependências
#3 Priorize partes críticas do sistema
#4 Extraia, Teste e Refatore
#2 Cuidado com as Dependências
Outras unidades de código
Frameworks e APIs de terceiros
Externas como conexão, componentes de hardware etc
Android
Mocking
Objetos dublês
Controle sobre o Comportamento e Estado
Isolamento da Unidade a ser Testada
Mockito
API fácil de entender
Configuração de comportamentos e Stubs
Permite a verificação de comportamentos
Mockito: Dependência
dependencies {
testCompile 'org.mockito:mockito-core:2.+'
}
Mockito: Verificação de Comportamento
@RunWith(MockitoJUnitRunner.class)
public class ThreadExecutorTest {
private Executor executor;
@Before public void setUp() throws Exception {
this.executor = new ThreadExecutor();
}
@Test public void testSuccessfulInteractorExecution() {
Interactor interactor = mock(Interactor.class);
this.executor.execute(interactor);
verify(interactor).operation();
}
}
Local: <caminho para seu projeto>/app/src/test/java
Mockito: Stub de Estado
@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()));
}
}
Local: <caminho para seu projeto>/app/src/test/java
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
Robolectric: Dependência
dependencies {
testCompile 'org.robolectric:robolectric:3.0'
}
Uso do Robolectric
@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()));
}
}
Local: <caminho para seu projeto>/app/src/test/java
Android Testing Support Library
Ferramentas específicas para testes de componentes Android
AndroidJUnitRunner + JUnit4 Rules + Espresso + UIAutomator
Muito focado em testes de Interface do Usuário
Em geral compatível com Api Level 8 ou superior
UIAutomator é compatível com Api Level 18 ou superior
ATSL: Dependências
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'
}
ATSL: Espresso
@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()));
}
}
Local: <caminho para seu projeto>/app/src/androidTest/java
AS 2.2 Preview 4: Espresso Recorder
AS 2.2 Preview 4: Espresso Recorder
AS 2.2 P4 Espresso Recorder
É um pouco lento para capturar os eventos
Bastante prático para criar asserções
Ainda não lida com transições e loading entre Activities/Fragments
Bom para gerar o código inicial do teste de UI
Pensamentos Finais
Automatizar testes é algo muito complexo
Tenha paciência e comece pequeno
Os testes unitários são a base de uma boa suite de testes
Pratique!
“… if you are afraid to
change something it is
clearly poorly designed.”
- Martin Fowler
Eduardo Carrara
@DuCarrara
Obrigado!
github.com/ecarrara-araujo
Referências
1. Building Effective Unit Tests by Android Documentation
2. Primeiros Passos em Automação de Testes by Stefan Teixeira
3. JUnit.org e Hamcrest.org
4. The Difference Between Mocks and Stubs by Martin Fowler
5. Mockito
6. Robolectric
7. Android Test Support Library
8. Espresso Test Recorder Docs

Mais conteúdo relacionado

Mais procurados

Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Teste unitário
Teste unitárioTeste unitário
Teste unitáriodist_bp
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger daggertdc-globalcode
 
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
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Bernardo Fontes
 
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
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de SoftwareMaurício Aniche
 
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
 

Mais procurados (18)

TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
JUnit
JUnitJUnit
JUnit
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Palestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnitPalestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnit
 
Power mock
Power mockPower mock
Power mock
 
Junit
JunitJunit
Junit
 
Java 12
Java 12Java 12
Java 12
 
Teste unitário
Teste unitárioTeste unitário
Teste unitário
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger dagger
 
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 (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Testes de Sofware
Testes de SofwareTestes de Sofware
Testes de Sofware
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?
 
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
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de Software
 
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
 

Destaque

ALM no Visual Studio 2010
ALM no Visual Studio 2010ALM no Visual Studio 2010
ALM no Visual Studio 2010Waldyr Felix
 
Desenvolvimento orientado a testes
Desenvolvimento orientado a testesDesenvolvimento orientado a testes
Desenvolvimento orientado a testesCarlos Santana
 
01 Introdução - Contextualização Engenharia de Software
01 Introdução - Contextualização Engenharia de Software01 Introdução - Contextualização Engenharia de Software
01 Introdução - Contextualização Engenharia de SoftwareWaldemar Roberti
 
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...Patrícia Araújo Gonçalves
 
02 Introdução à engenharia de software - conceitos fundamentais
02 Introdução à engenharia de software - conceitos fundamentais02 Introdução à engenharia de software - conceitos fundamentais
02 Introdução à engenharia de software - conceitos fundamentaisWaldemar Roberti
 
Ciclo de vida de testes implementado v2
Ciclo de vida de testes implementado   v2Ciclo de vida de testes implementado   v2
Ciclo de vida de testes implementado v2douglasdc7m
 

Destaque (20)

Android wear
Android wearAndroid wear
Android wear
 
Tudo sobre listas no android
Tudo sobre listas no androidTudo sobre listas no android
Tudo sobre listas no android
 
2016 - Por que mobile?
2016 - Por que mobile?2016 - Por que mobile?
2016 - Por que mobile?
 
ALM no Visual Studio 2010
ALM no Visual Studio 2010ALM no Visual Studio 2010
ALM no Visual Studio 2010
 
04 Unified process
04 Unified process04 Unified process
04 Unified process
 
Desenvolvimento orientado a testes
Desenvolvimento orientado a testesDesenvolvimento orientado a testes
Desenvolvimento orientado a testes
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
 
05 agile
05 agile05 agile
05 agile
 
01 Introdução - Contextualização Engenharia de Software
01 Introdução - Contextualização Engenharia de Software01 Introdução - Contextualização Engenharia de Software
01 Introdução - Contextualização Engenharia de Software
 
Modelagem Ágil
Modelagem ÁgilModelagem Ágil
Modelagem Ágil
 
Automatização de Ambientes CI & CD & DevOps
Automatização de Ambientes CI & CD & DevOpsAutomatização de Ambientes CI & CD & DevOps
Automatização de Ambientes CI & CD & DevOps
 
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
00 Apresentação
00 Apresentação00 Apresentação
00 Apresentação
 
06 Requisitos
06 Requisitos06 Requisitos
06 Requisitos
 
Panorama sobre Teste de Software
Panorama sobre Teste de SoftwarePanorama sobre Teste de Software
Panorama sobre Teste de Software
 
Ch23
Ch23Ch23
Ch23
 
02 Introdução à engenharia de software - conceitos fundamentais
02 Introdução à engenharia de software - conceitos fundamentais02 Introdução à engenharia de software - conceitos fundamentais
02 Introdução à engenharia de software - conceitos fundamentais
 
07 Modelagem (Sommer)
07 Modelagem (Sommer)07 Modelagem (Sommer)
07 Modelagem (Sommer)
 
Ciclo de vida de testes implementado v2
Ciclo de vida de testes implementado   v2Ciclo de vida de testes implementado   v2
Ciclo de vida de testes implementado v2
 

Semelhante a Testes: Por onde Começar?

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
 
Mocking Test - Outubro/2015
Mocking Test - Outubro/2015Mocking Test - Outubro/2015
Mocking Test - Outubro/2015Renato Groff
 
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
 
Testes para Android de ponta a ponta
Testes para Android de ponta a pontaTestes para Android de ponta a ponta
Testes para Android de ponta a pontaElias Nogueira
 
Como criar e executar testes paralelos web usando Selenium e containers
Como criar e executar testes paralelos web usando Selenium e containersComo criar e executar testes paralelos web usando Selenium e containers
Como criar e executar testes paralelos web usando Selenium e containersElias Nogueira
 
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
 
Mocking Test - GDG-SP - Setembro/2016
Mocking Test - GDG-SP - Setembro/2016Mocking Test - GDG-SP - Setembro/2016
Mocking Test - GDG-SP - Setembro/2016Renato Groff
 
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
 
Dojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarDojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarLuiz Ribeiro
 
Mocking Test - ThinkUp! - Abril/2017
Mocking Test - ThinkUp! - Abril/2017Mocking Test - ThinkUp! - Abril/2017
Mocking Test - ThinkUp! - Abril/2017Renato Groff
 
C# 6.0 .net coders
C# 6.0   .net codersC# 6.0   .net coders
C# 6.0 .net codersRenato Groff
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesedgarddavidson.com
 

Semelhante a Testes: Por onde Começar? (20)

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
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Mocking Test - Outubro/2015
Mocking Test - Outubro/2015Mocking Test - Outubro/2015
Mocking Test - Outubro/2015
 
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
 
Testes para Android de ponta a ponta
Testes para Android de ponta a pontaTestes para Android de ponta a ponta
Testes para Android de ponta a ponta
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Como criar e executar testes paralelos web usando Selenium e containers
Como criar e executar testes paralelos web usando Selenium e containersComo criar e executar testes paralelos web usando Selenium e containers
Como criar e executar testes paralelos web usando Selenium e containers
 
Robotium_Sikuli
Robotium_SikuliRobotium_Sikuli
Robotium_Sikuli
 
JUnit Sample
JUnit SampleJUnit Sample
JUnit Sample
 
Mocking Test
Mocking TestMocking Test
Mocking Test
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Mocking Test - GDG-SP - Setembro/2016
Mocking Test - GDG-SP - Setembro/2016Mocking Test - GDG-SP - Setembro/2016
Mocking Test - GDG-SP - Setembro/2016
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 
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
 
Dojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarDojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCar
 
Grails
GrailsGrails
Grails
 
Mocking Test - ThinkUp! - Abril/2017
Mocking Test - ThinkUp! - Abril/2017Mocking Test - ThinkUp! - Abril/2017
Mocking Test - ThinkUp! - Abril/2017
 
C# 6.0 .net coders
C# 6.0   .net codersC# 6.0   .net coders
C# 6.0 .net coders
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrões
 

Mais de Eduardo Carrara de Araujo

Só um appzinho aê!? - O guia de sobrevivência para o dev da ideia inovadora a...
Só um appzinho aê!? - O guia de sobrevivência para o dev da ideia inovadora a...Só um appzinho aê!? - O guia de sobrevivência para o dev da ideia inovadora a...
Só um appzinho aê!? - O guia de sobrevivência para o dev da ideia inovadora a...Eduardo Carrara de Araujo
 
Implementation of a Participatory Sensing Solution to Collect Data About Pave...
Implementation of a Participatory Sensing Solution to Collect Data About Pave...Implementation of a Participatory Sensing Solution to Collect Data About Pave...
Implementation of a Participatory Sensing Solution to Collect Data About Pave...Eduardo Carrara de Araujo
 
Utilizando Espresso e UIAutomator no Teste de Apps Android
Utilizando Espresso e UIAutomator no Teste de Apps AndroidUtilizando Espresso e UIAutomator no Teste de Apps Android
Utilizando Espresso e UIAutomator no Teste de Apps AndroidEduardo Carrara de Araujo
 

Mais de Eduardo Carrara de Araujo (18)

Só um appzinho aê!? - O guia de sobrevivência para o dev da ideia inovadora a...
Só um appzinho aê!? - O guia de sobrevivência para o dev da ideia inovadora a...Só um appzinho aê!? - O guia de sobrevivência para o dev da ideia inovadora a...
Só um appzinho aê!? - O guia de sobrevivência para o dev da ideia inovadora a...
 
Melhorando seu App com Kotlin e Testes
Melhorando seu App com Kotlin e TestesMelhorando seu App com Kotlin e Testes
Melhorando seu App com Kotlin e Testes
 
Android apps ci
Android apps ciAndroid apps ci
Android apps ci
 
Android ndk: Entering the native world
Android ndk: Entering the native worldAndroid ndk: Entering the native world
Android ndk: Entering the native world
 
Android NDK: Entrando no Mundo Nativo
Android NDK: Entrando no Mundo NativoAndroid NDK: Entrando no Mundo Nativo
Android NDK: Entrando no Mundo Nativo
 
Implementation of a Participatory Sensing Solution to Collect Data About Pave...
Implementation of a Participatory Sensing Solution to Collect Data About Pave...Implementation of a Participatory Sensing Solution to Collect Data About Pave...
Implementation of a Participatory Sensing Solution to Collect Data About Pave...
 
GDG ABC - Aventura 2015
GDG ABC - Aventura 2015GDG ABC - Aventura 2015
GDG ABC - Aventura 2015
 
Android Test Automation Workshop
Android Test Automation WorkshopAndroid Test Automation Workshop
Android Test Automation Workshop
 
Why mobile?
Why mobile?Why mobile?
Why mobile?
 
Android M - Getting Started
Android M - Getting StartedAndroid M - Getting Started
Android M - Getting Started
 
Testando Sua App Android na Nuvem
Testando Sua App Android na NuvemTestando Sua App Android na Nuvem
Testando Sua App Android na Nuvem
 
Utilizando Espresso e UIAutomator no Teste de Apps Android
Utilizando Espresso e UIAutomator no Teste de Apps AndroidUtilizando Espresso e UIAutomator no Teste de Apps Android
Utilizando Espresso e UIAutomator no Teste de Apps Android
 
Começando com Android (#AndroidOnIntel)
Começando com Android (#AndroidOnIntel)Começando com Android (#AndroidOnIntel)
Começando com Android (#AndroidOnIntel)
 
Android Auto Basics
Android Auto BasicsAndroid Auto Basics
Android Auto Basics
 
Debugging in Android
Debugging in AndroidDebugging in Android
Debugging in Android
 
Android 101: Do Plano ao Play
Android 101: Do Plano ao PlayAndroid 101: Do Plano ao Play
Android 101: Do Plano ao Play
 
Testing Your App in the Cloud
Testing Your App in the CloudTesting Your App in the Cloud
Testing Your App in the Cloud
 
Android 101: Do Plano ao Play em 30 minutos
Android 101: Do Plano ao Play em 30 minutosAndroid 101: Do Plano ao Play em 30 minutos
Android 101: Do Plano ao Play em 30 minutos
 

Testes: Por onde Começar?

  • 1. Testes: Por onde Começar? Eduardo Carrara @DuCarrara
  • 2. Por que criar testes Automatizados?
  • 3. Encontre a motivação certa para fazê-lo! Eliminar a parte chata do trabalho Qualidade de Vida do Time o/ Medo de mexer no código? Refatorar nem pensar?
  • 4. Em momentos diferentes... Projetos Novos (do zero) Projetos Antigos (legados) Adicionando Novas Funcionalidades Dando Manutenção ao Código Todos estamos
  • 7. Del N on Flicker - CC BY 2.0 Escolha o Megazord Extraia a funcionalidade Crie o teste Refatore
  • 8. Seu primeiro Teste Unitário Inclua as dependências Crie os testes Rode os Testes
  • 9. Inclua as Dependências dependencies { testCompile 'junit:junit:4.12' testCompile 'org.hamcrest:hamcrest-integration:1.3' }
  • 10. Crie o Teste public class UtilityTest { private static final String inputDateString = "20150403"; @Test public void testIfGetFormattedMonthDayReturnExpectedFormat() throws Exception { final String expectedDateFormat = "yyyy, MMMM dd"; final String expectedResult = (new SimpleDateFormat(expectedDateFormat)) .format(getExpectedDate()); String result = Utility.getFormattedMonthDay(expectedDateFormat, inputDateString); //Hamcrest assertThat("Date was not correctly formatted.", result, is(expectedResult)); //JUnit Puro assertEquals("Date was not correctly formatted.", expectedResult, result); } } Local: <caminho para seu projeto>/app/src/test/java
  • 13. Dicas para criar seus Testes Unitários #1 Foque em partes pequenas e independentes do código #2 Cuidado com as Dependências #3 Priorize partes críticas do sistema #4 Extraia, Teste e Refatore
  • 14. #2 Cuidado com as Dependências Outras unidades de código Frameworks e APIs de terceiros Externas como conexão, componentes de hardware etc Android
  • 15. Mocking Objetos dublês Controle sobre o Comportamento e Estado Isolamento da Unidade a ser Testada
  • 16. Mockito API fácil de entender Configuração de comportamentos e Stubs Permite a verificação de comportamentos
  • 17. Mockito: Dependência dependencies { testCompile 'org.mockito:mockito-core:2.+' }
  • 18. Mockito: Verificação de Comportamento @RunWith(MockitoJUnitRunner.class) public class ThreadExecutorTest { private Executor executor; @Before public void setUp() throws Exception { this.executor = new ThreadExecutor(); } @Test public void testSuccessfulInteractorExecution() { Interactor interactor = mock(Interactor.class); this.executor.execute(interactor); verify(interactor).operation(); } } Local: <caminho para seu projeto>/app/src/test/java
  • 19. Mockito: Stub de Estado @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())); } } Local: <caminho para seu projeto>/app/src/test/java
  • 20. 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
  • 21. Robolectric: Dependência dependencies { testCompile 'org.robolectric:robolectric:3.0' }
  • 22. Uso do Robolectric @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())); } } Local: <caminho para seu projeto>/app/src/test/java
  • 23. Android Testing Support Library Ferramentas específicas para testes de componentes Android AndroidJUnitRunner + JUnit4 Rules + Espresso + UIAutomator Muito focado em testes de Interface do Usuário Em geral compatível com Api Level 8 ou superior UIAutomator é compatível com Api Level 18 ou superior
  • 24. ATSL: Dependências 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' }
  • 25. ATSL: Espresso @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())); } } Local: <caminho para seu projeto>/app/src/androidTest/java
  • 26. AS 2.2 Preview 4: Espresso Recorder
  • 27. AS 2.2 Preview 4: Espresso Recorder
  • 28. AS 2.2 P4 Espresso Recorder É um pouco lento para capturar os eventos Bastante prático para criar asserções Ainda não lida com transições e loading entre Activities/Fragments Bom para gerar o código inicial do teste de UI
  • 29. Pensamentos Finais Automatizar testes é algo muito complexo Tenha paciência e comece pequeno Os testes unitários são a base de uma boa suite de testes Pratique!
  • 30. “… if you are afraid to change something it is clearly poorly designed.” - Martin Fowler
  • 32. Referências 1. Building Effective Unit Tests by Android Documentation 2. Primeiros Passos em Automação de Testes by Stefan Teixeira 3. JUnit.org e Hamcrest.org 4. The Difference Between Mocks and Stubs by Martin Fowler 5. Mockito 6. Robolectric 7. Android Test Support Library 8. Espresso Test Recorder Docs