Utilizando cucumber com selenium em seus projetos java
Algum tempo venho utilizando o cucumber para escrever meus testes de aceitação em projetos em ruby, especialmente em projetos rails. Acho que essa situação é um bom exemplo de mostrar que vocês devem mesmo aprender pelo menos uma linguagem pro ano. Em projetos java me sentir um pouco desconfortado em desenvolver meus testes apenas com o Selenium. Escrever as features e cenários diretamente em metodos e classes em java doia muito e textualmente me dava mais liberdade a criatividade e até mesmo melhor compreensão dos testes a serem executados. Então resolvi utilizar o projeto cuke4duke! Uma versão para rodar o cucumber em diversas linguagem em cima da JVM.
Em meus projetos utilizo o ant e junto com o Cucumber o Selenium. Basicamente irei explicar os passos básicos para rodar o cucumber + o selenium com uma build do ant em uma aplicação web.
Estrutura de arquivos do Projeto
Para executar o cucumber em nosso projetos vamos montar a estruutra de arquivos necessários para isso. Basicamente temos a seguinte estrutura:
temos o package main onde temos o codigo de produção, o package test com a parte onde irá conter as classes de teste. Temos também a pasta features onde ficará todos os testes de aceitação escritos , a pasta lib contendo bibliotecas necessárias para rodar o projeto, ex. ( jetty, jruby, cuke4duke, etc) . e o WebContent a parte dos recursos web da aplicação.
Criando as tasks do ANT
Abaixo mostrarei apenas as tasks referentes ao cucumber, o build completo pode ser encontrado no github.
<!-- instala as gems necessarias para rodar os testes de aceitacao pelo cucumber. --> <target name="-install-gems" depends="-define-paths" if="gems"> <taskdef name="gem" classname="cuke4duke.ant.GemTask" classpathref="tests.classpath" /> <gem args="install cuke4duke --version 0.3.2 --source http://gemcutter.org/" /> </target> <!-- executa os testes de aceitação --> <target name="acceptance-test" depends="compile,-install-gems, start-jettys" description="Run Cucumber"> <taskdef name="cucumber" classname="cuke4duke.ant.CucumberTask" classpathref="acceptance-test.classpath" /> <cucumber args="--require target/test-classes --color --format pretty -f junit --out target/junit-report features" objectFactory="spring"> <classpath> <path refid="acceptance-test.classpath"/> </classpath> </cucumber> </target>
@StepDefinitions
Para isso criamos em src/test/resources o arquivo cucumber.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:component-scan base-package="com.couggi.integration"> <context:include-filter type="annotation" expression="cuke4duke.spring.StepDefinitions"/> </context:component-scan> </beans>
Criando uma Feature Exemplo
Na task do ant definimos que todas as features devem está na pasta features/ do nosso projeto. Criaremos então um arquivo de nome: login.feature ( Ignore a dúvida se essa é uma boa feature/cenário )
Feature: Login
Scenario: Logando em meu site
Given Eu esteja na pagina de login da aplicacao
When eu tento logar com o login “verto” e senha “123″
Then devera apresentar a pagina incial como logado
Para gerar os metodos necessários para executar os passos acima execute a task do acceptance-test e o cucumber irá apresentar para você os metodos necessários para que o teste funcione.
Para o cuke4duke identificar os metódos que serão executados ele utiliza Anotações:
@StepDefinitions para anota as classes nos quais contém os metódos.
@Given @Then @When , identifica os metodos referente aos passos de suas features.
No exemplo acima, criei a classe: LoginSteps com o conteúdo: http://github.com/vertocardoso/java-cucumber/blob/master/src/test/integration/com/couggi/integration/LoginSteps.java
Através desse exemplo, conseguimos integrar os nossos projetos com testes de aceitação utilizando o cucumber, criando assim um documento no qual seja mais descritivo para todos e totalmente executável. Para maiores informações acesse o site do projeto: http://cukes.info/ . O projeto explicado acima está no meu github: http://github.com/vertocardoso/java-cucumber
