atdd android

30
BH beach presents ATDDROID Pedro Rocha https://github.com/pedroaugustofr/ AndroidConverterATDD

Upload: pedro-rocha

Post on 18-Aug-2015

38 views

Category:

Technology


0 download

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 DE APLICAÇÕES ANDROID + TDD

3

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

8

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

PROCESSO DE DESENVOLVIMENTO ANDROID

11

SETUP DO GRADLE E ANDROID STUDIO

12

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

18

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

Sem Espresso

20

X Com Espresso

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

23

TDD - INTRODUÇÃO

É o desenvolvimento de software orientado a testes. O ciclo de desenvolvimento utilizando TDD é chamado de

red-green-refactor.

24tag: icecream

TDD

Como facilitar o uso de TDD no Android?

25tag: jellybeam

TDD - MVP

Por que MVP?

26tag: kitkat

TDD - MVP

27

Comece os testes unitários pelo presenter.

REFERÊNCIAS

28

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