Debugando seus testes usando a gem Pry

binding.pry

Quando estamos desenvolvemos uma automação de testes, precisamos executá-la diversas vezes para validar alguma lógica do código ou para saber se o que foi escrito está realmente testando a funcionalidade do jeito adequado. Mas isso pode gastar muito do nosso tempo, pois vão ser necessárias muitas repetições até chegar ao trecho da execução. Imagine a seguinte situação:

Uma funcionalidade simples, mas que tenha 3 passos. O teste escrito inicialmente para ela funciona bem no começo, mas no meio do script ele não se comporta como deveria e acaba quebrando. Nesse caso você teria que fazer o ajuste e rodar novamente o teste todo, isso pode gastar muito tempo pois a cada novo ajuste você precisa rodar todos os outros passos anteriores para validar apenas um único ponto do código que esta no meio ou no final dele por exemplo.

A solução para isso é ter um "breakpoint" no meio da automação, onde você consegue interagir com o software e validar seu código/lógica em tempo real e encontrar o melhor jeito de escrever seu teste.

Na linguagem Ruby temos a gem Pry que faz exatamente isso !

Pry é uma gem que podemos usar para incluir esse ponto de debug no meio da automação, ou seja, no caso que citei acima basta incluir o Pry no segundo passo e enquanto a automação esta pausada podemos inserir comandos no terminal e ver quais se comportam melhor nessa parte do software.

Pry é uma alternativa poderosa para o IRB padrão do terminal Ruby. Possui destaque de sintaxe, uma arquitetura de plugin flexível, invocação de tempo de execução e navegação de fontes e documentação.

Como toda gem em Ruby é necessário primeiro fazer a sua instalação, use o comando abaixo:

gem install pry

Além disso temos que adicionar ao arquivo Gemfile do projeto essa nova dependência. Abaixo existe um exemplo, esse arquivo estou usando em meu projeto.

Gemfile

Dentro do projeto precisamos também fazer um require para poder usar os recursos do Pry. Minha automação de testes foi feita com o framework Appium, como tenho um arquivo de configuração centralizado deixei o require dentro dele.

env.rb

Próximo passo é identificar aonde seu teste esta quebrando, se você esta usando o Cucumber isso fica bem mais fácil. Para exemplificar vou usar uma funcionalidade básica que é de realizar um login no sistema, como já citado ela contém 3 passos.

login.feature

No exemplo, a automação esta conseguindo acessar a plataforma e digitar o usuário e senha, mas esta quebrando no momento de clicar no botão para efetivar o login.

Ou seja, o passo "Quando efetuo o login com credenciais validas" não esta funcionando direito. Para o ajudar na correção e temos que usar o Pry, e para isso temos que ir na automação e inserir o comando "binding.pry" antes to ponto que esta havendo o problema, esse comando vai ser responsável pelo momento em que o debug vai ser acionado.

login_steps.rb

Rodei a automação com o Pry e vou descrever abaixo as etapas que utilizei:

log do terminal em modo debug Pry

[0] após rodar a automação pelo terminal, o teste percorre os passos anteriores e entra em modo debug aguardando a nossa interação através de comandos. Na imagem conseguimos ver o trecho exato onde a automação esta parada;

[1] usei novamente o comando find_element(id: 'button').click e a automação retornou novamente o erro que já foi identificado;

[2] alterei a estratégia de localização do elemento, e agora ao invés de buscar pelo id eu estou usando o tag_name. Veja que na mensagem abaixo é retornado um identificador do elemento em verde;

[3], [4] e [5] como agora já encontrei o elemento estou usando outros métodos de interação e o retorno de cada ação é exibido abaixo:

.displayed? retorna true

.text retorna "Login"

.name retorna " "

[6] usei o método .click no elemento e com esse comando a automação passa a funcionar do jeito que esperamos;

[7] digitei o comando exit, isso faz com que a automação saia do debug do Pry e volte a executar o resto do seu fluxo.

Depois que toda a automação é finalizada o report do cucumber é gerado normalmente.

log do terminal após finalizar a execução

Agora que sabemos qual comando que nos atende, basta remover o binding.pry da automação e arrumar o passo com o comando que achamos no momento do debug.

Usando essa estratégia conseguimos economizar bastante tempo, pois não temos que rodar a automação inteira toda a vez que precisamos saber o melhor jeito de interagir com o software. E creio que isso é ganho importante durante o projeto \o/

Lembrando que essa gem também serve para debugar qualquer código Ruby, mas o foco desse post é na parte de testes.

Se você usa outra linguagem em seus testes ou debuga de outro jeito, por favor comente como você faz isso aqui no post, pois assim a postagem não fica presa em Ruby apenas. Para Javascript vi que existe o PryJS, mas não cheguei a explora-lo ainda.

Subi para o Github(manda PR) o projeto usado nesse post, e você pode usa-lo para brincar com a essa Gem

https://github.com/C9999/Pry_for_tests

Bons testes o/

Like what you read? Give Carlos Araújo a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.