This is the presentation I'll make in JUG Valle about Android Testing. It's in Brazilian portuguese.
Essa é a apresentação que eu estarei apresentando sobre Testes em Android na JUG Valle este final de semana.
6. Dois tipos de Testes
Testes Automatizados
Testes Manuais
7. 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.
8. 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?
9. 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.
11. Testes
Automatizados
Testes Unitários
Testes de Integração
Testes de Sistema (Aceitação)
Testes de Carga
Monkey
12. 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.
16. 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.
18. 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.
19. Singletons
public class Mailer {
private Mailer() {...}
public static Mailer getInstance() {...}
public void sendEmailTo100People() {...}
}
22. 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!
23. 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!
25. 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!
36. 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....
37. 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.
41. 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.
47. 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!
50. 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.
51. Teste de Integração
Testar se um Intent foi disparado
Por exemplo, depois de clicar em um botão
ou em um Menu
52. 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.
56. 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)
57. 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).
62. 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