Berlatto reengenharia por exemplos uma proposta para evolucao de sistemas leg...
Cucumber - Um breve Review
1. Cucumber – Um breve review
Felipe Haack Schmitz, Henrique Becker e La´s de Figueiredo Berlatto
ı
Universidade de Passo Fundo – Curso de Ciˆ ncia da Computacao
e
¸˜
Disciplina de Qualidade e Teste de Software
2. 2
0.1
Resumo
Introduz-se a ferramenta Cucumber, explicando-se a ligacao da ferramenta com a t´ cnica de
¸˜
e
´
programacao BDD. A relacao do BDD com a ferramenta e demonstrada, tanto em termos do
¸˜
¸˜
´ feita uma revis˜ o das v´ rias linguagens e ambientes
design da mesma, quanto hist´ ricos. E
o
a
a
suportados pela ferramente, sem, no entanto, o objetivo de ser um revis˜ o exaustiva. O funcia
´
onamento b´ sico da ferramenta e descrito, e apresenta-se um relat´ rio da instalacao e uso da
a
o
¸˜
˜ o escolhida. Por fim, nas consideracoes
mesma, em um ambiente definido, para uma aplicaca
¸
¸˜
´
finais, e levanta-se a hip´ tese que a principal desvantagem encontrada na ferramenta possa
o
vir a ser considerada, tamb´ m, a sua maior vantagem.
e
0.2
Introducao
¸˜
Cucumber (pepino, em inglˆ s) e uma ferramenta[1] e um framework[2] para automacao de
e ´
¸˜
testes de aceitacao, fundamentada na t´ cnica de programacao BDD (Behavior Driven Deve¸˜
e
¸˜
lopment, em inglˆ s, ou desenvolvimento orientado ao comportamento, em uma traducao lie
¸˜
vre). O conceito desta ferramenta e a sua criacao est˜ o intrinsecamente ligados a essa t´ cnica
¸˜
a
e
de programacao (“Embora Cucumber possa ser vista como uma ferramenta ‘para teste’, o
¸˜
´
objetivo da ferramenta e dar suporte ao BDD”[1]), faz-se necess´ rio, portanto, uma breve
a
descricao dessa t´ cnica.
¸˜
e
O BDD pode ser visto como uma evolucao da t´ cnica de programacao TDD[3] (Test
¸˜
e
¸˜
Driven Development, em inglˆ s, ou desenvolvimento orientado a testes, em uma traducao
e
¸˜
livre), e compartilha com essa t´ cnica a caracter´stica principal de se escrever testes antes de
e
ı
escrever a implementacao do que est´ sendo testado, para ent˜ o desenvolvˆ -la at´ que o teste
¸˜
a
a
e
e
´
passe. Outra forma de se ver o BDD e como uma nova compreens˜ o sobre o processo de
a
TDD que estabelece que o teste n˜ o e o ponto central real da t´ cnica, mas sim a descoberta e
a ´
e
compreens˜ o, atrav´ s da definicao dos testes, do comportamento que est´ se querendo obter
a
e
¸˜
a
com um c´ digo[4].
o
O processo de BDD incrementa o TDD de forma a resolver algumas quest˜ es em aberto1
o
com as seguintes pr´ ticas: cada funcionalidade deve ser claramente compreendida por ama
bas partes (desenvolvedores e clientes), para isso se deve usar uma linguagem para os casos de teste compreens´vel a ambas partes, uma vez que os casos de teste s˜ o na realidade
ı
a
especificacoes de comportamento; cada funcionalidade deve possuir um valor claro e veri¸˜
fic´ vel para o neg´ cio, de modo a priorizar o mais importante e evitar o que pode n˜ o vir
a
o
a
a ser necess´ rio; deve-se planejar a frente o m´nimo poss´vel, escrevendo testes para o mea
ı
ı
nor e mais priorit´ rio subconjunto de funcionalidades poss´vel e o desenvolvendo antes de
a
ı
adicionar mais funcionalidades[3].
1
N˜ o se entrar´ em detalhes sobre estas quest˜ es, para mais informacoes leia http://en.wikipedia.
a
a
o
¸˜
org/w/index.php?title=Behavior_Driven_Development&oldid=498181922
3. 3
0.3
A ferramenta Cucumber
Cucumber foi, originalmente, escrito em Ruby e sua implementacao de referˆ ncia (e mais uti¸˜
e
´
lizada) ainda o e[5], mas ela possui uma s´ rie de implementacoes em outras linguagens, como
e
¸˜
veremos em uma das pr´ ximas secoes. Independentemente disso, por´ m, o Cucumber pode
o
¸˜
e
ser usado com diversas bibliotecas que simulam ou fazem interfaces com navegadores[1],
sendo poss´vel, desta forma, testar sites e aplicacoes web em, teoricamente, qualquer linguaı
¸˜
˜ es.
gem com qualquer de suas implementaco
¸
Cucumber funciona basicamente atrav´ s da leitura de arquivos com a extens˜ o feature,
e
a
os quais descrevem em linguagem natural uma funcionalidade e casos de teste (chamados
cen´ rios) para a mesma. Como os testes est˜ o escritos em uma linguagem natural, e n˜ o de
a
a
a
programacao, Cucumber precisa pesquisar pelo c´ digo associado aos “passos” que formam
¸˜
o
o cen´ rio em arquivos fonte auxiliares. A linguagem em que o c´ digo estar´ depende da
a
o
a
´
implementacao do Cucumber (na de referˆ ncia e Ruby). O “passo” (step, no original, em
¸˜
e
inglˆ s) e o nome dado a cada linha em linguagem natural (nos arquivos feature) com uma
e ´
porcao espec´fica de c´ digo associada a ela, em um arquivo fonte auxiliar, a essa porcao de
¸˜
ı
o
¸˜
´
c´ digo e dado o nome de “definicao do passo” (step definition, no original, em inglˆ s)[6].
o
¸˜
e
O uso do Cucumber pode ou n˜ o implicar na programacao em Ruby (ou na linguagem
a
¸˜
´
da implementacao utilizada). Caso se utilize uma biblioteca de definicoes de passo pronta e
¸˜
¸˜
poss´vel somente escrever os arquivos feature a fim de utilizar o Cucumber. Esse comportaı
mento, no entanto, foi criticado[7] causando repercurs˜ es no uso dessas bibliotecas.
o
´
´
A interpretacao dos arquivos feature e feita pelo Gherkin. Gherkin e o nome dado a lin¸˜
guagem usada nos arquivos feature para o uso de linguagem natural, que consiste em alguma
´
poucas palavras-chave fixas e regras de identacao, e e, tamb´ m, o nome do interpretador dessa
¸˜
e
2
linguagem . Algumas implementacoes (em especial a de referˆ ncia) fazem uso do Guerkin,
¸˜
e
´
outros reimplementam sua funcionalidade em sua linguagem[5]. Gherkin e considerada uma
linguagem de dom´nio espec´fico, leg´vel para todos os envolvidos no neg´ cio (o termo usado
ı
ı
ı
o
no original, em inglˆ s, e Business Readable, Domain Specific Language)[8].
e ´
´
O arquivo feature do Cucumber e considerado uma “especificacao execut´ vel” e, tamb´ m,
¸˜
a
e
uma “documentacao viva”[9, p.1]. Ambos termos est˜ o ligados ao fato destes arquivos ser¸˜
a
´
virem de documentacao, testes automatizados e suporte ao desenvolvimento em um unico
¸˜
formato[10]. Uma especificacao do comportamento do sistema que cresce com ele, e pode
¸˜
ser usada para verificar sua conformidade de forma automatizada.
0.4
Hist´ rico
o
´
A hist´ ria do desenvolvimento do Cucumber e intrinsecamente ligada a criacao do BDD
o
¸˜
como j´ foi dito na introducao a ferramenta. Dan North, criador do BDD, iniciou, em final de
a
¸˜
2003, a escrita de uma ferramenta para Java com o intuito de substituir o framework JUnit,
com uma alternativa ligada ao BDD, chamada JBehave[11]. Em marco de 2006 um artigo
¸
2
A implementacao do Gherkin usada pela implementacao de referˆ ncia do Cucumber se encontra em:
¸˜
¸˜
e
https://www.ruby-toolbox.com/projects/gherkin
4. 4
introduzindo BDD foi publicado por ele na revista “Better Software”3 . No final deste artigo
ele fala que Dave Astels estava promovendo a criacao de uma vers˜ o do JBehave (que era
¸˜
a
para Java) para Ruby, o RBehave, na qual ele estava tamb´ m envolvido.
e
´
O RBehave e integrado ao RSpec em torno de outubro de 2007, de forma que David
Chelimsky adiciona suporte a texto plano, evitando que as hist´ rias tenham de ser escritas
o
´
em c´ digos-fonte em Ruby. O RSpec foi inspirado pelo Cucumber[12] e e hoje a ferramenta
o
mais popular dentro da categoria “Testing Frameworks” segundo o site “The Ruby Toolbox”4 ,
´
Cucumber e mostrada como a ferramenta mais popular dentro da categoria “Acceptance Test
Frameworks”.
Em abril de 2008, Aslak Hellesøy comeca o projeto Cucumber a fim de corrigir alguns
¸
problemas no “RSpec Story Runner”[10]. Outros programadores citados na p´ gina oficial
a
do projeto5 tamb´ m contribu´ram a partir dali com melhoramentos pontuais e a manutencao
e
ı
¸˜
6
do projeto Cucumber. Em julho de 2011, o blog do site BestVendor divulgou uma pesquisa
´
feita com 550 empregados em novas empresas, sendo metade delas na area de tecnologia, nela
Cucumber aparece como a quinta ferramenta mais usada na secao “Frameworks de teste” com
¸˜
9%, enquanto RSpec aparece em primeiro lugar com 18%[13].
0.5
Ambientes e linguagens suportados
A primeira (e a principal atualmente) implementacao do Cucumber foi escrita em Ruby. Isso
¸˜
`
significa que Cucumber executa sobre qualquer plataforma que possua suporte a linguagem
7
Ruby. A secao de downloads do site oficial da linguagem Ruby aponta os m´ todos para
¸˜
e
sua instalacao nas seguintes plataformas: Linux (Debian e Arch possuem pacotes prontos),
¸˜
MacOS (Tiger, Lion, Leopard e para Snow Leopard), Solaris (8 ao 10) e OpenIndiana e
´
Windows. Al´ m disso e poss´vel executar Ruby em qualquer plataforma que tenha uma
e
ı
JVM com suporte a JRuby. Algumas vers˜ es do Cucumber portadas para outras linguagens
o
apresentadas nesta secao tamb´ m podem extender as plataformas nas quais se pode fazer
¸˜
e
uso do Cucumber. Os fontes da implementacao de referˆ ncia da linguagem est˜ o escritos
¸˜
e
a
em C, e teoricamente tamb´ m seria poss´vel execut´ -lo sobre plataformas que possuam um
e
ı
a
compilador C para sua arquitetura.
Cucumber n˜ o tem nenhuma IDE padr˜ o[9], embora possam ser encontrados plugins para
a
a
v´ rias IDE’s gen´ ricas. Algumas das IDE’s que possuem suporte ou plugin para o Cucumber
a
e
s˜ o: Eclipse8 , NetBeans9 , Visual Studio10 , Vim11 e Emacs12 .
a
3
O artigo encontra-se dispon´vel, tamb´ m, no seguinte endereco: http://dannorth.net/
ı
e
¸
introducing-bdd/
4
Cujo o endereco e: https://www.ruby-toolbox.com/
¸ ´
5
´
O endereco da p´ gina oficial do projeto Cucumber e: http://cukes.info/
¸
a
6
Cujo o endereco e: http://blog.bestvendor.com/
¸ ´
7
A p´ gina oficial da linguagem Ruby se encontra no seguinte endereco: http://www.ruby-lang.
a
¸
org/en/downloads/
8
Dispon´vel em: http://github.com/QuBiT/cucumber-eclipse-plugin
ı
9
Dispon´vel
ı
em:
http://www.pmamediagroup.com/2009/04/
what-netbeans-651-can-now-recognize-my-cucumber-feature-files/
10
Dispon´vel em: http://github.com/henritersteeg/cuke4vs
ı
11
Dispon´vel em: http://www.vim.org/scripts/script.php?script_id=2973
ı
12
Dispon´vel em: https://github.com/michaelklishin/cucumber.el
ı
5. 5
Cucumber (em pelo menos sua principal implementacao) se integra com v´ rias bibliote¸˜
a
´
cas, as quais lhe permitem controlar um navegador. Desta forma e poss´vel testar aplicacoes
ı
¸˜
Web escritas em qualquer linguagem, com uma boa variedade de opcoes de biblioteca e
¸˜
navegadors. Algumas das opcoes de bibliotecas s˜ o: Webrat, Capybara, Watir WebDriver,
¸˜
a
Celerity e Selenium WebDriver13 , alguns dos navegadores suportados por elas s˜ o: Internet
a
Explorer, Opera, Mozilla Firefox, Chrome, e navegadores pr´ prios sem interface com e sem
o
suporte a Javascript.
Observa-se que, no caso da implementacao principal ao menos, as definicoes dos passos
¸˜
¸˜
ainda ter˜ o de ser escritas em Ruby para os casos descritos acima. No entanto, Cucumber
a
tamb´ m foi portado para ser capaz de interagir com v´ rias outras linguagens, e escrever
e
a
as definicoes de passos nelas. H´ , por exemplo, o Cucumber-JVM, o qual possui suporte
¸˜
a
nativo, n˜ o s´ a Java como, tamb´ m, Scala, Groovy, Clojure, Ioke, e suporte atrav´ s de
a o
e
e
interpretadores a JavaScript (pelo interpretador Rhino), Python (pelo interpretador Jython) e
´
Ruby (pelo interpretador JRuby). Ele e o sucessor do Cuke4Duke que era a implementacao
¸˜
principal do Cucumber (em Ruby), rodando atrav´ s do JRuby[14][15]. Pode-se executar o
e
Cucumber-JVM atrav´ s da linha de comando ou do JUnit (e por consequencia atrav´ s de
e
e
qualquer coisa que use o JUnit).
Algumas outras linguagens suportadas s˜ o C++14 , Haskell15 , Lua16 , Ada17 , PHP18 , .NET19 ,
a
20
Perl , Objective-C (permitindo assim testar aplicacoes para o iPhone, mas n˜ o no iPhone,
¸˜
a
com Cucumber21 ), entre outras, n˜ o sendo vi´ vel uma lista exaustiva.
a
a
Observa-se tamb´ m, que uma busca no GitHub22 (atualmente o site mais popular para
e
hospedagem de c´ digo aberto[16], e onde est´ hospedado o projeto Cucumber original), em
o
a
22 de junho de 2012, por reposit´ rios com a palavra chave “cucumber” na descricao ou nome
o
¸˜
do projeto, retornaria 1185 resultados categorizados em 27 linguagens. N˜ o foi vi´ vel para
a
a
`
escrita deste trabalho a verificacao de quantos desses projetos s˜ o relacionados a ferramenta
¸˜
a
Cucumber e seu grau de relevˆ ncia. Uma r´ pida observacao dos cem primeiros resultados
a
a
¸˜
indicou que poucos destes reposit´ rios n˜ o estavam relacionados a ferramenta.
o
a
Outros suportes a interacoes da ferramente com aplicacoes encontradas, mas que n˜ o
¸˜
¸˜
a
caem exatamente na categoria linguagens ou ambientes suportados foram: o uso do Cucumber como shell script[17], a interacao de Cucumber com o Excel[18], e com interfaces
¸˜
WPF[19].
13
Para uma lista mais completa favor acessar: https://github.com/cucumber/cucumber/wiki/
Atrav´ s do projeto cucumber-cpp, https://github.com/cucumber/cucumber-cpp/
e
15
Atrav´ s do projeto haskell-cucumber, https://github.com/sakari/haskell-cucumber
e
16
Atrav´ s
e
do
projeto
calabash,
https://github.com/pib/calabash/tree/
2c837819bd3d5c9fa618a06f898c5fc80c2bf480
17
Atrav´ s do projeto XReq, http://xreq.forge.open-do.org/
e
18
Atrav´ s do projeto Cuke4PHP, https://github.com/olbrich/cuke4php/wiki
e
19
Pelo
projeto
IronRuby,
https://github.com/cucumber/cucumber/wiki/
IronRuby-and-.NET
20
Para a qual constam algumas implementacoes no GitHub, https://github.com/search?q=
¸˜
cucumber&repo=&langOverride=&start_value=1&type=Repositories&language=
Perl
21
Projeto iCuke, https://github.com/unboxed/icuke
22
Essa busca pode ser re-executada per meio do seguinte endereco: https://github.com/search?
¸
langOverride=&language=&q=cucumber&repo=&start_value=5&type=Repositories
14
6. 6
0.6
Funcionamento b´ sico
a
Comecaremos a explanacao sobre o funcionamento do Cucumber pelo arquivo feature, e seu
¸
¸˜
´
formato, que e a principal entrada da ferramenta. Cada arquivo de feature tem por objetivo
descrever uma funcionalidade, para quem ela tem valor, e porque tem valor. Arquivos do
tipo feature s˜ o divididos em duas secoes, a feature (funcionalidade) em si, e os scenario
a
¸˜
(cen´ rios)[6].
a
Excerto de c´ digo 1 A secao feature do arquivo addition.feature
o
¸˜
Feature: Addition
In order to avoid silly mistakes
As a math idiot
I want to be told the sum of two numbers
´
A secao feature e formada pelo nome da funcionalidade e uma hist´ ria. O nome da
¸˜
o
funcionalidade pode ser usado para se referir a esta posteriormente, e a hist´ ria n˜ o tem de
o
a
seguir obrigatoriamente nenhum formato, nem tem alguma utilidade para ferramenta. Ela
´
que d´ uma descricao informal da funcionalidade e explicita para quem ela e importante e
a
¸˜
`
motivo. A hist´ ria est´ relacionada a filosofia do BDD, em espec´fico, com um de seus trˆ s
o
a
ı
e
principios b´ sicos, o de que qualquer funcionalidade deve ter um valor claro e verific´ vel
a
a
para o neg´ cio[3]. Como foi dito, ela n˜ o possui nenhum formato obrigat´ rio, no entanto,
o
a
o
a convencao usada nos exemplos proporcionados nos exemplos do reposit´ rio que contˆ m a
¸˜
o
e
´
ferramenta e em sua Wiki e “In order . . . As a . . . I want . . . ” (Para . . . Como um . . . Eu quero
. . . ). Outra convencao e “As a . . . I want . . . so that . . . ” (Como um . . . eu quero . . . de modo
¸˜ ´
que . . . ), introduzida por Dan North (criador do BDD), em marco de 2006, em um artigo de
¸
introducao ao BDD[11].
¸˜
Excerto de c´ digo 2 Uma secao scenario do arquivo addition.feature
o
¸˜
Scenario: Add two numbers
Given I have entered 50 into the calculator
And I have entered 70 into the calculator
When I press add
Then the result should be 120 on the screen
Um arquivo feature possui uma secao feature e um n´ mero qualquer de secoes scenario.
¸˜
u
¸˜
´
Os cen´ rios s˜ o basicamente casos de teste em alto n´vel, a intencao deles e formar a descricao
a
a
ı
¸˜
¸˜
´
do comportamento da funcionalidade. Um cen´ rio e formado pelo seu nome e pelos seus
a
passos. Os passos s˜ o cada linha dentro da definicao de um cen´ rio[6]. H´ trˆ s principais
a
¸˜
a
a e
palavras chave que iniciam um passo, elas s˜ o: Given (Dado que), When (Quando), e Then
a
´
´
(Ent˜ o). Given e usado para inicializar o ambiente daquele cen´ rio. When e usado para
a
a
descrever as acoes que devem ser executadas durante o teste. Then verifica se o teste deu o
¸˜
resultado esperado. Elas normalmente s˜ o dadas na ordem que foi apresentada. A palavra
a
chave And (e), tamb´ m pode ser usada para adicionar mais um passo, ela ter´ o mesmo
e
a
significado da palavra-chave do passo imediatamente anterior[2].
7. 7
Excerto de c´ digo 3 O fonte addition steps.rb que define os passos utilizados anteriormente
o
Before do
@calc = Calculadora.new
end
After do
end
Given /I have entered (.+) into the calculator/ do |n|
@calc.push n.to_i
end
When ’I press add’ do
@result = @calc.soma
end
Then /the result should be (.+) on the screen/ do |result|
@result.should == result.to_i
end
´
A definicao dos passos descritos nos arquivos feature e feita em c´ digos-fonte da lingua¸˜
o
gem utilizada pela implementacao do Cucumber. A sintaxe exata para definicao do passo
¸˜
¸˜
varia para cada implementacao do Cucumber em uma diferente linguagem. Aqui foi apre¸˜
sentada a sintaxe em Ruby. As definicoes de passo usualmente consistem na palavra-chave
¸˜
correspondente e uma express˜ o regular que casa com o texto correspondente, escrito ap´ s a
a
o
palavra-chave, no arquivo feature.
´
Uma express˜ o regular e uma forma de denotar padr˜ es23 em cadeias de caracteres. O
a
o
excerto “(.+)”, por exemplo, pode ser decomposto em trˆ s componentes, o “.”, o “+” e os
e
parentˆ ses envolvendo-os. O “.” casa com um caracter qualquer, e o “+” muda o significado
e
do s´mbolo anterior (o “.” neste caso) para casar com uma ou mais ocorrˆ ncias do mesmo
ı
e
(neste caso um ou mais caracteres). Os parˆ nteses informam que a porcao de texto que for
e
¸˜
casada com a express˜ o dentro deles deve ser capturada como argumento (no caso do exemplo
a
isso significa que a sequˆ ncia de d´gitos naquela posicao da cadeia definir´ o valor de n, ou
e
ı
¸˜
a
result).
O uso de uma express˜ o regular, como pode ser visto acima, s´ e necess´ rio caso seja
a
o´
a
necess´ rio capturar uma determinada porcao v´ riavel do texto como argumento para o c´ digo
a
¸˜ a
o
da definicao do passo.
¸˜
As secoes “Before do . . . end” (Antes faca . . . fim) e “After do . . . end” (Depois faca
¸˜
¸
¸
. . . fim) s˜ o “hooks” (ganchos), elas permitem definir um bloco de c´ digo para ser execua
o
tado antes e depois, respectivamente, de cada cen´ rio.
a
´
A convencao de organizacao dos arquivos do Cucumber e a seguinte: a pasta base se
¸˜
¸˜
23
O artigo da wikipedia em inglˆ s possui uma boa introducao a espress˜ es regulares: http://en.
e
¸˜
o
wikipedia.org/wiki/Regex
8. 8
chama “features”, dentro dela deve haver os arquivos feature e a pasta “step definitions”,
que contˆ m os c´ digos-fonte que definem os passos. Pode haver, tamb´ m, dentro da pasta
e
o
e
“features”, a pasta “support”, nela devem estar quaisquer inicializacoes globais comuns para
¸˜
´
mais de um arquivo de funcionalidade, o nome convencional ao fonte principal desta pasta e
“env”[20].
´
A sa´da do Cucumber e normalmente o texto dos arquivos feature de entrada, colorindo
ı
cada passo conforme seu estado, e mais um pequeno resumo dos resultados dos testes. Caso
vocˆ execute o Cucumber sem ter definido os passos ele lhe sugerir´ os cabecalhos das
e
a
¸
definicoes para preenchimento dos blocos de c´ digo. H´ v´ rios estados que um passo pode
¸˜
o
a a
assumir, os mais comuns s˜ o passed (passou), failed (falhou), undefined (n˜ o definido) e skipa
a
ped (ignorado), cujas cores padr˜ o s˜ o respectivamente verde, vermelho, amarelo e ciano. O
a a
significado de cada estado, passed, failed, undefined e skipped, s˜ o, repectivamente, o passo
a
ocorreu sem erro, o passo causou um erro ao executar, n˜ o foi encontrada uma definicao para
a
¸˜
o passo, e o passo foi ignorado porque o anterior falhou.
0.7
Passos para instalacao
¸˜
Nesta secao descrevem-se os passos usados para instalacao do Cucumber e de algumas bibli¸˜
¸˜
otecas relacionadas. Estes passos s˜ o necess´ rios para a reproducao dos exemplos de caso de
a
a
¸˜
teste apresentados em uma das pr´ ximas secoes. Esses passos e os casos de teste foram exeo
¸˜
cutados sobre uma m´ quina com a distribuicao Ubuntu 12.04 (precise) 64-bit, com o kernel
a
¸˜
3.2.0-23-generic.
Instalou-se o gerenciador de pacotes padr˜ o do Ruby, RubyGems, na vers˜ o 1.8, que era
a
a
uma das dispon´veis no gerenciador de pacotes da distribuicao. A partir do RubyGems, ent˜ o,
ı
¸˜
a
´
se instalou o Cucumber, o RSpec e o Watir. O RSpec e um framework de BDD para Ruby
´
e o Watir e uma biblioteca que permite o controle, por meio de c´ digo Ruby, de diversos
o
navegadores. Executou-se o de uso do Cucumber com o Watir da pasta de exemplos do
reposit´ rio do Cucumber para verificar a instalacao. Para que este funcionasse corretamente
o
¸˜
foi necess´ rio fazer duas pequenas modificacoes nos fontes do exemplo.
a
¸˜
Excerto de c´ digo 4 Comandos usados para instalacao do Cucumber e demais gemas
o
¸˜
$ sudo apt-get install rubygems
$ export PATH=/var/lib/gems/1.8/bin:$PATH
$ sudo gem install cucumber
$ sudo gem install rspec
$ sudo gem install watir-webdriver
0.8
Caso exemplo de uso da ferramenta
Demonstrar-se-´ , nesta secao, um exemplo do uso da ferramenta Cucumber, para o teste de
a
¸˜
´
uma aplicacao Web, no ambiente descrito na secao anterior. O software a ser testado e uma
¸˜
¸˜
simples aplicacao Web, desenvolvida pelos autores, que permite fazer a m´ dia aritm´ tica de
¸˜
e
e
9. 9
Excerto de c´ digo 5 Vers˜ o final do arquivo env.rb do exemplo com o Watir, adaptado para
o
a
usar a vers˜ o instalada do Watir
a
begin require ’rspec/expectations’; rescue LoadError;
require ’spec/expectations’; end
require ’watir-webdriver’
Browser = Watir::Browser
browser = Browser.new
Before do
@browser = browser
end
# "after all"
at_exit do
browser.close
end
Excerto de c´ digo 6 A linha comentada e adicionada, respectivamente, ao arquivo seo
`
arch steps.rb, devido a mudanca do nome do bot˜ o do Google
¸
a
# @browser.button(:name, ’btnG’).click
@browser.button(:name, ’btnI’).click
10. 10
Figura 1: Sa´da do Cucumber sobre o exemplo
ı
´ ´
´
um conjunto qualquer de valores. A funcionalidade a ser testada e a unica da aplicacao que e
¸˜
o c´ lculo da m´ dia aritm´ tica.
a
e
e
Excerto de c´ digo 7 O conte´ do do arquivo arithmetic mean.feature
o
u
Feature: Arithmetic mean
The user inform two numbers positive
And He want to know
The their arithmetic mean
Scenario: Arithmetic mean
Given I have the number 20
And I have the number 30
When I ask for the arithmetic mean
Then I should be given the value 25
Scenario: Input error
Given I have the number 1
And I have the number a
When I ask for the arithmetic mean
Then I should be given the value Express˜o inv´lida!
a
a
Foi usado o mesmo c´ digo do arquivo env.rb para definicao do browser usado pelo exemo
¸˜
plo do Watir, descrito no excerto 5. A organizacao dos arquivos seguiu a convencao do
¸˜
¸˜
Cucumber explicada na secao “Funcionamento b´ sico”. A linha de comando utilizada para
¸˜
a
´
executar o Cucumber e a demonstrada no excerto 9, ela foi chamada de dentro da pasta features, e teve a sa´da apresentada na figura 1.
ı
A execucao dos testes faz o navegador Mozilla Firefox abrir, carregar a p´ gina com a
¸˜
a
aplicacao Web, preencher o campo, clicar o bot˜ o e checar o resultado contra o especificado
¸˜
a
no cen´ rio. As pausas de dois segundos foram feitas para que o processo de teste pudesse ser
a
observado. Nem as pausas, nem o uso de um navegador interface seriam usados em um teste
automatizado, salvo a poss´vel necessidade de testar a compatibilidade com o browser em esı
pec´fico ou o acompanhamento humano do teste. Uma screenshot da aplicacao e apresentada
ı
¸˜ ´
na figura 2.
11. 11
Excerto de c´ digo 8 O fonte arithmetic mean steps.rb que define os passos utilizados anteo
riormente
numbers = []
Given /I have the number (.+)/ do |numero|
numbers << numero
end
When /I ask for the arithmetic mean/ do
@browser.goto ’http://inf.upf.br/˜106396’
sleep 5
@browser.button(:id, ’clean’).click
sleep 5
expressao = ""
for i in 0..numbers.length-1
if i < numbers.length-1
expressao = expressao + numbers[i] + ", "
else
expressao = expressao + numbers[i]
end
end
@browser.text_field(:id, ’dados’).set(expressao)
sleep 5
@browser.button(:id, ’calc’).click
sleep 5
end
Then /I should be given the value (.+)/ do |resultado|
resultado.should == @browser.text_field(:id, ’resultado’).value
sleep 5
numbers.clear
end
Excerto de c´ digo 9 Linha de comando utilizada para executar o Cucumber sobre o exemplo
o
$ cucumber -r features/step_definitions/arithmetic_mean_steps.rb
-r features/support/env.rb
12. 12
Figura 2: Captura da execucao do navegador durante o teste
¸˜
0.9
Consideracoes Finais
¸˜
´
Cucumber e uma ferramenta que suporta uma ampla variedade de linguagens e ambientes,
´
n˜ o sendo isso raz˜ o para n˜ o adot´ -la. Cucumber, no entanto, como foi visto, e intrinsea
a
a
a
`
camente ligado a filosofia do BDD, sendo uma ferramenta que dificilmente seria adotada
por um grupo que n˜ o tivesse conhecimento de, ou pretendesse utilizar-se, dessa t´ cnica de
a
e
´
programacao. N˜ o e somente a hist´ ria do BDD que e ligada ao Cucumber, mas o BDD
¸˜
a ´
o
tamb´ m influenciou por completo a concepcao da ferramenta.
e
¸˜
A compreens˜ o do funcionamento da ferramenta, principalmente em relacao ao sistema
a
¸˜
de passos em linguagem natural e as definicoes dos passos em c´ digo, pode ser confusa em
¸˜
o
princ´pio. Essa confus˜ o pode ser creditada a aparente falta de motivos para esta organizacao.
ı
a
¸˜
Essa separacao leva a ter de se manter dois artefatos sincronizados, ao inv´ s de s´ um c´ digo
¸˜
e
o
o
´
de testes, logo deve haver um vantagem nela. A primeira vantagem que poderia ser inferida e
que, a partir de um determinado momento, se passaria a usar somente as definicoes de passos
¸˜
j´ prontos, e se manteria somente um artefato o qual pode ser lido tamb´ m pelos clientes do
a
e
´
neg´ cio. Essa assuncao, no entanto, e invalidada pelas cr´ticas de que o uso de biblioteca
o
¸˜
ı
`
de passos prontos levava a escrita de cen´ rios dif´ceis de ler, tediosos e em baixo n´vel de
a
ı
ı
abstracao[7], as quais tiveram respaldo da comunidade.
¸˜
Podemos compreender essa decis˜ o do design da ferramenta se considerarmos que a desa
´
vantagem de ter de dar manutencao a esses dois artefatos sincronizados e, tamb´ m, uma van¸˜
e
tagem. Se cada modificacao na especificacao do comportamento da ferramenta (o arquivo
¸˜
¸˜
feature) quebra os testes e forca a observar o seu c´ digo, e cada alteracao do c´ digo leva a
¸
o
¸˜
o
´
reflex˜ o se o passo ainda e refletido por aquela nova definicao, se ganha uma especificacao
a
¸˜
¸˜
´ e
que e t´ cnica e n˜ o-t´ cnica simultaneamente e que liga forcosamente ambos os lados. Dessa
a e
¸
´
forma, a especificacao do comportamento do sistema e unificada, e a mudanca dos pontos
¸˜
¸
de vista de cada um dos lados (desenvolvedores e clientes) passa a forcar a observacao desta
¸
¸˜
pelo outro.
13. Referˆ ncias Bibliogr´ ficas
e
a
[1] TEAM, C. Cucumber Wiki. 2012. [Online; acessado em 25/06/2012]. Dispon´vel em:
ı
<https://github.com/cucumber/cucumber/wiki/>.
[2] ASTELS, D. Introduction to BDD with Cucumber. 2009. [Online; acessado em
25/06/2012]. Dispon´vel em: <http://www.engineyard.com/blog/2009/
ı
cucumber-introduction/>.
[3] AL., D. N. et. Behavior-Driven Development. 2009. [Online; acessado em 25/06/2012].
Dispon´vel em: <http://behaviour-driven.org/>.
ı
[4] RIMMER, C. et al. Introduction – Behavior-Driven Development. 2010. [Online;
acessado em 25/06/2012]. Dispon´vel em: <http://behaviour-driven.org/
ı
Introduction>.
[5] LAWRENCE, R. Cucumber. 2011. [Online; acessado em 25/06/2012]. Dispon´vel em:
ı
<http://www.methodsandtools.com/tools/cucumber.php>.
[6] HELLESøY, A.; SCOTT, A.; SEDE˜ O, D. Feature Introduction - Cucumber Wiki.
n
2012. [Online; acessado em 25/06/2012]. Dispon´vel em: <https://github.com/
ı
cucumber/cucumber/wiki/Feature-Introduction>.
[7] HELLESøY, A. The training wheels came off. 2011. [Online; acessado em 25/06/2012].
Dispon´vel em:
ı
<http://aslakhellesoy.com/post/11055981222/
the-training-wheels-came-off>.
[8] HELLESøY, A. et al. Gherkin - Cucumber Wiki. 2011. [Online; acessado em
25/06/2012]. Dispon´vel em: <https://github.com/cucumber/cucumber/
ı
wiki/Gherkin>.
[9] FLORINIER, D. de; ADZIC, G. The Secret Ninja Cucumber Scrolls: Strictly Confidential. 2010. Dispon´vel em: <http://cuke4ninja.com/>.
ı
[10] TEAM, C. Cucumber – Making BDD Fun. 2012. [Online; acessado em 25/06/2012].
Dispon´vel em: <http://cukes.info/>.
ı
[11] NORTH, D. Introducing BDD. 2006. [Online; acessado em 25/06/2012]. Dispon´vel
ı
em: <http://dannorth.net/introducing-bdd/>.
13
14. 14
[12] GIBBS, E. JBehave and RSpec History. 2007. [Online; acessado em
25/06/2012].
Dispon´vel
ı
em:
<http://edgibbs.com/2007/12/02/
jbehave-and-rspec-history/>.
[13] VENDOR, B. The Startup’s Toolkit. 2011. [Online;
acessado em
25/06/2012]. Dispon´vel em: <http://blog.bestvendor.com/2011/07/
ı
survey-results-the-startups-toolkit/>.
[14] HELLESøY, A. Cucumber-JVM 1.0.0. 3 2012. [Online; acessado em 25/06/2012].
Dispon´vel em:
ı
<http://aslakhellesoy.com/post/20006051268/
cucumber-jvm-1-0-0>.
[15] TEAM, C.-J. Cucumber JVM – Github. 2012. [Online; acessado em 25/06/2012]. Dispon´vel em: <https://github.com/cucumber/cucumber-jvm>.
ı
[16] FINLEY, K. Github Has Surpassed Sourceforge and Google Code in Popularity. 6 2011.
[Online; acessado em 25/06/2012]. Dispon´vel em: <http://www.readwriteweb.
ı
com/hack/2011/06/github-has-passed-sourceforge.php>.
[17] HOLMWOOD, L. Using Cucumber as a scripting language. 11 2009.
[18] DOMOKOS, A. Testing Excel with Cucumber. 3 2010. [Online; acessado
em 25/06/2012]. Dispon´vel em: <http://www.adomokos.com/2010/03/
ı
testing-excel-with-cucumber.html>.
[19] HALL, B. Testing a WPF UI using Ruby, Cucumber and WiPFlash.dll.
3
2010.
[Online;
acessado
em
25/06/2012].
Dispon´vel
ı
em:
<http://codebetter.com/benhall/2010/03/16/
testing-a-wpf-ui-using-ruby-cucumber-and-wipflash-dll/>.
[20] GROUP, A. T. S. Cucumber Test Engine (Ruby). 10 2009. [Online; acessado
em 25/06/2012]. Dispon´vel em: <http://autotestgroup.com/en/blog/77.
ı
html>.