Concrete Logo
Hamburger button

Automatizando Testes de Interface Web em Ruby

  • Blog
  • 26 de Outubro de 2016
Share

Já falamos sobre Especificação Por Exemplo em outros posts aqui no Blog. Se você não viu, pode acessar a primeira parte da série aqui. Hoje, vamos mostrar como podemos automatizar os testes de interface utilizando as especificações geradas.

Testes Automatizados de Interface para Web

Existem muitas ferramentas para automatizar testes de interface em aplicações web. A mais famosa delas é o Selenium Webdriver, que é open source e está disponível em muitas linguagens (Java, C#, Python, Ruby, Perl, PHP, Javascript).

Com o Selenium você consegue simular as ações dos usuários no browser (escolher opções, clicar em botões, preencher campos, submeter arquivos e muitas outras). Assim, você consegue automatizar o fluxo que o usuário segue dentro da sua aplicação e verificar os outputs (com frameworks de xUnit por exemplo) para garantir que o resultado obtido é o esperado para aquele fluxo.

Além do Selenium, existem outras ferramentas que permitem usar o mesmo driver (e chamar métodos selenium também) e facilitam bastante a automação dos testes. Em Ruby temos o Capybara e em Python o Splinter.

Aqui na Concrete estamos usando o Capybara + Siteprism (uma DSL bem legal de Page Objects*), além do Cucumber para criar as especificações.

*Para saber mais sobre Page Objects, clique aqui.

Facilitando as coisas com o Magneton

Para automatizar as especificações, contamos com algumas camadas:

– Especificações: camada na qual vão ficar os arquivos .feature com os nossos cenários em linguagem natural

– Steps: onde ficam os passos gerados a partir das features

– Pages: onde ficam os pages objects, encarregados pela manipulação dos elementos

Além disso, precisamos de algumas opções para execução desses testes, por exemplo escolher em qual browser ou até em que ambiente rodar (você pode ter um ambiente de desenvolvimento e outro de homologação, e é importante conseguir rodar os mesmos testes em ambos).

Para facilitar a geração dessa estrutura e configurações, criamos uma gem chamada Magneton (RubyGems, Github).

Magneton

Sim, é o nome de um Pokemón

Configurando seu ambiente

É necessário instalar o Rbenv, que vai te ajudar a administrar diferentes ambientes Ruby na sua máquina. Assim você consegue trabalhar com diferentes versões sem alterar a instalação default do sistema operacional. Siga os passos indicados na documentação.

Depois disso instale o bundle, que vai te ajudar na instalação das gems.

Usando o Magneton

Para instalar basta executar no terminal:

Lembrete: no README da gem tem várias informações e explicação sobre os comandos.

Para criar seu primeiro projeto:

E então sua estrutura de testes está pronta:

image04

Estrutura gerada pela gem

Agora basta executar:

E todas as gems necessárias a esse projeto serão instaladas.

Para criar sua primeira feature, basta utilizar o comando (dentro da pasta criada com o comando anterior):

image00

Criado o arquivo de feature, um step e um page object

Para saber tudo que já está implementado na gem, basta olhar o README no github.

Criando sua primeira feature

Dentro do arquivo /specifications/todo.feature gerado no passo anterior, vamos mapear um cenário para a funcionalidade.

Para esse exemplo estou usando uma aplicação web de ToDos, ou seja, você pode cadastrar vários ToDos com um título e uma descrição. Ela foi feita em Python utilizando Flask e está disponível no meu github.

Tela do ToDoApp

Tela do ToDoApp



 

Para saber como escrever bons cenários, vale a pena ler:

https://blog.codeship.com/cucumber-best-practices/

https://blog.engineyard.com/2009/15-expert-tips-for-using-cucumber

https://github.com/strongqa/howitzer/wiki/Cucumber-Best-Practices

https://spin.atomicobject.com/2011/06/02/never-say-click-good-cucumber-system-testing-practices/

Feito isso, basta executar:

E o Cucumber vai gerar os steps pra você:

image05

Depois é só copiar e colar no arquivo features/steps_definitions/todo_steps.rb, que vai ficar assim:

Agora, se você executar novamente:

A saída do console vai indicar que existe um cenário com 3 passos que precisam ser implementados.

image06

Implementando os cenários

Agora que já sabemos qual o fluxo que o usuário vai seguir, precisamos automatizar os passos para isso.

Nosso page object features/pages/todo_page.rb vai ficar com o seguinte conteúdo, representando a homepage do nosso ToDoApp:

Vamos criar outro page object chamado  features/pages/create_todo_page.rb para representar a página na qual criamos os ToDos. Ele vai ter o seguinte conteúdo:

Feito isso, podemos voltar para os nossos steps e utilizar os métodos que criamos nos page objects para simular as ações do usuário. Nosso arquivo features/steps_definitions/todo_steps.rb vai ficar com o seguinte conteúdo:

Ao rodar novamente:

A saída do console vai indicar que o cenário e seus 3 steps passaram.

Testes passando \o/

Testes passando \o/

Vídeo da execução – https://goo.gl/brzvYv

Concluindo

Os testes automatizados ajudam muito quando se fala de testes regressivos, imagine testar manualmente esse cenário de Criação de ToDos toda vez que a aplicação tiver uma alteração?

Com nosso teste automatizado, que é executado em 2 segundos, conseguimos garantir que esse cenário sempre será validado, dando segurança na implementação de mudanças.

Pra quem quiser ler mais sobre o tema, tem um repositório meu com explicações detalhadas sobre o capybara.

Dúvidas? Só comentar aqui no post! 🙂

Trabalha com QA e quer fazer parte de um time ágil de verdade? Clique aqui.