1) O documento discute problemas relacionados ao desenvolvimento de aplicações Android com foco em testes e apresenta uma abordagem de desenvolvimento orientada a testes (TDD).
2) É apresentado o processo de desenvolvimento utilizando TDD no Android, começando pelos testes de aceitação e implementação da funcionalidade utilizando testes unitários.
3) São detalhados tópicos como configuração do Gradle e Android Studio para execução de testes, realização de testes de aceitação com e sem o Espresso e uso do padrão MVP para
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
ATDD Android
1. B H b e a c h p r e s e n t s
ATDDROID
Pedro Rocha
https://github.com/pedroaugustofr/
AndroidConverterATDD
2. AGENDA
■ Problemas de aplicações Android + TDD
■ Processo de desenvolvimento Android
■ Setup do Gradle e Android Studio
■ Acceptance Tests
●Sem Espresso
●Com Espresso
■ TDD
●Introdução
●Porque do uso de MVP
2
4. PROBLEMAS RELACIONADOS A APLICAÇÕES ANDROID
■ O sistema operacional faz toda inicialização
■ Arquitetura e documentação não favorece o uso de testes
■ Todos os testes rodam no device
4
5. PROBLEMAS RELACIONADOS A APLICAÇÕES ANDROID
■ O sistema operacional faz toda inicialização
●Activities, Services, Broadcast Receivers, Content Providers
■ Solução?
5
●Não faça testes unitários para eles, trate-os
como o "main"
tag: cupcake
6. PROBLEMAS RELACIONADOS A APLICAÇÕES ANDROID
■ Arquitetura e documentação não favorece o uso de testes
●Objetos relacionados a view se misturam com regra de
negócio
●Libraries do Android ficam fortemente acoplados a
códigos que poderiam ser puramente java
■ Solução?
6
●Utilizar o padrão Model-View-Presenter para
diminuir as dependências de componentes
Android e consequentemente os testes
unitários que exigem o device
7. PROBLEMAS RELACIONADOS A APLICAÇÕES ANDROID
■ Todos os testes rodam no device
●Todas as ferramentas que acompanham o Android
assumem que os testes irão executar dentro de
aplicações Android
■ Solução?
7
●Criar um módulo que possui somente código
java "puro" para conseguir rodar o JUnit sem
precisar do device
9. PROCESSO DE DESENVOLVIMENTO ANDROID
■ Pré-condição
●Considerando que o projeto tenha user stories e as
mesmas já estão priorizadas
●Considere também que as user stories já tenham
exemplos concretos definidos
9
10. PROCESSO DE DESENVOLVIMENTO ANDROID
■ Execução
● Selecione a user story
● Spike sobre a user story (Opcional)
● Automatize um exemplo com testes de aceitação
● Implemente a funcionalidade
- Implemente a funcionalidade utilizando TDD
- Normalmente utilizando a técnica presenter-first
● Faça a conexão entre o presenter e a view
● Verifique os testes de aceitação, neste ponto eles devem
passar
● Selecione o próximo exemplo e retorne ao passo
10
ATDD
Cycle
13. SETUP DO GRADLE E ANDROID STUDIO
■ Dependências para os testes de aceitação
■ Criando novo módulo para o core da aplicação
■ Dependências para os testes unitários
■ Criando Run/Debug configurations no Android Studio
13
15. CRIANDO NOVO MÓDULO PARA CORE DA
APLICAÇÃO
15
app/build.gradle
…
dependencies {
compile project(':core')
…
}
▫︎Criando um novo módulo:
▫︎File / New… / New Module.. / Java Library
▫︎Adicionando o novo módulo como dependência:
tag: eclair
16. DEPENDÊNCIAS PARA OS TESTES UNITÁRIOS
16
new_module/build.gradle
dependencies {
…
testCompile 'junit:junit:4.12'
testCompile 'jmock:jmock:1.2.0'
}
tag: froyo
17. CRIANDO RUN/DEBUG CONFIGURATIONS NO ANDROID STUDIO
17
▫︎Criando novo Run Configuration
▫︎Run / Edit Configurations…
▫︎Adicionando Configuração pra rodar testes de aceitação:
▫︎Add New Configuration / Android Tests
▫︎Selecione o módulo: app
▫︎Adicione o Instrumentation Runner:
▫︎android.support.test.runner.AndroidJUnitRunner
▫︎Adicionando Configuração para rodar testes unitários
▫︎Add New Configuration / JUnit
▫︎Package: com.your.package
▫︎Use classpath of mod…: your_module
▫︎Before launch:
▫︎Change from Make to Gradle-aware Make
19. ACCEPTANCE TESTS
É o teste responsável por verificar o sistema em
relação aos seus pré-requisitos originais em um
ambiente igual ou o mais parecido possível com o
ambiente de produção. Simula o comportamento do
usuário em relação ao sistema.
19
21. ACCEPTANCE TESTS - WITHOUT ESPRESSO
21
@RunWith(AndroidJUnit4.class)
public class WithoutEspressoTest {
@Rule
public final ActivityTestRule<MainActivity> main = new ActivityTestRule<>(MainActivity.class);
@Test
@UiThreadTest
public void testInchesToCentimeters() throws Exception {
givenTheUserSelectedConversion("in", “cm");
whenTheUserEnters("2");
thenTheResultIs("2.00 in = 5.08 cm");
}
private void givenTheUserSelectedConversion(String fromUnit, String toUnit) {
getField(R.id.fromUnitEditText).setText(fromUnit);
getField(R.id.toUnitEditText).setText(toUnit);
}
private void whenTheUserEnters(String inputNumber) {
getField(R.id.inputNumberEditText).setText(inputNumber);
}
private void thenTheResultIs(String expectedResult) {
assertEquals(expectedResult, getField(R.id.resultTextView).getText().toString());
}
private TextView getField(int id) {
return (TextView) main.getActivity().findViewById(id);
}
}
tag: gingerbread
22. ACCEPTANCE TESTS - WITH ESPRESSO
22
@RunWith(AndroidJUnit4.class)
public class EspressoTest {
@Rule
public final ActivityTestRule<MainActivity> main = new ActivityTestRule<>(MainActivity.class);
@Test
public void testInchesToCentimeters() {
onView(ViewMatchers.withId(R.id.inputNumberEditText)).perform(typeText("2"));
onView(withId(R.id.fromUnitEditText)).perform(typeText("in"));
onView(withId(R.id.toUnitEditText)).perform(typeText("cm"));
onView(withId(R.id.resultTextView)).check(matches(ViewMatchers.withText("2.00 in = 5.08 cm")));
}
}
tag: honeycomb
24. TDD - INTRODUÇÃO
É o desenvolvimento de software orientado a testes. O
ciclo de desenvolvimento utilizando TDD é chamado de
red-green-refactor.
24tag: icecream
29. REFERÊNCIAS
■ Matteo Vaccari and Carlo Bellettini, TDD for Android - How to
do Test-Driven Development well
■ Antonio Leiva, MVP for Android: how to organize the
presentation layer - http://antonioleiva.com/mvp-android/
■ Dicussão no MyThoughtWorks - https://
thoughtworks.jiveon.com/message/401507#401507
■ Configuração do ambiente para CI e TDD - http://
stablekernel.com/blog/continuous-delivery-android-part-1/
■ Diversos tutoriais de Android - http://www.vogella.com/
tutorials/android.html
29