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

Testes de UI legíveis e sustentáveis para Android

Testes de UI legíveis e sustentáveis para Android

Frameworks como Espresso permitem criar testes de interface do usuário para Android, mas eles podem ser difíceis de gerenciar e exigem atualizações constantemente. Nessa talk vou apresentar como escrever teste de UI que sejam legíveis e sustentáveis utilizando o padrão Robot.

Felipe Arimateia

September 02, 2017
Tweet

More Decks by Felipe Arimateia

Other Decks in Programming

Transcript

  1. Por que realizar teste automatizado de UI? O teste automatizado

    de UI permite que você escreva planos de testes dos recursos mais importantes da sua aplicação de forma consistente e rápida do que os teste manuais.
  2. Cenário Um código fonte que gera 8 aplicações com diferenças

    no idioma, tema e features. 10 desenvolvedores trabalhando no mesmo código fonte. Testers que não sabem programar.
  3. Espresso O Espresso fornece um conjunto de APIs para desenvolver

    testes de UI e testar os fluxos do usuário.
  4. Teste @Test public void purchaseSuccess() { onView(withId(R.id.productName)) .perform(typeText("Refrigerante"), closeSoftKeyboard()); onView(withId(R.id.productQuantity))

    .perform(typeText("10"), pressImeActionButton()); onView(withText("Comprar")).perform(click()); onView(withText("Compra realizada com sucesso")) .check(matches(withEffectiveVisibility( ViewMatchers.Visibility.VISIBLE ))); }
  5. Depois de escrito o primeiro teste, agora podemos copiá-lo e

    modificá-lo para testar os demais cenários. Presenter Model View Test Test Test Test Qual o problema dessa abordagem? Alteração X X X X
  6. Principais problemas Para cada teste ou aplicação a repetição de

    código era nítida. O código do teste começou a ficar insustentável. E para os testers escreverem os testes demandava muita ajuda dos desenvolvedores.
  7. Então como criar testes legíveis para facilitar a curva de

    aprendizado dos testers e sustentáveis para diferentes aplicações?
  8. Vamos analisar o problema Eu quero comprar 10 cervejas. What

    @Test public void purchaseSuccess() { onView(withId(R.id.productName)) .perform(typeText("Refrigerante"),closeSoftKeyboard()); onView(withId(R.id.productQuantity)) .perform(typeText("10"), pressImeActionButton()); onView(withText("Comprar")).perform(click()); onView(withText("Compra realizada com sucesso")) .check(matches(withEffectiveVisibility( ViewMatchers.Visibility.VISIBLE ))); } How
  9. Robot Pattern É um padrão de design para a escrita

    de testes estáveis, legíveis e sustentáveis. O padrão Robot permite facilmente encapsular consultas e ações do Espresso em uma classe robot.
  10. public class MainRobot { public MainRobot product(String product) { onView(withId(R.id.productName)).perform(typeText(product),

    closeSoftKeyboard()); return this; } public MainRobot quantity(String quatity) { onView(withId(R.id.productQuantity)).perform(typeText(quatity), pressImeActionButton()); return this; } public ResultRobot purchase() { onView(withId(R.id.purchase)).perform(click()); return new ResultRobot(); } public class ResultRobot { public void isSuccess(String message) { onView(withText(message)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))); } } }
  11. Teste @Test public void purchaseSuccess() { MainRobot robot = new

    MainRobot(); robot.product("Refrigerante").quantity("10").purchase() .isSuccess("Compra realizada com sucesso"); }
  12. Vamos analisar a solução Eu quero comprar 10 cervejas. What

    @Test public void purchaseSuccess() { MainRobot robot = new MainRobot(); robot.product("Cerveja").quantity("10").purchase() .isSuccess("Compra realizada com sucesso"); } How
  13. O que ganhamos? Todo código referente às consultas e ações

    do Espresso são compartilhadas entre as 8 aplicações. Mais engajamentos dos testers. E agora os testes de regressão são executados em menos de uma hora.
  14. Teste de Regressão Antes dos testes automatizado gastava-se 8hs para

    realizar o teste de regressão de apenas uma funcionalidade. Hoje a cada Pull Request que é enviado para o Git é realizado os testes no ambiente de CI (Continuous Integration).
  15. Reaproveitamento Para todo teste que realizamos tem a pré-condição de

    fazer o login, esse é o robot mais utilizado. @Test public void loginSuccess() { LoginRobot robot = new LoginRobot(); robot.email("[email protected]") .password("sucesso") .login() .successAccess(); }
  16. Reaproveitamento Qualquer produto que for adicionado no caminhão é sempre

    através de uma lista então temos um robot para essa tarefa. AddMyTruckRobot addMyTruckRobot = new AddMyTruckRobot(); addMyTruckRobot.item("Product One") .quantity(10) .add();
  17. Reaproveitamento @Test public void addMyTruckWithSuccess() { BrowseRobot browseRobot = new

    BrowseRobot(); browseRobot.openCategory("Category 1"); AddMyTruckRobot addMyTruckRobot = new AddMyTruckRobot(); addMyTruckRobot .item("Product 2") .quantity(10) .add(); }
  18. Próximos passos Converter todos nossos testes para Kotlin, para deixá-lo

    menos verbo. @Test fun addMyTruckWithSuccess() { browser { openCategory("Category 1") } products { item("Product 2") quantity(10) } truck { add() }