SlideShare ist ein Scribd-Unternehmen logo
1 von 71
Downloaden Sie, um offline zu lesen
Conceitos, práticas e motivações
Testes no Android
Eu
Chapter Lead de Android
www.rafaeltoledo.net
twitter.com/_rafaeltoledo
github.com/rafaeltoledo
blog.concretesolutions.com.br
Por que escrever Testes?
o dilema do programador mobile
Garantir que algo funciona da
forma como deveria
Documentação de
comportamento de um sistema
Garantir que uma mudança não
quebra outras partes do app
A pirâmide refere-se ao
desenvolvimento backend
Front-end em si é interface (GUI)
Ao contrário dos apps 100%
offline, se muitas regras de
negócio concentram-se no
front-end, é sinal que sua
arquitetura está errada
Por que tenho 2 pastas de Testes?
o que são as pastas test e androidTest no meu projeto?
Testes unitários / funcionais
instrumentados, que necessitam das
classes do Android para a execução.
São executados em emuladores ou
devices reais
androidTest
Testes unitários executados na JVM
(máquina local)
Componentes externos geralmente
são mockados (como as classes do
Android)*
test
Testes unitários executados na JVM
(máquina local)
Componentes externos geralmente
são mockados (como as classes do
Android)*
Robolectric
escopos de dependências
// somente test
testCompile 'junit:junit:4.12'
testCompile 'org.robolectric:robolectric:3.1.2'
// somente androidTest
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
Bibliotecas e Frameworks
quem poderá nos ajudar?
Framework para criação de testes ‘repetíveis’
Estrutura da execução dos testes
Biblioteca de asserções
public class MeuTeste {
@Test
public void stuffTest() {
Assert.assertEquals(2, 1 + 1);
}
}
Biblioteca para a criação de asserções mais intuitivas e legíveis
Se tornou parte do JUnit
assertThat(1 + 1, is(2));
assertThat(lista, contains(2, 3, 4, 8);
String texto = "Android no TDC"
assertThat(texto, containsString("Android");
assertThat(texto, not(containsString("iOS");
Hamcrest
Biblioteca para a criação de asserções mais intuitivas, legíveis e
fluentes
Possui uma extensão chamada AssertJ Android feita pela Square
assertThat(sociedadeDoAnel)
.hasSize(9)
.contains(frodo, sam)
.doesNotContain(sauron);
// AssertJ Android
assertThat(view).isGone();
AssertJ
Biblioteca para a criação de mocks
List mockedList = mock(List.class);
mockedList.add("one");
mockedList.clear();
verify(mockedList).add("one");
verify(mockedList).clear();
LinkedList mockedList = mock(LinkedList.class);
when(mockedList.get(0)).thenReturn("first");
// Vai mostrar "first"
System.out.println(mockedList.get(0));
// Vai mostrar null, já que não mockamos o comportamento
System.out.println(mockedList.get(999));
Framework para a criação de testes Instrumentados no Android
Espresso
AndroidJUnitRunner
JUnit4 Rules
UI Automator
Android Testing
Support Library
Espresso
Biblioteca para a escrita de testes unitários de UI para o
Android
onView(withId(R.id.name_field)).perform(typeText("TDC"));
onView(withId(R.id.greet_button)).perform(click());
onView(withText("Olá, TDC!")).check(matches(isDisplayed());
Android Testing
Support Library
AndroidJUnitRunner
Suporte ao JUnit 4, acesso a informações da instrumentação (contexto,
execução, etc.), filtro de testes e distribuição
Rules
Possibilita testar Activity, Intent e Service
UiAutomator
Testes de UI no Android de forma “livre” Android Testing
Support Library
“Robolectric é um framework de testes unitários que desacopla a
dependência do jar do Android, de forma que você possa fazer o
desenvolvimento do seu aplicativo guiado por testes. Execute seus
testes na JVM em segundos!”
É um simulador do ambiente de execução do Android
Testes são “instrumentados” na própria JVM
Robolectric
@Test
public void clickingButton_shouldChangeResultsViewText() {
MyActivity activity = Robolectric.setupActivity(MyActivity.class);
Button button = (Button) activity.findViewById(R.id.button);
TextView results = (TextView) activity.findViewById(R.id.results);
button.performClick();
assertThat(results.getText().toString()).isEqualTo("Hello!");
}
Robolectric
Request Matcher
Biblioteca open-source para a criação de asserções das requests do
app, utilizando em conjunto o Mock Web Server da Square
serverRule.enqueue(200, "body.json")
.assertPathIs("/somepath")
.assertNoBody()
.assertMethodIs(RequestMatcher.GET);
github.com/concretesolutions/requestmatcher
Organização dos testes
porque teste também é código
Organização AAA
Arrange (Organizar): set-up dos testes, preparação dos
objetos, etc.
Act (Agir): a execução, ou o exercício do comportamento
propriamente dito
Assert (Confirmação): a verificação se o resultado da
execução foi o esperado
Organização OCA
Organizar: set-up dos testes, preparação dos objetos, etc.
Agir: a execução, ou o exercício do comportamento
propriamente dito
Confirmação: a verificação se o resultado da execução foi o
esperado
Organização OCA
// O
Calculator c = new Calculator();
c.setFirstNumber(1);
c.setSecondNumber(2);
c.setOperation(Calculador.SUM);
// C
c.performOperation();
// A
assertThat(c.getResult(), is(3));
Código difícil de testar
testes podem denunciar problemas no design de
classes
Design de classes
Calculator c = new Calculator();
c.setFirstNumber(1);
c.setSecondNumber(2);
c.setOperation(Calculador.SUM);
c.performOperation();
assertThat(c.getResult(), is(3));
Design de classes
Calculator c = new Calculator.Builder()
.firstNumber(1)
.secondNumber(2)
.operation(Calculador.SUM)
.build();
c.performOperation();
assertThat(c.getResult(), is(3));
Por onde começar?
ok, conheço as ferramentas... mas o que eu testo?
Nossa cobaia será um app que
consome a API do StackOverflow
e lista os usuários com a maior
reputação no site
Consumo de API com Retrofit
RecyclerView com endless scroll
Salvando dados na mudança de orientação!
app/build.gradle
defaultConfig {
applicationId 'net.rafaeltoledo.tests'
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName '0.0.1'
testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
}
app/build.gradle
androidTestCompile
'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile
'com.android.support.test.espresso:espresso-contrib:2.2.2'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
app/build.gradle
@RunWith(AndroidJUnit4.class)
public class HomeActivityTest {
@Rule
public ActivityTestRule<HomeActivity> activityRule =
new ActivityTestRule<>(HomeActivity.class);
...
}
androidTest/. . . /HomeActivityTest.java
public class HomeActivityTest {
@Test
public void checkIfRecyclerViewIsLoading() {
// ...
}
}
androidTest/. . . /HomeActivityTest.java
public class HomeActivityTest {
@Test
public void checkIfRecyclerViewIsLoading() {
// êpa! Calma aí...
}
}
Testes e Dependências Externas
como fazemos com a API? como fazemos com
hardware? Como fazemos pra testar?
The FIRST Things for Unit Tests
Fast! (Rápidos): tem que ser executados em alguns
milissegundos ou segundos (Android)
Isolated (Isolados): devem focar em uma porção pequena
do código, alinhados com a definição de unitário
Repeatable (Repetíveis): produzem os mesmos resultados
todas as vezes que você o executa
The FIRST Things for Unit Tests
Self-Validating (Auto-Validados): um teste só é um teste se
ele se certifica de que as coisas estão certas. Testes não
devem ter interação – devem poupar e não gastar seu
tempo
Timely (Oportuno): testes, se não se tornarem um hábito,
podem facilmente ser “esquecidos”. E, no futuro,
dificilmente esse débito venha a ser solucionado.
Mock
Abordagens de Mock
Mock Objects: podemos programar o comportamento dos
objetos para que respondam como desejamos (Mockito)
Mock Requests: deixamos que os objetos se comportem
normalmente e somente apontamos para uma outra API
(MockWebServer)
Mock objects
// Mockando a API com o mockito
StackApi api = mock(StackApi.class);
when(api.getUsers(anyInt()).thenReturn(createMockedResponse());
// Mockando callbacks
ArgumentCaptor<Callback<ApiCollection<User>>> captor =
forClass(Callback.class);
verify(api.getUsersAsync(anyInt(), captor);
captor.getValue().onSuccess(createMockedCall(), createMockedResponse());
Mock objects
@RunWith(MockitoTestRunner.class)
// Mockando a API com o mockito
@Mock
StackApi api;
when(api.getUsers(anyInt()).thenReturn(createMockedResponse);
// Mockando callbacks
@Captor
Callback<ApiCollection<User>>> captor;
verify(api.getUsersAsync(anyInt(), captor);
captor.getValue().onSuccess(createMockedCall(), createMockedResponse());
Mock Server
// Mockando a API com o mockito
MockWebServer server = new MockWebServer();
server.enqueue(new MockResponse()
.setBody(json) // string!
.addHeader("Header", "value")
.setResponseCode(200));
Mas...
Como fazer meu app utilizar
esses objetos?
Mas...
Como fazer meu app utilizar
esses objetos?
1. DI / Setter
Mas...
Como fazer meu app utilizar
esses objetos?
1. DI / Setter
2. Reflection
DI / Setter
// API Mockada que criamos :)
apiSingleton.setApi(mockApiObject);
DI / Setter
// API Mockada que criamos :)
apiSingleton.setApi(mockApiObject);
Porém, não é bom quando modificamos o nosso código de
produção por causa do teste.
Isso pode vir a gerar problemas na arquitetura ou brechas
de segurança
DI / Setter
public class ApiSingleton {
// ...
@VisibleForTesting
public void setApi(MyApiInterface api) {
this.api = api;
}
}
DI / Setter
public class ApiSingleton {
// ...
@VisibleForTesting
public void setApi(MyApiInterface api) {
this.api = api;
}
}
PS: Dagger é uma boa saída pra fazer essa troca
Reflection
// Mudamos o valor do Singleton
ApiModule module = ApiModule.getInstance();
Field field = module.getClass().getDeclaredField("api");
field.setAccessible(true);
field.set(module, mockApi);
Reflection
// Mudamos o valor do Singleton
ApiModule module = ApiModule.getInstance();
Field field = module.getClass().getDeclaredField("api");
field.setAccessible(true);
field.set(module, mockApi);
// testCompile 'net.vidageek:mirror:1.6.1'
new Mirror().on(module).set().field("api").withValue(mockApi);
Mas pode usar
reflection no
Android? Não é
lento?
I – Testes unitários rodam
na JVM. Não tem esse
problema.
II – É um teste de
comportamento no
emulador. Alguns
segundos de setup são
aceitáveis.
Code Coverage
dados sobre quanto do código está sendo testado
Jacoco
Plugin no Gradle
Requer algumas configurações no arquivo de build
Notas Finais
algumas dicas para os navegantes de primeira viagem
Test Butler
Biblioteca + APK para garantir uma execução mais tranquila
dos testes no emulador
Permite controlar animações, rede, etc.
https://github.com/linkedin/test-butler
Dicas Finais
Testes Unitários != TDD
Cuidado com os Mocks:
- Não faça mock de tudo
- Não faça mock de value objects (POJOs)
- Não faça mock de tipos que você não tem
- Mostre amor pelos seus testes <3
Dicas Finais
Não use flavors para criação de mocks!
- invasivo ao set-up do projeto
- código duplicado
- limita a configuração de comportamentos diferentes
para a mesma unidade de código
Links
google.github.io/android-testing-support-library
github.com/googlesamples/android-testing
blog.sqisland.com
github.com/googlesamples/android-topeka
github.com/chiuki/friendspell
github.com/concretesolutions/requestmatcher
github.com/rafaeltoledo/android-keep-testing
rafaeltoledo.net
twitter.com/_rafaeltoledo
blog.concretesolutions.com.br
concretesolutions.com.br/carreira
Rio de Janeiro – Rua São José, 90 – cj. 2121
Centro – (21) 2240-2030
São Paulo - Rua Sansão Alves dos Santos, 433
4º andar - Brooklin - (11) 4119-0449

Weitere ähnliche Inhalte

Was ist angesagt? (17)

Java 06
Java 06Java 06
Java 06
 
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 de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Java 12
Java 12Java 12
Java 12
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
 
JUnit
JUnitJUnit
JUnit
 
Java14
Java14Java14
Java14
 
Introdução ao JavaFX
Introdução ao JavaFXIntrodução ao JavaFX
Introdução ao JavaFX
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
Junit
JunitJunit
Junit
 
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
 
Excepções JAVA
Excepções JAVAExcepções JAVA
Excepções JAVA
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger dagger
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
 
POO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em JavaPOO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em Java
 
UnP Eng. Software - Aula 28
UnP Eng. Software - Aula 28UnP Eng. Software - Aula 28
UnP Eng. Software - Aula 28
 
Palestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnitPalestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnit
 

Andere mochten auch

Mobile Conf 2015 - Testes de Unidade com Robolectric
Mobile Conf 2015 - Testes de Unidade com RobolectricMobile Conf 2015 - Testes de Unidade com Robolectric
Mobile Conf 2015 - Testes de Unidade com RobolectricStefan Teixeira
 
TDC 2015 - Testes de Unidade com Robolectric
TDC 2015 - Testes de Unidade com Robolectric TDC 2015 - Testes de Unidade com Robolectric
TDC 2015 - Testes de Unidade com Robolectric Lucas Albuquerque
 
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
 
Scrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with DockerScrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with DockerStefan Teixeira
 
TDC2016POA | Trilha Agile - Beyond borders: aplicando ágil em times distribuídos
TDC2016POA | Trilha Agile - Beyond borders: aplicando ágil em times distribuídosTDC2016POA | Trilha Agile - Beyond borders: aplicando ágil em times distribuídos
TDC2016POA | Trilha Agile - Beyond borders: aplicando ágil em times distribuídostdc-globalcode
 
TDC2016POA | Trilha Agile - Dual-Track Agile: incluindo o PO e o UX no seu pi...
TDC2016POA | Trilha Agile - Dual-Track Agile: incluindo o PO e o UX no seu pi...TDC2016POA | Trilha Agile - Dual-Track Agile: incluindo o PO e o UX no seu pi...
TDC2016POA | Trilha Agile - Dual-Track Agile: incluindo o PO e o UX no seu pi...tdc-globalcode
 
TDC2016POA | Trilha Agile - Agilidade além da TI: Um Relato de Experiencia
TDC2016POA | Trilha Agile - Agilidade além da TI: Um Relato de ExperienciaTDC2016POA | Trilha Agile - Agilidade além da TI: Um Relato de Experiencia
TDC2016POA | Trilha Agile - Agilidade além da TI: Um Relato de Experienciatdc-globalcode
 
TDC2016POA | Trilha Analise de Negocios - Business Coach, o Analista de Negó...
TDC2016POA | Trilha Analise de Negocios -  Business Coach, o Analista de Negó...TDC2016POA | Trilha Analise de Negocios -  Business Coach, o Analista de Negó...
TDC2016POA | Trilha Analise de Negocios - Business Coach, o Analista de Negó...tdc-globalcode
 
TDC2016POA | Trilha Analise de Negocios - Como fatiar seu produto em estórias...
TDC2016POA | Trilha Analise de Negocios - Como fatiar seu produto em estórias...TDC2016POA | Trilha Analise de Negocios - Como fatiar seu produto em estórias...
TDC2016POA | Trilha Analise de Negocios - Como fatiar seu produto em estórias...tdc-globalcode
 
TDC2016POA | Trilha Agile - CHA com Scrum Master - Conhecimentos, Habilidades...
TDC2016POA | Trilha Agile - CHA com Scrum Master - Conhecimentos, Habilidades...TDC2016POA | Trilha Agile - CHA com Scrum Master - Conhecimentos, Habilidades...
TDC2016POA | Trilha Agile - CHA com Scrum Master - Conhecimentos, Habilidades...tdc-globalcode
 
TDC2016POA | Trilha Analise de Negocios - Estranho no ninho: Um brasileiro li...
TDC2016POA | Trilha Analise de Negocios - Estranho no ninho: Um brasileiro li...TDC2016POA | Trilha Analise de Negocios - Estranho no ninho: Um brasileiro li...
TDC2016POA | Trilha Analise de Negocios - Estranho no ninho: Um brasileiro li...tdc-globalcode
 
TDC2016POA | Trilha Analise de Negocios - Inovando em negócios com foco na eX...
TDC2016POA | Trilha Analise de Negocios - Inovando em negócios com foco na eX...TDC2016POA | Trilha Analise de Negocios - Inovando em negócios com foco na eX...
TDC2016POA | Trilha Analise de Negocios - Inovando em negócios com foco na eX...tdc-globalcode
 
TDC2016POA | Trilha Agile - Agile Marketing: os resultados alcançados com pri...
TDC2016POA | Trilha Agile - Agile Marketing: os resultados alcançados com pri...TDC2016POA | Trilha Agile - Agile Marketing: os resultados alcançados com pri...
TDC2016POA | Trilha Agile - Agile Marketing: os resultados alcançados com pri...tdc-globalcode
 
TDC2016POA | Trilha Agile - Ágil fora da TI: como expandir o Agil para as are...
TDC2016POA | Trilha Agile - Ágil fora da TI: como expandir o Agil para as are...TDC2016POA | Trilha Agile - Ágil fora da TI: como expandir o Agil para as are...
TDC2016POA | Trilha Agile - Ágil fora da TI: como expandir o Agil para as are...tdc-globalcode
 
TDC2016POA | Trilha Arquetetura - Revitalizando aplicações desktop usando Ce...
TDC2016POA | Trilha Arquetetura -  Revitalizando aplicações desktop usando Ce...TDC2016POA | Trilha Arquetetura -  Revitalizando aplicações desktop usando Ce...
TDC2016POA | Trilha Arquetetura - Revitalizando aplicações desktop usando Ce...tdc-globalcode
 
TDC2016POA | Trilha Android - Monetização: conheça a rede de anúncios que pag...
TDC2016POA | Trilha Android - Monetização: conheça a rede de anúncios que pag...TDC2016POA | Trilha Android - Monetização: conheça a rede de anúncios que pag...
TDC2016POA | Trilha Android - Monetização: conheça a rede de anúncios que pag...tdc-globalcode
 
TDC2016POA | Trilha Android - Firebase Cloud Messaging para Android e IoT
TDC2016POA | Trilha Android - Firebase Cloud Messaging para Android e IoTTDC2016POA | Trilha Android - Firebase Cloud Messaging para Android e IoT
TDC2016POA | Trilha Android - Firebase Cloud Messaging para Android e IoTtdc-globalcode
 
TDC2016POA | Trilha Arduino - A Prática do Arduino em Ensino: o Case de um La...
TDC2016POA | Trilha Arduino - A Prática do Arduino em Ensino: o Case de um La...TDC2016POA | Trilha Arduino - A Prática do Arduino em Ensino: o Case de um La...
TDC2016POA | Trilha Arduino - A Prática do Arduino em Ensino: o Case de um La...tdc-globalcode
 
TDC2016POA | Trilha .NET - Trazendo o poder dos containers ao mundo .NET
TDC2016POA | Trilha .NET -  Trazendo o poder dos containers ao mundo .NETTDC2016POA | Trilha .NET -  Trazendo o poder dos containers ao mundo .NET
TDC2016POA | Trilha .NET - Trazendo o poder dos containers ao mundo .NETtdc-globalcode
 
TDC2016POA | Trilha Android - Construa um app consciente com a Google Awarene...
TDC2016POA | Trilha Android - Construa um app consciente com a Google Awarene...TDC2016POA | Trilha Android - Construa um app consciente com a Google Awarene...
TDC2016POA | Trilha Android - Construa um app consciente com a Google Awarene...tdc-globalcode
 

Andere mochten auch (20)

Mobile Conf 2015 - Testes de Unidade com Robolectric
Mobile Conf 2015 - Testes de Unidade com RobolectricMobile Conf 2015 - Testes de Unidade com Robolectric
Mobile Conf 2015 - Testes de Unidade com Robolectric
 
TDC 2015 - Testes de Unidade com Robolectric
TDC 2015 - Testes de Unidade com Robolectric TDC 2015 - Testes de Unidade com Robolectric
TDC 2015 - Testes de Unidade com Robolectric
 
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
 
Scrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with DockerScrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with Docker
 
TDC2016POA | Trilha Agile - Beyond borders: aplicando ágil em times distribuídos
TDC2016POA | Trilha Agile - Beyond borders: aplicando ágil em times distribuídosTDC2016POA | Trilha Agile - Beyond borders: aplicando ágil em times distribuídos
TDC2016POA | Trilha Agile - Beyond borders: aplicando ágil em times distribuídos
 
TDC2016POA | Trilha Agile - Dual-Track Agile: incluindo o PO e o UX no seu pi...
TDC2016POA | Trilha Agile - Dual-Track Agile: incluindo o PO e o UX no seu pi...TDC2016POA | Trilha Agile - Dual-Track Agile: incluindo o PO e o UX no seu pi...
TDC2016POA | Trilha Agile - Dual-Track Agile: incluindo o PO e o UX no seu pi...
 
TDC2016POA | Trilha Agile - Agilidade além da TI: Um Relato de Experiencia
TDC2016POA | Trilha Agile - Agilidade além da TI: Um Relato de ExperienciaTDC2016POA | Trilha Agile - Agilidade além da TI: Um Relato de Experiencia
TDC2016POA | Trilha Agile - Agilidade além da TI: Um Relato de Experiencia
 
TDC2016POA | Trilha Analise de Negocios - Business Coach, o Analista de Negó...
TDC2016POA | Trilha Analise de Negocios -  Business Coach, o Analista de Negó...TDC2016POA | Trilha Analise de Negocios -  Business Coach, o Analista de Negó...
TDC2016POA | Trilha Analise de Negocios - Business Coach, o Analista de Negó...
 
TDC2016POA | Trilha Analise de Negocios - Como fatiar seu produto em estórias...
TDC2016POA | Trilha Analise de Negocios - Como fatiar seu produto em estórias...TDC2016POA | Trilha Analise de Negocios - Como fatiar seu produto em estórias...
TDC2016POA | Trilha Analise de Negocios - Como fatiar seu produto em estórias...
 
TDC2016POA | Trilha Agile - CHA com Scrum Master - Conhecimentos, Habilidades...
TDC2016POA | Trilha Agile - CHA com Scrum Master - Conhecimentos, Habilidades...TDC2016POA | Trilha Agile - CHA com Scrum Master - Conhecimentos, Habilidades...
TDC2016POA | Trilha Agile - CHA com Scrum Master - Conhecimentos, Habilidades...
 
TDC2016POA | Trilha Analise de Negocios - Estranho no ninho: Um brasileiro li...
TDC2016POA | Trilha Analise de Negocios - Estranho no ninho: Um brasileiro li...TDC2016POA | Trilha Analise de Negocios - Estranho no ninho: Um brasileiro li...
TDC2016POA | Trilha Analise de Negocios - Estranho no ninho: Um brasileiro li...
 
TDC2016POA | Trilha Analise de Negocios - Inovando em negócios com foco na eX...
TDC2016POA | Trilha Analise de Negocios - Inovando em negócios com foco na eX...TDC2016POA | Trilha Analise de Negocios - Inovando em negócios com foco na eX...
TDC2016POA | Trilha Analise de Negocios - Inovando em negócios com foco na eX...
 
TDC2016POA | Trilha Agile - Agile Marketing: os resultados alcançados com pri...
TDC2016POA | Trilha Agile - Agile Marketing: os resultados alcançados com pri...TDC2016POA | Trilha Agile - Agile Marketing: os resultados alcançados com pri...
TDC2016POA | Trilha Agile - Agile Marketing: os resultados alcançados com pri...
 
TDC2016POA | Trilha Agile - Ágil fora da TI: como expandir o Agil para as are...
TDC2016POA | Trilha Agile - Ágil fora da TI: como expandir o Agil para as are...TDC2016POA | Trilha Agile - Ágil fora da TI: como expandir o Agil para as are...
TDC2016POA | Trilha Agile - Ágil fora da TI: como expandir o Agil para as are...
 
TDC2016POA | Trilha Arquetetura - Revitalizando aplicações desktop usando Ce...
TDC2016POA | Trilha Arquetetura -  Revitalizando aplicações desktop usando Ce...TDC2016POA | Trilha Arquetetura -  Revitalizando aplicações desktop usando Ce...
TDC2016POA | Trilha Arquetetura - Revitalizando aplicações desktop usando Ce...
 
TDC2016POA | Trilha Android - Monetização: conheça a rede de anúncios que pag...
TDC2016POA | Trilha Android - Monetização: conheça a rede de anúncios que pag...TDC2016POA | Trilha Android - Monetização: conheça a rede de anúncios que pag...
TDC2016POA | Trilha Android - Monetização: conheça a rede de anúncios que pag...
 
TDC2016POA | Trilha Android - Firebase Cloud Messaging para Android e IoT
TDC2016POA | Trilha Android - Firebase Cloud Messaging para Android e IoTTDC2016POA | Trilha Android - Firebase Cloud Messaging para Android e IoT
TDC2016POA | Trilha Android - Firebase Cloud Messaging para Android e IoT
 
TDC2016POA | Trilha Arduino - A Prática do Arduino em Ensino: o Case de um La...
TDC2016POA | Trilha Arduino - A Prática do Arduino em Ensino: o Case de um La...TDC2016POA | Trilha Arduino - A Prática do Arduino em Ensino: o Case de um La...
TDC2016POA | Trilha Arduino - A Prática do Arduino em Ensino: o Case de um La...
 
TDC2016POA | Trilha .NET - Trazendo o poder dos containers ao mundo .NET
TDC2016POA | Trilha .NET -  Trazendo o poder dos containers ao mundo .NETTDC2016POA | Trilha .NET -  Trazendo o poder dos containers ao mundo .NET
TDC2016POA | Trilha .NET - Trazendo o poder dos containers ao mundo .NET
 
TDC2016POA | Trilha Android - Construa um app consciente com a Google Awarene...
TDC2016POA | Trilha Android - Construa um app consciente com a Google Awarene...TDC2016POA | Trilha Android - Construa um app consciente com a Google Awarene...
TDC2016POA | Trilha Android - Construa um app consciente com a Google Awarene...
 

Ähnlich wie TDC2016POA | Trilha Android - Testes no Android

Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)Wennder Santos
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDDDextra
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusDenis L Presciliano
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - SubalgoritmosCarlos Santos
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de softwarericardophp
 
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
 
Django Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoDjango Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoLeandro Zanuz
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Julian Cesar
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Vanderson Silva
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Introdução À Automação de Testes com Selenium
Introdução À Automação de Testes com SeleniumIntrodução À Automação de Testes com Selenium
Introdução À Automação de Testes com Seleniumrodrigogouveia
 

Ähnlich wie TDC2016POA | Trilha Android - Testes no Android (20)

Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)
 
Robotium_Sikuli
Robotium_SikuliRobotium_Sikuli
Robotium_Sikuli
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDD
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Django Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoDjango Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a Otimização
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3
 
cypress.pdf
cypress.pdfcypress.pdf
cypress.pdf
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Introdução À Automação de Testes com Selenium
Introdução À Automação de Testes com SeleniumIntrodução À Automação de Testes com Selenium
Introdução À Automação de Testes com Selenium
 

Mehr von tdc-globalcode

TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadeTDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadetdc-globalcode
 
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...tdc-globalcode
 
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de SucessoTDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de Sucessotdc-globalcode
 
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPATDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPAtdc-globalcode
 
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinoTDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinotdc-globalcode
 
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...tdc-globalcode
 
TDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devicesTDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devicestdc-globalcode
 
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca PublicaTrilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publicatdc-globalcode
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#tdc-globalcode
 
TDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case EasylocusTDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case Easylocustdc-globalcode
 
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?tdc-globalcode
 
TDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em GolangTDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em Golangtdc-globalcode
 
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QATDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QAtdc-globalcode
 
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendenciaTDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendenciatdc-globalcode
 
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR ServiceTDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Servicetdc-globalcode
 
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NETTDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NETtdc-globalcode
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8tdc-globalcode
 
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...tdc-globalcode
 
TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#tdc-globalcode
 
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net CoreTDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Coretdc-globalcode
 

Mehr von tdc-globalcode (20)

TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadeTDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
 
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
 
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de SucessoTDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
 
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPATDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
 
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinoTDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
 
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
 
TDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devicesTDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devices
 
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca PublicaTrilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#
 
TDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case EasylocusTDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case Easylocus
 
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
 
TDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em GolangTDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em Golang
 
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QATDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
 
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendenciaTDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
 
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR ServiceTDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
 
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NETTDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
 
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
 
TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#
 
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net CoreTDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
 

Kürzlich hochgeladen

Slides 9º ano 2024.pptx- Geografia - exercicios
Slides 9º ano 2024.pptx- Geografia - exerciciosSlides 9º ano 2024.pptx- Geografia - exercicios
Slides 9º ano 2024.pptx- Geografia - exerciciosGentil Eronides
 
Apresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaApresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaCentro Jacques Delors
 
P P P 2024 - *CIEJA Santana / Tucuruvi*
P P P 2024  - *CIEJA Santana / Tucuruvi*P P P 2024  - *CIEJA Santana / Tucuruvi*
P P P 2024 - *CIEJA Santana / Tucuruvi*Viviane Moreiras
 
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!Centro Jacques Delors
 
Cartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxCartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxMarcosLemes28
 
M0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxM0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxJustinoTeixeira1
 
INTERTEXTUALIDADE atividade muito boa para
INTERTEXTUALIDADE   atividade muito boa paraINTERTEXTUALIDADE   atividade muito boa para
INTERTEXTUALIDADE atividade muito boa paraAndreaPassosMascaren
 
Falando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introdFalando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introdLeonardoDeOliveiraLu2
 
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...azulassessoria9
 
AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022LeandroSilva126216
 
Quiz | Dia da Europa 2024 (comemoração)
Quiz | Dia da Europa 2024  (comemoração)Quiz | Dia da Europa 2024  (comemoração)
Quiz | Dia da Europa 2024 (comemoração)Centro Jacques Delors
 
6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptxJssicaCassiano2
 
Sistema de Bibliotecas UCS - Cantos do fim do século
Sistema de Bibliotecas UCS  - Cantos do fim do séculoSistema de Bibliotecas UCS  - Cantos do fim do século
Sistema de Bibliotecas UCS - Cantos do fim do séculoBiblioteca UCS
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptssuser2b53fe
 
Sopa de letras | Dia da Europa 2024 (nível 2)
Sopa de letras | Dia da Europa 2024 (nível 2)Sopa de letras | Dia da Europa 2024 (nível 2)
Sopa de letras | Dia da Europa 2024 (nível 2)Centro Jacques Delors
 
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfApresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfcomercial400681
 
Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)Centro Jacques Delors
 
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptxSlides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptxLuizHenriquedeAlmeid6
 
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...SileideDaSilvaNascim
 

Kürzlich hochgeladen (20)

Slides 9º ano 2024.pptx- Geografia - exercicios
Slides 9º ano 2024.pptx- Geografia - exerciciosSlides 9º ano 2024.pptx- Geografia - exercicios
Slides 9º ano 2024.pptx- Geografia - exercicios
 
Apresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaApresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União Europeia
 
P P P 2024 - *CIEJA Santana / Tucuruvi*
P P P 2024  - *CIEJA Santana / Tucuruvi*P P P 2024  - *CIEJA Santana / Tucuruvi*
P P P 2024 - *CIEJA Santana / Tucuruvi*
 
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
 
Cartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxCartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptx
 
M0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxM0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptx
 
INTERTEXTUALIDADE atividade muito boa para
INTERTEXTUALIDADE   atividade muito boa paraINTERTEXTUALIDADE   atividade muito boa para
INTERTEXTUALIDADE atividade muito boa para
 
Falando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introdFalando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introd
 
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
 
AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022
 
Quiz | Dia da Europa 2024 (comemoração)
Quiz | Dia da Europa 2024  (comemoração)Quiz | Dia da Europa 2024  (comemoração)
Quiz | Dia da Europa 2024 (comemoração)
 
6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx
 
Sistema de Bibliotecas UCS - Cantos do fim do século
Sistema de Bibliotecas UCS  - Cantos do fim do séculoSistema de Bibliotecas UCS  - Cantos do fim do século
Sistema de Bibliotecas UCS - Cantos do fim do século
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.ppt
 
Sopa de letras | Dia da Europa 2024 (nível 2)
Sopa de letras | Dia da Europa 2024 (nível 2)Sopa de letras | Dia da Europa 2024 (nível 2)
Sopa de letras | Dia da Europa 2024 (nível 2)
 
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfApresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
 
Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)
 
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptxSlides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
 
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
 
Novena de Pentecostes com textos de São João Eudes
Novena de Pentecostes com textos de São João EudesNovena de Pentecostes com textos de São João Eudes
Novena de Pentecostes com textos de São João Eudes
 

TDC2016POA | Trilha Android - Testes no Android

  • 1. Conceitos, práticas e motivações Testes no Android
  • 2. Eu Chapter Lead de Android www.rafaeltoledo.net twitter.com/_rafaeltoledo github.com/rafaeltoledo blog.concretesolutions.com.br
  • 3. Por que escrever Testes? o dilema do programador mobile
  • 4. Garantir que algo funciona da forma como deveria Documentação de comportamento de um sistema Garantir que uma mudança não quebra outras partes do app
  • 5.
  • 6.
  • 7. A pirâmide refere-se ao desenvolvimento backend Front-end em si é interface (GUI) Ao contrário dos apps 100% offline, se muitas regras de negócio concentram-se no front-end, é sinal que sua arquitetura está errada
  • 8. Por que tenho 2 pastas de Testes? o que são as pastas test e androidTest no meu projeto?
  • 9. Testes unitários / funcionais instrumentados, que necessitam das classes do Android para a execução. São executados em emuladores ou devices reais androidTest
  • 10. Testes unitários executados na JVM (máquina local) Componentes externos geralmente são mockados (como as classes do Android)* test
  • 11. Testes unitários executados na JVM (máquina local) Componentes externos geralmente são mockados (como as classes do Android)* Robolectric
  • 12. escopos de dependências // somente test testCompile 'junit:junit:4.12' testCompile 'org.robolectric:robolectric:3.1.2' // somente androidTest androidTestCompile 'com.android.support.test:runner:0.5' androidTestCompile 'com.android.support.test:rules:0.5'
  • 13. Bibliotecas e Frameworks quem poderá nos ajudar?
  • 14. Framework para criação de testes ‘repetíveis’ Estrutura da execução dos testes Biblioteca de asserções public class MeuTeste { @Test public void stuffTest() { Assert.assertEquals(2, 1 + 1); } }
  • 15. Biblioteca para a criação de asserções mais intuitivas e legíveis Se tornou parte do JUnit assertThat(1 + 1, is(2)); assertThat(lista, contains(2, 3, 4, 8); String texto = "Android no TDC" assertThat(texto, containsString("Android"); assertThat(texto, not(containsString("iOS"); Hamcrest
  • 16. Biblioteca para a criação de asserções mais intuitivas, legíveis e fluentes Possui uma extensão chamada AssertJ Android feita pela Square assertThat(sociedadeDoAnel) .hasSize(9) .contains(frodo, sam) .doesNotContain(sauron); // AssertJ Android assertThat(view).isGone(); AssertJ
  • 17. Biblioteca para a criação de mocks List mockedList = mock(List.class); mockedList.add("one"); mockedList.clear(); verify(mockedList).add("one"); verify(mockedList).clear();
  • 18. LinkedList mockedList = mock(LinkedList.class); when(mockedList.get(0)).thenReturn("first"); // Vai mostrar "first" System.out.println(mockedList.get(0)); // Vai mostrar null, já que não mockamos o comportamento System.out.println(mockedList.get(999));
  • 19. Framework para a criação de testes Instrumentados no Android Espresso AndroidJUnitRunner JUnit4 Rules UI Automator Android Testing Support Library
  • 20. Espresso Biblioteca para a escrita de testes unitários de UI para o Android onView(withId(R.id.name_field)).perform(typeText("TDC")); onView(withId(R.id.greet_button)).perform(click()); onView(withText("Olá, TDC!")).check(matches(isDisplayed()); Android Testing Support Library
  • 21. AndroidJUnitRunner Suporte ao JUnit 4, acesso a informações da instrumentação (contexto, execução, etc.), filtro de testes e distribuição Rules Possibilita testar Activity, Intent e Service UiAutomator Testes de UI no Android de forma “livre” Android Testing Support Library
  • 22. “Robolectric é um framework de testes unitários que desacopla a dependência do jar do Android, de forma que você possa fazer o desenvolvimento do seu aplicativo guiado por testes. Execute seus testes na JVM em segundos!” É um simulador do ambiente de execução do Android Testes são “instrumentados” na própria JVM Robolectric
  • 23. @Test public void clickingButton_shouldChangeResultsViewText() { MyActivity activity = Robolectric.setupActivity(MyActivity.class); Button button = (Button) activity.findViewById(R.id.button); TextView results = (TextView) activity.findViewById(R.id.results); button.performClick(); assertThat(results.getText().toString()).isEqualTo("Hello!"); } Robolectric
  • 24. Request Matcher Biblioteca open-source para a criação de asserções das requests do app, utilizando em conjunto o Mock Web Server da Square serverRule.enqueue(200, "body.json") .assertPathIs("/somepath") .assertNoBody() .assertMethodIs(RequestMatcher.GET); github.com/concretesolutions/requestmatcher
  • 25. Organização dos testes porque teste também é código
  • 26. Organização AAA Arrange (Organizar): set-up dos testes, preparação dos objetos, etc. Act (Agir): a execução, ou o exercício do comportamento propriamente dito Assert (Confirmação): a verificação se o resultado da execução foi o esperado
  • 27. Organização OCA Organizar: set-up dos testes, preparação dos objetos, etc. Agir: a execução, ou o exercício do comportamento propriamente dito Confirmação: a verificação se o resultado da execução foi o esperado
  • 28. Organização OCA // O Calculator c = new Calculator(); c.setFirstNumber(1); c.setSecondNumber(2); c.setOperation(Calculador.SUM); // C c.performOperation(); // A assertThat(c.getResult(), is(3));
  • 29. Código difícil de testar testes podem denunciar problemas no design de classes
  • 30. Design de classes Calculator c = new Calculator(); c.setFirstNumber(1); c.setSecondNumber(2); c.setOperation(Calculador.SUM); c.performOperation(); assertThat(c.getResult(), is(3));
  • 31. Design de classes Calculator c = new Calculator.Builder() .firstNumber(1) .secondNumber(2) .operation(Calculador.SUM) .build(); c.performOperation(); assertThat(c.getResult(), is(3));
  • 32. Por onde começar? ok, conheço as ferramentas... mas o que eu testo?
  • 33. Nossa cobaia será um app que consome a API do StackOverflow e lista os usuários com a maior reputação no site
  • 34. Consumo de API com Retrofit RecyclerView com endless scroll Salvando dados na mudança de orientação!
  • 35. app/build.gradle defaultConfig { applicationId 'net.rafaeltoledo.tests' minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName '0.0.1' testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' }
  • 37. app/build.gradle @RunWith(AndroidJUnit4.class) public class HomeActivityTest { @Rule public ActivityTestRule<HomeActivity> activityRule = new ActivityTestRule<>(HomeActivity.class); ... }
  • 38. androidTest/. . . /HomeActivityTest.java public class HomeActivityTest { @Test public void checkIfRecyclerViewIsLoading() { // ... } }
  • 39. androidTest/. . . /HomeActivityTest.java public class HomeActivityTest { @Test public void checkIfRecyclerViewIsLoading() { // êpa! Calma aí... } }
  • 40. Testes e Dependências Externas como fazemos com a API? como fazemos com hardware? Como fazemos pra testar?
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46. The FIRST Things for Unit Tests Fast! (Rápidos): tem que ser executados em alguns milissegundos ou segundos (Android) Isolated (Isolados): devem focar em uma porção pequena do código, alinhados com a definição de unitário Repeatable (Repetíveis): produzem os mesmos resultados todas as vezes que você o executa
  • 47. The FIRST Things for Unit Tests Self-Validating (Auto-Validados): um teste só é um teste se ele se certifica de que as coisas estão certas. Testes não devem ter interação – devem poupar e não gastar seu tempo Timely (Oportuno): testes, se não se tornarem um hábito, podem facilmente ser “esquecidos”. E, no futuro, dificilmente esse débito venha a ser solucionado.
  • 48. Mock
  • 49. Abordagens de Mock Mock Objects: podemos programar o comportamento dos objetos para que respondam como desejamos (Mockito) Mock Requests: deixamos que os objetos se comportem normalmente e somente apontamos para uma outra API (MockWebServer)
  • 50. Mock objects // Mockando a API com o mockito StackApi api = mock(StackApi.class); when(api.getUsers(anyInt()).thenReturn(createMockedResponse()); // Mockando callbacks ArgumentCaptor<Callback<ApiCollection<User>>> captor = forClass(Callback.class); verify(api.getUsersAsync(anyInt(), captor); captor.getValue().onSuccess(createMockedCall(), createMockedResponse());
  • 51. Mock objects @RunWith(MockitoTestRunner.class) // Mockando a API com o mockito @Mock StackApi api; when(api.getUsers(anyInt()).thenReturn(createMockedResponse); // Mockando callbacks @Captor Callback<ApiCollection<User>>> captor; verify(api.getUsersAsync(anyInt(), captor); captor.getValue().onSuccess(createMockedCall(), createMockedResponse());
  • 52. Mock Server // Mockando a API com o mockito MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse() .setBody(json) // string! .addHeader("Header", "value") .setResponseCode(200));
  • 53. Mas... Como fazer meu app utilizar esses objetos?
  • 54. Mas... Como fazer meu app utilizar esses objetos? 1. DI / Setter
  • 55. Mas... Como fazer meu app utilizar esses objetos? 1. DI / Setter 2. Reflection
  • 56. DI / Setter // API Mockada que criamos :) apiSingleton.setApi(mockApiObject);
  • 57. DI / Setter // API Mockada que criamos :) apiSingleton.setApi(mockApiObject); Porém, não é bom quando modificamos o nosso código de produção por causa do teste. Isso pode vir a gerar problemas na arquitetura ou brechas de segurança
  • 58. DI / Setter public class ApiSingleton { // ... @VisibleForTesting public void setApi(MyApiInterface api) { this.api = api; } }
  • 59. DI / Setter public class ApiSingleton { // ... @VisibleForTesting public void setApi(MyApiInterface api) { this.api = api; } } PS: Dagger é uma boa saída pra fazer essa troca
  • 60. Reflection // Mudamos o valor do Singleton ApiModule module = ApiModule.getInstance(); Field field = module.getClass().getDeclaredField("api"); field.setAccessible(true); field.set(module, mockApi);
  • 61. Reflection // Mudamos o valor do Singleton ApiModule module = ApiModule.getInstance(); Field field = module.getClass().getDeclaredField("api"); field.setAccessible(true); field.set(module, mockApi); // testCompile 'net.vidageek:mirror:1.6.1' new Mirror().on(module).set().field("api").withValue(mockApi);
  • 62. Mas pode usar reflection no Android? Não é lento?
  • 63. I – Testes unitários rodam na JVM. Não tem esse problema. II – É um teste de comportamento no emulador. Alguns segundos de setup são aceitáveis.
  • 64. Code Coverage dados sobre quanto do código está sendo testado
  • 65. Jacoco Plugin no Gradle Requer algumas configurações no arquivo de build
  • 66. Notas Finais algumas dicas para os navegantes de primeira viagem
  • 67. Test Butler Biblioteca + APK para garantir uma execução mais tranquila dos testes no emulador Permite controlar animações, rede, etc. https://github.com/linkedin/test-butler
  • 68. Dicas Finais Testes Unitários != TDD Cuidado com os Mocks: - Não faça mock de tudo - Não faça mock de value objects (POJOs) - Não faça mock de tipos que você não tem - Mostre amor pelos seus testes <3
  • 69. Dicas Finais Não use flavors para criação de mocks! - invasivo ao set-up do projeto - código duplicado - limita a configuração de comportamentos diferentes para a mesma unidade de código
  • 71. rafaeltoledo.net twitter.com/_rafaeltoledo blog.concretesolutions.com.br concretesolutions.com.br/carreira Rio de Janeiro – Rua São José, 90 – cj. 2121 Centro – (21) 2240-2030 São Paulo - Rua Sansão Alves dos Santos, 433 4º andar - Brooklin - (11) 4119-0449