Android testing PT-BR

3,186 views

Published on

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.

Published in: Technology
  • Como vc soluciona o problema do slide 8? Como testar versões diferentes de android sem ter todos os devices? Alguma ferramenta?
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Android testing PT-BR

  1. 1. Test Driven Android Apps Rafael Adson Barbosa Barroshttp://yetanotherdevelopersblog.blogspot.com/
  2. 2. Fontes
  3. 3. ConteúdoPor que fazer testes?Testes ManuaisPré-requisitos & Boas PráticasTestes UnitáriosMocks and Stubs.
  4. 4. ConteúdoTestes de IntegraçãoTestes de SistemaBuild Automático e Integração ContínuaConclusão
  5. 5. Por que fazer testes?
  6. 6. Dois tipos de TestesTestes AutomatizadosTestes Manuais
  7. 7. Testes ManuaisPegar pessoas conhecidas e entrega aplicaçãonas mãos delas. Peça Feedback. Minha aplicação já mudou de cara bastante por causa disso.Desenvolvedores possuem zelo pelo própriocódigo, por isso não são bons testers.
  8. 8. Testes ManuaisProblemas: 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. 9. Testes ManuaisDemanda pra time de testes é muito maior doque para times de desenvolvimento, pois: eles tem que testar novas funcionalidades eles tem que verificar se o que já existia antes continua funcionando.
  10. 10. Testes ManuaisTestes Manuais são importantes!!!Mas não podem ser sua única forma de atacaro problema!
  11. 11. Testes AutomatizadosTestes UnitáriosTestes de IntegraçãoTestes de Sistema (Aceitação)Testes de CargaMonkey
  12. 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.
  13. 13. Pré-requisitosMais Dificuldades: Código Spagetti Muitas Dependências. Métodos Estáticos. Singletons.
  14. 14. Métodos Estáticospublic void doSomething() { Mailer.sendEmailTo100People();}
  15. 15. Dependênciaspublic class ClassUnderTest{ private CantInstantiate i; public ClassUnderTest(CantInstantiate i) { Preconditions.checkNotNull(i); this.i = i; }}
  16. 16. DependênciasCantInstantiate pode ser difícil de instanciarpois: 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.
  17. 17. Dependênciaspublic void doSomething(CantInstantiate i) { //difícil de testar esse método, hem??}
  18. 18. DependênciasSe for difícil de escrever o teste, ninguém vaiescrever o teste.Se sua classe tiver muita dependência difícil deresolver => As pessoas não vão querer escrevertestes pra sua classe.
  19. 19. Singletonspublic class Mailer { private Mailer() {...} public static Mailer getInstance() {...} public void sendEmailTo100People() {...}}
  20. 20. Singletonspublic class ThingThatDependsOnMailer { private Mailer m = Mailer.getInstance(); public void doSomething() { m.sendEmailTo100People(); }}
  21. 21. Seus Amigos nessas horasTDDRefatoraçãoReuso
  22. 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. 23. ReusoDe quebra, você ainda economiza tempo (Nãoprecisa escrever busca binária pra mais nada!!!)Mas cuidado com: YAGNI KISSNa dúvida, torne coisas genéricas quando vocêprecisar!
  24. 24. AplicativosHiragana Translator Kotoba Flashcards (Demonstração)
  25. 25. Hiragana TranslatorVocê digita uma sílaba(com caracteres normais)Aperta Translate!Ele mostra o hiraganacorrespondenteMostra um erro devalidação se o Hiragananão for encontrado!
  26. 26. Testes UnitáriosTestar unidade em isolamentoSe necessário, usar mocks e stubs.Rápido!TestNG
  27. 27. Testes Unitários
  28. 28. Testes Unitários
  29. 29. Testes Unitários
  30. 30. Testes Unitários
  31. 31. Testes UnitáriosAvançando um pouquinho...
  32. 32. Testes Unitários
  33. 33. Testes Unitários
  34. 34. Testes UnitáriosNão acabou!!!
  35. 35. Testes UnitáriosNão acabou!!!
  36. 36. Testes UnitáriosAinda existem casos de testes que poderiamser 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. 37. Exemplo de Mock (Teste Unitário)Supondo que eu tenha uma classe MyAnalyticscom o método logTranslation(String text) quemanda a tradução que o usuário pediu para oservidor, para que eu possa analisar e melhorarminhas traduções...Vou usar Mockito.
  38. 38. Exemplo de Mock (Teste Unitário)
  39. 39. Exemplo de Mock (Teste Unitário)
  40. 40. Exemplo de Mock (Teste Unitário)
  41. 41. Testes de Integração1. Usuário preenche o campo com algo válido, o hiragana tem que aparecer no texto indicado2. Usuário preenche o campo com algo inválido ou deixa vazio, texto tem que ficar vazio e aparecer um erro de validação.
  42. 42. Testes de Integração Setup:
  43. 43. Teste de Integração
  44. 44. Teste de Integração
  45. 45. Teste de Integração
  46. 46. Teste de Integração
  47. 47. Stub em Teste de IntegraçãoMesmo caso anterior, mas agora chamada aoMyAnalytics está na ActivityNão dá mais pra usar Mockito => quem rodaagora é a DalvikVM!Solução: Faça você mesmo!Pra economizar tempo, não vou demonstrar!
  48. 48. Teste de BDAgora vou mostrar no Kotoba!
  49. 49. Teste de BD
  50. 50. Teste de IntegraçãoDá pra fazer bem mais coisa do que foimostrado: 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. 51. Teste de IntegraçãoTestar se um Intent foi disparado Por exemplo, depois de clicar em um botão ou em um Menu
  52. 52. Teste de SistemaDuas opções: Monkeyrunner RobotiumInfelizmente MonkeyRunner tem interface muitolimitada => você tem que informar as posições exatasda interface onde você deve clicar (ou extender).Pra mim, Robotium é a maneira de fazer esse tipo deteste.
  53. 53. Teste de Sistema
  54. 54. Teste de Sistema
  55. 55. Testes de Sistema
  56. 56. Teste de SistemaA estrutura de UIs mostrada anteriormentepode ser utilizada também para evitarrepetição nos testes de Solo.No momento que essa apresentação está sendofeita, solo não lida bem com ActionBar(android >= 3.0)
  57. 57. Build AutomáticoAnt (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).
  58. 58. Build Automáticoandroid-maven-pluginTrês projetos, conforme odiagrama.Dependency managementno X-pomPasta do source do androiddeve ser src/Usar packaging apk eapklib
  59. 59. pom.xml dohiragana-translator
  60. 60. pom.xml dohiraganaTranslator-test
  61. 61. Integração ContínuaJenkins c/ AndroidEmulatorPluginBuild baseando-se em matrizMonkey
  62. 62. Integração ContínuaPara cada build: Jenkins inicializa um emulador (a partir de snapshot) Faz o build do maven (rodando todos os testes) Roda monkey
  63. 63. Integração Contínua
  64. 64. Integração Contínua
  65. 65. Integração Contínua
  66. 66. Integração Contínua
  67. 67. Integração Contínua
  68. 68. BenchmarkingAndroid não oferece uma solução debenchmarking padrão.No entanto, se você faz teste de sistema =>você consegue fazer benchmarking.
  69. 69. Benchmarking
  70. 70. ConclusãoApresentação disponível para download em:http://yetanotherdevelopersblog.blogspot.com/Código disponível em: https://github.com/rafaeladson/examples/tree/master/hiraganaTranslator-pomObrigado por terem vindo!!!!

×