Venho estudando um framework para Behavioral Driven Development chamado Cucumber e me impressionado com a facilidade e clareza que a atividade de implementar testes automatizados vem se tornando. Para quem quiser saber mais sobre Cucumber, antes mesmo de continuar essa leitura, recomendo consultar esses links:
- http://miud.in/1zU: Série de artigos sobre Cucumber. Muito bem elaborado!
- http://miud.in/1zS: Artigo introdutório do Urubatan.
- http://miud.in/1zR: Introdução sobre Cucumber para testes funcionais (usando o webrat).
- http://miud.in/1zQ: Site oficial, tem vários exemplos mas a documentação não é bem organizada.
- http://miud.in/1zP: Como integrar o Cucumber com o Selenium.
- http://miud.in/1zT: Livro – The RSpec Book: Behaviour Driven Development with RSpec, Cucumber, and Friends – tem vários capítulos sobre Cucumber
- http://miud.in/1Kc: Artigo bastante simples que usa Webrat para testar aplicação PHP.
O foco deste, é apresentar minha experiência em usar o Cucumber integrado com o Selenium e mostrar um exemplo de como é simples implementar testes funcionais. Para começar, leia essa documentação que explica como configurar seu ambiente. Se você usa MacOS Snow Leopard (10.5) deve passar pelos mesmos problemas que eu tive e que encontrei a solução neste link.
A idéia central é escrever estórias para teste de telas (caixa preta). Disponibilizei no github o código-fonte da aplicação em Rails que está sendo testada e de outra aplicação, somente Ruby, usando Cucumber + Selenium. Para demonstrar o uso do Selenium, escolhi um cenário bastante simples, trata-se de um história de autenticação de usuários:
Perceba que nos preocupamos em escrever a história o mais “User Friendly” possível. Isso facilita bastante o entendimento sobre o que você está de fato testando e o que o seu usuário (ou cliente) acha que você deveria testar. E, como você já deve saber, as palavras-chave “dado”, “quando” e “então” representam ações que são implementadas em Ruby. Para começar, configuramos no arquivo support/env.rb o ambiente da API para Selenium em Ruby criando uma instância da classe Selenium::SeleniumDriver.
No arquivo support/paths.rb configuramos o mapeamento de nome de páginas para URIs e também de label de campos para o nome do campo no formulário HTML. Os métodos path_to, field_for e button_for fazem essas funções.
OK, concordo com vocês que essas funções não fazem lá muita coisa, mas lembre-se que estamos fazendo o nosso primeiro caso de teste, tenha certeza que serão úteis no futuro próximo. Um exemplo que eu já posso citar foram os testes que implementamos para testar uma aplicação, na verdade um portal, desenvolvido em Drupal, onde o “label” dos campos não era nem um pouco parecido com o nome (do componente HTML) do campo. Lembrando que as histórias tem de ficar o mais próximo possível da taxonomia (ou idioma) do seu usuário.
Agora, vamos à parte que interessa, de fato a implementação dos passos descritos nas estórias. Criei o arquivo step_definitions/common_steps.rb contendo os passos mais comuns que você deverá usar na maioria de suas estórias. Para passos específicos de determinada história, recomenda-se criar um outro arquivo no diretório step_definitions com o nome da estória.
O exemplo é bastante simples, e a aplicação Rails do github contém uma implementação bastante simples do que está sendo testado. Para executar, basta usar o comando “cucumber” na raiz do projeto de testes. Lembrando que você deve iniciar o servidor do Selenium usando o comando “selenium” (isso funcionou pra mim após instalar o Selenium RC).
Se você tiver dúvidas ou problemas na execução do exemplo, fique à vontade de postar nos comentários que farei o possível para tentar ajudar. E, por hora ficamos por aqui. Em breve devo postar alguns exemplos de passos mais complexos como uso de tabelas e/ou editores ricos. Estamos trabalhando nisso agora!

