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

Teste de aceitação com Page Objects

Teste de aceitação com Page Objects

Quando fazemos um teste de aceitação end-to-end normalmente nós manipulamos diretamente o HTML da página, o que faz com que qualquer alteração na UI possa quebrar seus testes. Usando Page Objects nós separamos a manipulação do HTML do teste em si, o que torna os testes muito mais robustos e fáceis de dar manutenção. Nesta apresentação quero mostrar uma forma de usar Page Objects para fazer testes de aceitação utilizando Capybara.

Avatar for Raphael Monteiro

Raphael Monteiro

July 15, 2017
Tweet

Other Decks in Programming

Transcript

  1. • Co-founder de uma fintech startup chamada (www.rapidoo.com.br) • Plataforma

    que oferece crédito para micro e pequenas empresas através da antecipação de recebíveis • 1 ano de empresa \o/ QUEM SOU EU?
  2. UM POUCO DE CONTEXTO • 92% de cobertura de testes

    • Somente testes unitários • 3 semanas atrás
  3. MAS TESTES DE INTEGRAÇÃO NÃO SÃO O SUFICIENTE? • Ótimos

    para testar como várias partes do sistema interagem entre si • MAS deixa de fora como o usuário interage com o sistema • MAS ignora as alterações feitas pelo JS
  4. HISTÓRIA PESSOAL (Parte 1 - A revolta) • Projeto cresceu

    • Difícil de ler e entender • Qualquer mudança na UI quebrava vários testes • Seletores de HTML espalhados • Jogamos tudo fora!!! Trauma de testes de aceitação
  5. HISTÓRIA PESSOAL (Parte 2 - O retorno) • Mudança em

    uma regra de negócio • Inclusão de uma validação • Regras na view • Testes unitários passando • FAIL!!! Precisamos garantir que o fluxo não quebre!
  6. OK! VAMOS FAZER, MAS... Precisamos garantir que: • Seja fácil

    de dar manutenção; • Não tenha muita duplicidade de código; • Seja simples de entender o objetivo do teste; • Separar testes unitários e testes de aceitação; • Não vire legado!
  7. PRINCÍPIOS • O teste não deve conhecer como o HTML

    da UI foi implementado • Criar uma camada entre o caso de teste e a interação com a UI • Deve existir apenas um lugar com o conhecimento da estrutura do HTML
  8. TIPOS DE PAGE OBJECTS • Componentes ◦ Tabelas, listas, menus

    • Fluxo / Experiência ◦ Ex: checkout e-commerce • Página completa
  9. Boas práticas • Comece alto nível e então vá extraindo

    conforme a necessidade • Não coloque asserts dentro de Page Objects (!!!) • O setup (ex: factory) deve ficar no caso de teste • A estrutura deve ter uma forma que faz sentido para o usuário da aplicação. ◦ Como o usuário descreveria o fluxo ou ação tomada? • Os métodos podem retornar outros Page Objects • Não expor detalhes do HTML
  10. NEM TUDO SÃO FLORES... • Trocamos o driver do capybara-webkit

    que é headless e mais rápido pelo Selenium, por causa de testes muito instáveis; • Ainda temos alguns problemas com o CI.
  11. Exemplo com Rails / Minitest SEPARAR TESTES Importante poder rodar

    os testes de sistema/aceitação separado dos outros testes.
  12. RAILS 5.1 OUT-OF-THE-BOX • Capybara integrado • Não precisa se

    preocupar com a limpeza dos db (DatabaseCleaner) • Rodar testes unitários separados dos de sistema • Só chegar e usar!!!
  13. TODO MUNDO DEVE TER TESTES DE ACEITAÇÃO? • Depende do

    tipo de aplicação (ex: API) • Maturidade do produto • Testar somente os fluxos mais importantes • Entender a necessidade • Outras soluções: Remover a lógica da view e fazer testes unitários.
  14. PROS / CONS • Vantagens: ◦ Reutilizar código ◦ Testes

    mais expressivos • Desvantagens: ◦ Lentos ◦ Mais código para escrever e dar manutenção
  15. TAKE HOME • Os métodos públicos representam os serviços que

    aquela página oferece • Tente não expor os detalhes da página • Mantenha os asserts fora dos Page Objects • Métodos podem retornar outros Page Objects • Um Page Object não precisa representar uma página inteira. Pode ser só parte dela. • Diferentes resultados para mesmas ações são modelados como diferentes métodos.
  16. REFERÊNCIAS • Selenium Wiki (https://github.com/SeleniumHQ/selenium/wiki/PageObjects) • Martin Fowler (https://martinfowler.com/bliki/PageObject.html) •

    Thoughtbot (https://robots.thoughtbot.com/better-acceptance-tests-with-page-objects / https://thoughtbot.com/upcase/videos/page-objects) • Tutsplus (https://code.tutsplus.com/articles/ruby-page-objects-for-capybara-connoisseurs--cms-25204) • Chris Kottom (https://chriskottom.com/blog/2017/04/full-stack-testing-with-rails-system-tests/) • Pluralsight (www.pluralsight.com/guides/software-engineering-best-practices/getting-started-with-page-object-pattern-for-your-selenium-tests)