SlideShare uma empresa Scribd logo
1 de 70
Test Driven
    Android Apps
         Rafael Adson Barbosa Barros
http://yetanotherdevelopersblog.blogspot.com/
Fontes
Conteúdo

Por que fazer testes?

Testes Manuais

Pré-requisitos & Boas Práticas

Testes Unitários

Mocks and Stubs.
Conteúdo

Testes de Integração

Testes de Sistema

Build Automático e Integração Contínua

Conclusão
Por que fazer testes?
Dois tipos de Testes


Testes Automatizados

Testes Manuais
Testes Manuais
Pegar pessoas conhecidas e entrega aplicação
nas mãos delas.

  Peça Feedback.

  Minha aplicação já mudou de cara bastante
  por causa disso.

Desenvolvedores possuem zelo pelo próprio
código, por isso não são bons testers.
Testes Manuais


Problemas:

 Android Fragmentado: como testar em
 versão 2.0, 3.0 e 4.0, com diferentes tamanhos
 de telas, sem ter todos os aparelhos?
Testes Manuais

Demanda pra time de testes é muito maior do
que para times de desenvolvimento, pois:

  eles tem que testar novas funcionalidades

  eles tem que verificar se o que já existia antes
  continua funcionando.
Testes Manuais


Testes Manuais são importantes!!!

Mas não podem ser sua única forma de atacar
o problema!
Testes
    Automatizados
Testes Unitários

Testes de Integração

Testes de Sistema (Aceitação)

Testes de Carga

Monkey
Pré-requisitos

É difícil fazer código testável:

  Dependência de código testável para apis
  não testáveis

    Negócio que manda e-mail pra outras
    pessoas.

    Acesso a web-services ou URLs.
Pré-requisitos

Mais Dificuldades:

 Código Spagetti

 Muitas Dependências.

 Métodos Estáticos.

 Singletons.
Métodos Estáticos


public void doSomething() {

    Mailer.sendEmailTo100People();

}
Dependências
public class ClassUnderTest{

    private CantInstantiate i;

    public ClassUnderTest(CantInstantiate i) {

        Preconditions.checkNotNull(i);

        this.i = i;

    }

}
Dependências
CantInstantiate pode ser difícil de instanciar
pois:

  Pra instanciar CantInstantiate é possível que
  tenha que se instanciar uma árvore de
  dependências inteira.

  Simplesmente não é possível, porque chamar
  um construtor de CantInstantiate em
  ambiente de testes dá pau.
Dependências


public void doSomething(CantInstantiate i) {

    //difícil de testar esse método, hem??

}
Dependências

Se for difícil de escrever o teste, ninguém vai
escrever o teste.

Se sua classe tiver muita dependência difícil de
resolver => As pessoas não vão querer escrever
testes pra sua classe.
Singletons

public class Mailer {

    private Mailer() {...}

    public static Mailer getInstance() {...}

    public void sendEmailTo100People() {...}

}
Singletons
public class ThingThatDependsOnMailer {

    private Mailer m = Mailer.getInstance();

    public void doSomething() {

        m.sendEmailTo100People();

    }

}
Seus Amigos nessas
      horas

TDD

Refatoração

Reuso
Reuso
 Ao invés de escrever algo específico:

fazBuscaBinariaDePessoas(Pessoa p)

 Pode-se escrever algo genérico:

fazBuscaBinariaDeQualquerCoisa(Coisa c)

 Pessoa pode ser difícil de instanciar, Coisa
 talvez seja mais fácil!
Reuso
De quebra, você ainda economiza tempo (Não
precisa escrever busca binária pra mais nada!!!)

Mas cuidado com:

  YAGNI

  KISS

Na dúvida, torne coisas genéricas quando você
precisar!
Aplicativos




Hiragana Translator
                      Kotoba Flashcards
 (Demonstração)
Hiragana Translator
Você digita uma sílaba
(com caracteres normais)

Aperta Translate!

Ele mostra o hiragana
correspondente

Mostra um erro de
validação se o Hiragana
não for encontrado!
Testes Unitários

Testar unidade em isolamento

Se necessário, usar mocks e stubs.

Rápido!

TestNG
Testes Unitários
Testes Unitários
Testes Unitários
Testes Unitários
Testes Unitários
Avançando um pouquinho...
Testes Unitários
Testes Unitários
Testes Unitários
Não acabou!!!
Testes Unitários
Não acabou!!!
Testes Unitários
Ainda existem casos de testes que poderiam
ser feitos!

  O que acontece se eu passar um texto muito
  grande?

  O que acontece se eu passar algo como 1ka
  ou ka1?

Mas eu vou parar por aqui....
Exemplo de Mock
  (Teste Unitário)
Supondo que eu tenha uma classe MyAnalytics
com o método logTranslation(String text) que
manda a tradução que o usuário pediu para o
servidor, para que eu possa analisar e melhorar
minhas traduções...

Vou usar Mockito.
Exemplo de Mock
 (Teste Unitário)
Exemplo de Mock
 (Teste Unitário)
Exemplo de Mock
 (Teste Unitário)
Testes de Integração

1. Usuário preenche o campo com algo válido,
   o hiragana tem que aparecer no texto
   indicado

2. Usuário preenche o campo com algo
   inválido ou deixa vazio, texto tem que ficar
   vazio e aparecer um erro de validação.
Testes de Integração
 Setup:
Teste de Integração
Teste de Integração
Teste de Integração
Teste de Integração
Stub em Teste de
    Integração
Mesmo caso anterior, mas agora chamada ao
MyAnalytics está na Activity

Não dá mais pra usar Mockito => quem roda
agora é a DalvikVM!

Solução: Faça você mesmo!

Pra economizar tempo, não vou demonstrar!
Teste de BD
Agora vou mostrar no Kotoba!
Teste de BD
Teste de Integração
Dá pra fazer bem mais coisa do que foi
mostrado:

  Testar iteração com os menus

    Eu criei uma classe chamada
    MenuItemStub que extends MenuItem e
    chamo o método que lida com o menu
    diretamente.
Teste de Integração


Testar se um Intent foi disparado

  Por exemplo, depois de clicar em um botão
  ou em um Menu
Teste de Sistema
Duas opções:

  Monkeyrunner

  Robotium

Infelizmente MonkeyRunner tem interface muito
limitada => você tem que informar as posições exatas
da interface onde você deve clicar (ou extender).

Pra mim, Robotium é a maneira de fazer esse tipo de
teste.
Teste de Sistema
Teste de Sistema
Testes de Sistema
Teste de Sistema

A estrutura de UIs mostrada anteriormente
pode ser utilizada também para evitar
repetição nos testes de Solo.

No momento que essa apresentação está sendo
feita, solo não lida bem com ActionBar
(android >= 3.0)
Build Automático

Ant (suportado pela Google)

Maven (nunca vai ser suportado pela Google)



Mas eu escolhi Maven! (mas só porque eu já
sabia usar, se alguém conseguir fazer em ant,
use ant).
Build Automático
android-maven-plugin

Três projetos, conforme o
diagrama.

Dependency management
no X-pom

Pasta do source do android
deve ser src/

Usar packaging apk e
apklib
pom.xml do
hiragana-translator
pom.xml do
hiraganaTranslator-test
Integração Contínua


Jenkins c/ AndroidEmulatorPlugin

Build baseando-se em matriz

Monkey
Integração Contínua

Para cada build:

  Jenkins inicializa um emulador (a partir de
  snapshot)

  Faz o build do maven (rodando todos os
  testes)

  Roda monkey
Integração Contínua
Integração Contínua
Integração Contínua
Integração Contínua
Integração Contínua
Benchmarking


Android não oferece uma solução de
benchmarking padrão.

No entanto, se você faz teste de sistema =>
você consegue fazer benchmarking.
Benchmarking
Conclusão
Apresentação disponível para download em:
http://yetanotherdevelopersblog.blogspot.com/

Código disponível em: https://github.com/
rafaeladson/examples/tree/master/
hiraganaTranslator-pom



Obrigado por terem vindo!!!!

Mais conteúdo relacionado

Mais procurados

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
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddCarlos Santana
 
Testes Unitários/Integrados
Testes Unitários/IntegradosTestes Unitários/Integrados
Testes Unitários/IntegradosGiovanni Bassi
 
Crackeando aplicativos no android _by c0_m3nd4d0r
Crackeando aplicativos no android  _by c0_m3nd4d0rCrackeando aplicativos no android  _by c0_m3nd4d0r
Crackeando aplicativos no android _by c0_m3nd4d0rnunes666
 
Por que automatizar testes de software?
Por que automatizar testes de software?Por que automatizar testes de software?
Por que automatizar testes de software?Samuel Lourenço
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitRobinson Castilho
 
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
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Thiago Faria de Andrade
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de SoftwareMaurício Aniche
 
Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!
Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!
Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!Robson Bittencourt
 

Mais procurados (20)

Teste de software
Teste de softwareTeste de software
Teste de software
 
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?
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tdd
 
Testes Unitários/Integrados
Testes Unitários/IntegradosTestes Unitários/Integrados
Testes Unitários/Integrados
 
Crackeando aplicativos no android _by c0_m3nd4d0r
Crackeando aplicativos no android  _by c0_m3nd4d0rCrackeando aplicativos no android  _by c0_m3nd4d0r
Crackeando aplicativos no android _by c0_m3nd4d0r
 
Por que automatizar testes de software?
Por que automatizar testes de software?Por que automatizar testes de software?
Por que automatizar testes de software?
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
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
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...
 
JUnit
JUnitJUnit
JUnit
 
JAVA - Tratamento de Erros
JAVA - Tratamento de ErrosJAVA - Tratamento de Erros
JAVA - Tratamento de Erros
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
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
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de Software
 
Junit
JunitJunit
Junit
 
Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!
Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!
Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!
 

Destaque

Destaque (6)

Jugvale
JugvaleJugvale
Jugvale
 
JEE nas nuvens: uma introdução ao openshift
JEE nas nuvens:  uma introdução ao openshiftJEE nas nuvens:  uma introdução ao openshift
JEE nas nuvens: uma introdução ao openshift
 
Introdução ao java fx e visage
Introdução ao java fx e visageIntrodução ao java fx e visage
Introdução ao java fx e visage
 
Jclouds jug vale
Jclouds jug valeJclouds jug vale
Jclouds jug vale
 
2º encontro do jug vale
2º encontro do jug vale2º encontro do jug vale
2º encontro do jug vale
 
Boas práticas e técnicas para codificação
Boas práticas e técnicas para codificaçãoBoas práticas e técnicas para codificação
Boas práticas e técnicas para codificação
 

Semelhante a Android testing PT-BR

Automatize seus testes de UI com a Espresso!
Automatize seus testes de UI com a Espresso!Automatize seus testes de UI com a Espresso!
Automatize seus testes de UI com a Espresso!Ramon Ribeiro Rabello
 
Dubles de Testes - Na Pratica
Dubles de Testes - Na PraticaDubles de Testes - Na Pratica
Dubles de Testes - Na PraticaIsmael
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"thiagobapt
 
Test driven development
Test driven developmentTest driven development
Test driven developmentclauvane1708
 
Teste cabra da peste
Teste cabra da pesteTeste cabra da peste
Teste cabra da pesteMichele Silva
 
Django Object factory
Django Object factoryDjango Object factory
Django Object factoryitalomaia
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de softwareHeider Lopes
 
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
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...Isaac de Souza
 
Testes Unitários: Começando a escrever testes no seu dia-a-dia
Testes Unitários: Começando a escrever testes no seu dia-a-diaTestes Unitários: Começando a escrever testes no seu dia-a-dia
Testes Unitários: Começando a escrever testes no seu dia-a-diaAlex Tercete
 
Testes automatizados de interface no Android
Testes automatizados de interface no AndroidTestes automatizados de interface no Android
Testes automatizados de interface no AndroidCarlos Cavalcanti
 
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
 

Semelhante a Android testing PT-BR (20)

Testes - Para que?
Testes - Para que?Testes - Para que?
Testes - Para que?
 
Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
Automatize seus testes de UI com a Espresso!
Automatize seus testes de UI com a Espresso!Automatize seus testes de UI com a Espresso!
Automatize seus testes de UI com a Espresso!
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Dubles de Testes - Na Pratica
Dubles de Testes - Na PraticaDubles de Testes - Na Pratica
Dubles de Testes - Na Pratica
 
TDD (Resumo)
TDD (Resumo)TDD (Resumo)
TDD (Resumo)
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Teste agora! Não deixe para depois!
Teste agora! Não deixe para depois!Teste agora! Não deixe para depois!
Teste agora! Não deixe para depois!
 
Teste cabra da peste
Teste cabra da pesteTeste cabra da peste
Teste cabra da peste
 
Django Object factory
Django Object factoryDjango Object factory
Django Object factory
 
Debugging node
Debugging nodeDebugging node
Debugging node
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software
 
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
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
 
Testes Unitários: Começando a escrever testes no seu dia-a-dia
Testes Unitários: Começando a escrever testes no seu dia-a-diaTestes Unitários: Começando a escrever testes no seu dia-a-dia
Testes Unitários: Começando a escrever testes no seu dia-a-dia
 
Testes automatizados de interface no Android
Testes automatizados de interface no AndroidTestes automatizados de interface no Android
Testes automatizados de interface no Android
 
C# 8 e ML.NET
C# 8 e ML.NETC# 8 e ML.NET
C# 8 e ML.NET
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 

Android testing PT-BR

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n