atdd android
TRANSCRIPT
B H b e a c h p r e s e n t s
ATDDROIDPedro Rocha
https://github.com/pedroaugustofr/AndroidConverterATDD
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
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
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
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
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
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
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
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
DEPENDÊNCIAS PARA OS TESTES DE ACEITAÇÃO
14
app/build.gradle
android { … defaultConfig {
… testInstrumentationRunner ‘android.support.test.runner.AndroidJUnitRunner’
} …
}
dependencies { … androidTestCompile 'com.android.support.test:runner:0.3' androidTestCompile 'com.android.support.test:rules:0.3' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'
}
tag: donut
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
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
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
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
ACCEPTANCE TESTS - WITHOUT ESPRESSO
21
@RunWith(AndroidJUnit4.class) public class WithoutEspressoTest {
@Rulepublic final ActivityTestRule<MainActivity> main = new ActivityTestRule<>(MainActivity.class);@Test@UiThreadTestpublic 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
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
TDD - INTRODUÇÃO
É o desenvolvimento de software orientado a testes. O ciclo de desenvolvimento utilizando TDD é chamado de
red-green-refactor.
24tag: icecream
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
Dúvidas: [email protected]
Sujestões: https://github.com/pedroaugustofr/
AndroidConverterATDD
THANK YOU