Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android Dev Conference 2017 - Precisamos falar sobre testes...

Android Dev Conference 2017 - Precisamos falar sobre testes...

Uma apresentação sobre a diferença entre testes locais ou instrumentados e unitários ou end to end.

Victor Oliveira Nascimento

August 25, 2017
Tweet

More Decks by Victor Oliveira Nascimento

Other Decks in Programming

Transcript

  1. Victor Oliveira Nascimento •Gerente Android da Concrete •Setenta e doze

    projetos em produção com um time de cinquenta e treze devs •Atual campeão de Street Fighter da Concrete •Evangelista de Erlang/Elixir e real time anything
  2. Teste é uma das ferramentas para verifcar a aderência de

    uma implementação de software a uma dada especifcação. CS, CS - 2017
  3. LOCAL VS INSTRUMENTADO - JVM vs Dalvik @RunWith(AndroidJUnit4::class) class UniverseTest

    { @Test fun assertSmt() { Assert.assertTrue(Universe.isInfinite()) } } class AnotherUniverseTest { @Test fun assertSmt() { Assert.assertTrue(Universe.isInfinite()) } } // Java public abstract class Universe { public static boolean isInfinite() { return new Random().nextBoolean(); // Academic answer } }
  4. LOCAL vs INSTRUMENTADO - JVM java.lang.AssertionError at org.junit.Assert.fail(Assert.java:86) at org.junit.Assert.assertTrue(Assert.java:41)

    at org.junit.Assert.assertTrue(Assert.java:52) at br.com.concrete.androidtesting.AnotherUniverseTest.assertSmt(AnotherUniverseTest.kt:9) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) ... at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) ...
  5. LOCAL vs INSTRUMENTADO - Dalvik java.lang.AssertionError at org.junit.Assert.fail(Assert.java:86) at org.junit.Assert.assertTrue(Assert.java:41)

    at org.junit.Assert.assertTrue(Assert.java:52) at br.com.concrete.androidtesting.UniverseTest.assertSmt(UniverseTest.kt:12) at java.lang.reflect.Method.invoke(Native Method) ... at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at org.junit.runner.JUnitCore.run(JUnitCore.java:115) at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58) at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:369) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1932)
  6. LOCAL vs INSTRUMENTADO - Runners java org.junit.runner.JUnitCore TestClass1 TestClass2 adb

    shell am instrument -w com.android.foo/android.support.test.runner.AndroidJU nitRunner
  7. (...) Programmers implement instrumentation in the form of code instructions

    that monitor specifc components in a system (...). When an application contains instrumentation code, it can be managed using a management tool. (...) https://en.wikipedia.org/wiki/Instrumentation_(computer_programmin g)
  8. (...) Programadores implementam “instrumentação” na forma de instruções de código

    que monitoram componentes específcos em um sistema (...). Quando uma aplicação contém código de instrumentação, ela pode ser gerenciada por uma ferramenta. (...) VERSÃO #BRHUEHUEHU
  9. LOCAL vs INSTRUMENTADO - Runners •A forma de execução é

    essencialmente diferente •Durante a instrumentação, monitoramos o app ao invés de comandarmos o app •Portanto, nossa validação de aderência de especifcação tem valor diferente para cada tipo
  10. TESTES INSTRUMENTADOS Vantagens Desvantagens 1.Ambiente de execução próximo ao executado

    pelo cliente, incluindo devices físicos 1.Tempo de execução 2. Não simula/emula/imita o sistema 2. Flakiness (falhas aleatórias) 3. Android é o front-end e, portanto, precisa de qualquer maneira ter testes de interação 3. Complexidade de setup de integração contínua
  11. TESTES LOCAIS Vantagens Desvantagens 1.Tempo de execução 1.Se apoia em

    uma simulação/emulação/imitação de um sistema operacional 2. Estabilidade de testes 2. É um runtime diferente que pode interpretar o código diferente 3. Facilidade de setup 3. Está distante do que é executado na mão do usuário
  12. •Google está providenciando novas ferramentas: ◦Espresso 3.0 (com runner 1.0)

    está extremamente mais estável ◦IdlingRegistry ajuda a confgurar timing de UI ◦Android Test Orchestrator garante a estabilidade da suite •Milhares de serviços de device farm estão aparecendo: ◦Firebase Test Lab ◦Amazon device farm •O Robolectric está bem ativo ultimamente com várias atualizações visando paridade de API MINIMIZANDO DESVANTAGENS - instrumentado
  13. •Desacoplar do framework Android criando camadas de indireção •Mockar quando

    não for possível desacoplar MINIMIZANDO DESVANTAGENS - local O valor gerado mesmo pelo teste que não depende do Android ou do teste que usa mocks é diferente daquele gerado pelo teste instrumentado. No fm das contas, seu código será executado em outro ambiente.
  14. (...) A unit test is an automated piece of code

    that invokes a unit of work in the system and then checks a single assumption about the behavior of that unit of work. (...) http://artofunittesting.com/defnition-of-a-unit-test/
  15. (...) Um teste de unidade é um teste automatizado que

    executa uma unidade de trabalho do sistema e depois verifca uma suposição sobre o comportamento daquela unidade de trabalho. (...) VERSÃO #BRHUEHUEHU
  16. TIPOS DE UNIDADE 1.Menor granularidade do código (normalmente testes locais):

    a.Método b.Classe c.Etc... 2.Menor interação possível do app (normalmente testes instrumentados): a.Clique, swipe, pinch, drag, etc b.Resposta a erros c.Carregamento inicial da tela
  17. CARACTERÍSTICAS END TO END - Casos de uso agrupados em

    cenários - Escritos em linguagem natural normalmente usando Gherking (cucumber) - São black-box (não se importam com a implementação) - Idealmente sem mocks/fakes/stubs - Documentação viva e executável das regras do projeto
  18. EXEMPLO GHERKIN Feature: Serve coffee Coffee should not be served

    until paid for Coffee should not be served until the button has been pressed If there is no coffee left then money should be refunded Scenario: Buy last coffee Given there are 1 coffees left in the machine And I have deposited 1$ When I press the coffee button Then I should be served a coffee
  19. TESTES UNITÁRIOS vs E2E - Devs: testes unitários - Locais

    - Instrumentados - QAs: qualquer ferramenta que garanta qualidade - Testes E2E - Stress test - Testes de API - Etc, etc, etc
  20. Centro Av. Presidente Wilson, 231 - 29º andar (21) 2240-2030

    Cidade Monções Av. Nações Unidas, 11.541 - 3º andar (11) 4119-0449 Savassi Av. Getúlio Vargas, 671 Sala 800 - 8º andar (31) 3360-8900 www.concrete.co m.br