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ˆencia da Computac¸˜ao
Disciplina de Qualidade e Teste de Software
2. 2
0.1 Resumo
Introduz-se a ferramenta Cucumber, explicando-se a ligac¸˜ao da ferramenta com a t´ecnica de
programac¸˜ao BDD. A relac¸˜ao do BDD com a ferramenta ´e demonstrada, tanto em termos do
design da mesma, quanto hist´oricos. ´E feita uma revis˜ao das v´arias linguagens e ambientes
suportados pela ferramente, sem, no entanto, o objetivo de ser um revis˜ao exaustiva. O funci-
onamento b´asico da ferramenta ´e descrito, e apresenta-se um relat´orio da instalac¸˜ao e uso da
mesma, em um ambiente definido, para uma aplicac¸˜ao escolhida. Por fim, nas considerac¸˜oes
finais, ´e levanta-se a hip´otese que a principal desvantagem encontrada na ferramenta possa
vir a ser considerada, tamb´em, a sua maior vantagem.
0.2 Introduc¸˜ao
Cucumber (pepino, em inglˆes) ´e uma ferramenta[1] e um framework[2] para automac¸˜ao de
testes de aceitac¸˜ao, fundamentada na t´ecnica de programac¸˜ao BDD (Behavior Driven Deve-
lopment, em inglˆes, ou desenvolvimento orientado ao comportamento, em uma traduc¸˜ao li-
vre). O conceito desta ferramenta e a sua criac¸˜ao est˜ao intrinsecamente ligados a essa t´ecnica
de programac¸˜ao (“Embora Cucumber possa ser vista como uma ferramenta ‘para teste’, o
objetivo da ferramenta ´e dar suporte ao BDD”[1]), faz-se necess´ario, portanto, uma breve
descric¸˜ao dessa t´ecnica.
O BDD pode ser visto como uma evoluc¸˜ao da t´ecnica de programac¸˜ao TDD[3] (Test
Driven Development, em inglˆes, ou desenvolvimento orientado a testes, em uma traduc¸˜ao
livre), e compartilha com essa t´ecnica a caracter´ıstica principal de se escrever testes antes de
escrever a implementac¸˜ao do que est´a sendo testado, para ent˜ao desenvolvˆe-la at´e que o teste
passe. Outra forma de se ver o BDD ´e como uma nova compreens˜ao sobre o processo de
TDD que estabelece que o teste n˜ao ´e o ponto central real da t´ecnica, mas sim a descoberta e
compreens˜ao, atrav´es da definic¸˜ao dos testes, do comportamento que est´a se querendo obter
com um c´odigo[4].
O processo de BDD incrementa o TDD de forma a resolver algumas quest˜oes em aberto1
com as seguintes pr´aticas: cada funcionalidade deve ser claramente compreendida por am-
bas partes (desenvolvedores e clientes), para isso se deve usar uma linguagem para os ca-
sos de teste compreens´ıvel a ambas partes, uma vez que os casos de teste s˜ao na realidade
especificac¸˜oes de comportamento; cada funcionalidade deve possuir um valor claro e veri-
fic´avel para o neg´ocio, de modo a priorizar o mais importante e evitar o que pode n˜ao vir
a ser necess´ario; deve-se planejar a frente o m´ınimo poss´ıvel, escrevendo testes para o me-
nor e mais priorit´ario subconjunto de funcionalidades poss´ıvel e o desenvolvendo antes de
adicionar mais funcionalidades[3].
1
N˜ao se entrar´a em detalhes sobre estas quest˜oes, para mais informac¸˜oes leia http://en.wikipedia.
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 implementac¸˜ao de referˆencia (e mais uti-
lizada) ainda o ´e[5], mas ela possui uma s´erie de implementac¸˜oes em outras linguagens, como
veremos em uma das pr´oximas sec¸˜oes. Independentemente disso, por´em, o Cucumber pode
ser usado com diversas bibliotecas que simulam ou fazem interfaces com navegadores[1],
sendo poss´ıvel, desta forma, testar sites e aplicac¸˜oes web em, teoricamente, qualquer lingua-
gem com qualquer de suas implementac¸˜oes.
Cucumber funciona basicamente atrav´es da leitura de arquivos com a extens˜ao feature,
os quais descrevem em linguagem natural uma funcionalidade e casos de teste (chamados
cen´arios) para a mesma. Como os testes est˜ao escritos em uma linguagem natural, e n˜ao de
programac¸˜ao, Cucumber precisa pesquisar pelo c´odigo associado aos “passos” que formam
o cen´ario em arquivos fonte auxiliares. A linguagem em que o c´odigo estar´a depende da
implementac¸˜ao do Cucumber (na de referˆencia ´e Ruby). O “passo” (step, no original, em
inglˆes) ´e o nome dado a cada linha em linguagem natural (nos arquivos feature) com uma
porc¸˜ao espec´ıfica de c´odigo associada a ela, em um arquivo fonte auxiliar, a essa porc¸˜ao de
c´odigo ´e dado o nome de “definic¸˜ao do passo” (step definition, no original, em inglˆes)[6].
O uso do Cucumber pode ou n˜ao implicar na programac¸˜ao em Ruby (ou na linguagem
da implementac¸˜ao utilizada). Caso se utilize uma biblioteca de definic¸˜oes 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˜oes no uso dessas bibliotecas.
A interpretac¸˜ao 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 identac¸˜ao, e ´e, tamb´em, o nome do interpretador dessa
linguagem2
. Algumas implementac¸˜oes (em especial a de referˆencia) fazem uso do Guerkin,
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´ocio (o termo usado
no original, em inglˆes, ´e Business Readable, Domain Specific Language)[8].
O arquivo feature do Cucumber ´e considerado uma “especificac¸˜ao execut´avel” e, tamb´em,
uma “documentac¸˜ao viva”[9, p.1]. Ambos termos est˜ao ligados ao fato destes arquivos ser-
virem de documentac¸˜ao, testes automatizados e suporte ao desenvolvimento em um ´unico
formato[10]. Uma especificac¸˜ao do comportamento do sistema que cresce com ele, e pode
ser usada para verificar sua conformidade de forma automatizada.
0.4 Hist´orico
A hist´oria do desenvolvimento do Cucumber ´e intrinsecamente ligada a criac¸˜ao do BDD
como j´a foi dito na introduc¸˜ao a ferramenta. Dan North, criador do BDD, iniciou, em final de
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 marc¸o de 2006 um artigo
2
A implementac¸˜ao do Gherkin usada pela implementac¸˜ao de referˆencia do Cucumber se encontra em:
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 criac¸˜ao de uma vers˜ao do JBehave (que era
para Java) para Ruby, o RBehave, na qual ele estava tamb´em envolvido.
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´orias tenham de ser escritas
em c´odigos-fonte em Ruby. O RSpec foi inspirado pelo Cucumber[12] e ´e hoje a ferramenta
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 comec¸a o projeto Cucumber a fim de corrigir alguns
problemas no “RSpec Story Runner”[10]. Outros programadores citados na p´agina oficial
do projeto5
tamb´em contribu´ıram a partir dali com melhoramentos pontuais e a manutenc¸˜ao
do projeto Cucumber. Em julho de 2011, o blog do site BestVendor6
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 sec¸˜ao “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) implementac¸˜ao do Cucumber foi escrita em Ruby. Isso
significa que Cucumber executa sobre qualquer plataforma que possua suporte `a linguagem
Ruby. A sec¸˜ao de downloads do site oficial da linguagem Ruby7
aponta os m´etodos para
sua instalac¸˜ao 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´em disso ´e poss´ıvel executar Ruby em qualquer plataforma que tenha uma
JVM com suporte a JRuby. Algumas vers˜oes do Cucumber portadas para outras linguagens
apresentadas nesta sec¸˜ao tamb´em podem extender as plataformas nas quais se pode fazer
uso do Cucumber. Os fontes da implementac¸˜ao de referˆencia da linguagem est˜ao escritos
em C, e teoricamente tamb´em seria poss´ıvel execut´a-lo sobre plataformas que possuam um
compilador C para sua arquitetura.
Cucumber n˜ao tem nenhuma IDE padr˜ao[9], embora possam ser encontrados plugins para
v´arias IDE’s gen´ericas. Algumas das IDE’s que possuem suporte ou plugin para o Cucumber
s˜ao: Eclipse8
, NetBeans9
, Visual Studio10
, Vim11
e Emacs12
.
3
O artigo encontra-se dispon´ıvel, tamb´em, no seguinte enderec¸o: http://dannorth.net/
introducing-bdd/
4
Cujo o enderec¸o ´e: https://www.ruby-toolbox.com/
5
O enderec¸o da p´agina oficial do projeto Cucumber ´e: http://cukes.info/
6
Cujo o enderec¸o ´e: http://blog.bestvendor.com/
7
A p´agina oficial da linguagem Ruby se encontra no seguinte enderec¸o: http://www.ruby-lang.
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 implementac¸˜ao) se integra com v´arias bibliote-
cas, as quais lhe permitem controlar um navegador. Desta forma ´e poss´ıvel testar aplicac¸˜oes
Web escritas em qualquer linguagem, com uma boa variedade de opc¸˜oes de biblioteca e
navegadors. Algumas das opc¸˜oes de bibliotecas s˜ao: Webrat, Capybara, Watir WebDriver,
Celerity e Selenium WebDriver13
, alguns dos navegadores suportados por elas s˜ao: Internet
Explorer, Opera, Mozilla Firefox, Chrome, e navegadores pr´oprios sem interface com e sem
suporte a Javascript.
Observa-se que, no caso da implementac¸˜ao principal ao menos, as definic¸˜oes dos passos
ainda ter˜ao de ser escritas em Ruby para os casos descritos acima. No entanto, Cucumber
tamb´em foi portado para ser capaz de interagir com v´arias outras linguagens, e escrever
as definic¸˜oes de passos nelas. H´a, por exemplo, o Cucumber-JVM, o qual possui suporte
nativo, n˜ao s´o a Java como, tamb´em, Scala, Groovy, Clojure, Ioke, e suporte atrav´es de
interpretadores a JavaScript (pelo interpretador Rhino), Python (pelo interpretador Jython) e
Ruby (pelo interpretador JRuby). Ele ´e o sucessor do Cuke4Duke que era a implementac¸˜ao
principal do Cucumber (em Ruby), rodando atrav´es do JRuby[14][15]. Pode-se executar o
Cucumber-JVM atrav´es da linha de comando ou do JUnit (e por consequencia atrav´es de
qualquer coisa que use o JUnit).
Algumas outras linguagens suportadas s˜ao C++14
, Haskell15
, Lua16
, Ada17
, PHP18
, .NET19
,
Perl20
, Objective-C (permitindo assim testar aplicac¸˜oes para o iPhone, mas n˜ao no iPhone,
com Cucumber21
), entre outras, n˜ao sendo vi´avel uma lista exaustiva.
Observa-se tamb´em, que uma busca no GitHub22
(atualmente o site mais popular para
hospedagem de c´odigo aberto[16], e onde est´a hospedado o projeto Cucumber original), em
22 de junho de 2012, por reposit´orios com a palavra chave “cucumber” na descric¸˜ao ou nome
do projeto, retornaria 1185 resultados categorizados em 27 linguagens. N˜ao foi vi´avel para
escrita deste trabalho a verificac¸˜ao de quantos desses projetos s˜ao relacionados `a ferramenta
Cucumber e seu grau de relevˆancia. Uma r´apida observac¸˜ao dos cem primeiros resultados
indicou que poucos destes reposit´orios n˜ao estavam relacionados a ferramenta.
Outros suportes a interac¸˜oes da ferramente com aplicac¸˜oes encontradas, mas que n˜ao
caem exatamente na categoria linguagens ou ambientes suportados foram: o uso do Cu-
cumber como shell script[17], a interac¸˜ao 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/
14
Atrav´es do projeto cucumber-cpp, https://github.com/cucumber/cucumber-cpp/
15
Atrav´es do projeto haskell-cucumber, https://github.com/sakari/haskell-cucumber
16
Atrav´es do projeto calabash, https://github.com/pib/calabash/tree/
2c837819bd3d5c9fa618a06f898c5fc80c2bf480
17
Atrav´es do projeto XReq, http://xreq.forge.open-do.org/
18
Atrav´es do projeto Cuke4PHP, https://github.com/olbrich/cuke4php/wiki
19
Pelo projeto IronRuby, https://github.com/cucumber/cucumber/wiki/
IronRuby-and-.NET
20
Para a qual constam algumas implementac¸˜oes 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 enderec¸o: https://github.com/search?
langOverride=&language=&q=cucumber&repo=&start_value=5&type=Repositories
6. 6
0.6 Funcionamento b´asico
Comec¸aremos a explanac¸˜ao 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˜ao divididos em duas sec¸˜oes, a feature (funcionalidade) em si, e os scenario
(cen´arios)[6].
Excerto de c´odigo 1 A sec¸˜ao feature do arquivo addition.feature
Feature: Addition
In order to avoid silly mistakes
As a math idiot
I want to be told the sum of two numbers
A sec¸˜ao feature ´e formada pelo nome da funcionalidade e uma hist´oria. O nome da
funcionalidade pode ser usado para se referir a esta posteriormente, e a hist´oria n˜ao tem de
seguir obrigatoriamente nenhum formato, nem tem alguma utilidade para ferramenta. Ela
que d´a uma descric¸˜ao informal da funcionalidade e explicita para quem ela ´e importante e
motivo. A hist´oria est´a relacionada `a filosofia do BDD, em espec´ıfico, com um de seus trˆes
principios b´asicos, o de que qualquer funcionalidade deve ter um valor claro e verific´avel
para o neg´ocio[3]. Como foi dito, ela n˜ao possui nenhum formato obrigat´orio, no entanto,
a convenc¸˜ao usada nos exemplos proporcionados nos exemplos do reposit´orio que contˆem a
ferramenta e em sua Wiki ´e “In order ...As a ...I want ...” (Para ...Como um ...Eu quero
...). Outra convenc¸˜ao ´e “As a ...I want ...so that ...” (Como um ...eu quero ...de modo
que ...), introduzida por Dan North (criador do BDD), em marc¸o de 2006, em um artigo de
introduc¸˜ao ao BDD[11].
Excerto de c´odigo 2 Uma sec¸˜ao scenario do arquivo addition.feature
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 sec¸˜ao feature e um n´umero qualquer de sec¸˜oes scenario.
Os cen´arios s˜ao basicamente casos de teste em alto n´ıvel, a intenc¸˜ao deles ´e formar a descric¸˜ao
do comportamento da funcionalidade. Um cen´ario ´e formado pelo seu nome e pelos seus
passos. Os passos s˜ao cada linha dentro da definic¸˜ao de um cen´ario[6]. H´a trˆes principais
palavras chave que iniciam um passo, elas s˜ao: Given (Dado que), When (Quando), e Then
(Ent˜ao). Given ´e usado para inicializar o ambiente daquele cen´ario. When ´e usado para
descrever as ac¸˜oes que devem ser executadas durante o teste. Then verifica se o teste deu o
resultado esperado. Elas normalmente s˜ao dadas na ordem que foi apresentada. A palavra
chave And (e), tamb´em pode ser usada para adicionar mais um passo, ela ter´a o mesmo
significado da palavra-chave do passo imediatamente anterior[2].
7. 7
Excerto de c´odigo 3 O fonte addition steps.rb que define os passos utilizados anteriormente
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 definic¸˜ao dos passos descritos nos arquivos feature ´e feita em c´odigos-fonte da lingua-
gem utilizada pela implementac¸˜ao do Cucumber. A sintaxe exata para definic¸˜ao do passo
varia para cada implementac¸˜ao do Cucumber em uma diferente linguagem. Aqui foi apre-
sentada a sintaxe em Ruby. As definic¸˜oes de passo usualmente consistem na palavra-chave
correspondente e uma express˜ao regular que casa com o texto correspondente, escrito ap´os a
palavra-chave, no arquivo feature.
Uma express˜ao regular ´e uma forma de denotar padr˜oes23
em cadeias de caracteres. O
excerto “(.+)”, por exemplo, pode ser decomposto em trˆes componentes, o “.”, o “+” e os
parentˆeses envolvendo-os. O “.” casa com um caracter qualquer, e o “+” muda o significado
do s´ımbolo anterior (o “.” neste caso) para casar com uma ou mais ocorrˆencias do mesmo
(neste caso um ou mais caracteres). Os parˆenteses informam que a porc¸˜ao de texto que for
casada com a express˜ao dentro deles deve ser capturada como argumento (no caso do exemplo
isso significa que a sequˆencia de d´ıgitos naquela posic¸˜ao da cadeia definir´a o valor de n, ou
result).
O uso de uma express˜ao regular, como pode ser visto acima, s´o ´e necess´ario caso seja
necess´ario capturar uma determinada porc¸˜ao v´ariavel do texto como argumento para o c´odigo
da definic¸˜ao do passo.
As sec¸˜oes “Before do ...end” (Antes fac¸a ...fim) e “After do ...end” (Depois fac¸a
...fim) s˜ao “hooks” (ganchos), elas permitem definir um bloco de c´odigo para ser execu-
tado antes e depois, respectivamente, de cada cen´ario.
A convenc¸˜ao de organizac¸˜ao dos arquivos do Cucumber ´e a seguinte: a pasta base se
23
O artigo da wikipedia em inglˆes possui uma boa introduc¸˜ao a espress˜oes regulares: http://en.
wikipedia.org/wiki/Regex
8. 8
chama “features”, dentro dela deve haver os arquivos feature e a pasta “step definitions”,
que contˆem os c´odigos-fonte que definem os passos. Pode haver, tamb´em, dentro da pasta
“features”, a pasta “support”, nela devem estar quaisquer inicializac¸˜oes 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ˆe execute o Cucumber sem ter definido os passos ele lhe sugerir´a os cabec¸alhos das
definic¸˜oes para preenchimento dos blocos de c´odigo. H´a v´arios estados que um passo pode
assumir, os mais comuns s˜ao passed (passou), failed (falhou), undefined (n˜ao definido) e skip-
ped (ignorado), cujas cores padr˜ao s˜ao respectivamente verde, vermelho, amarelo e ciano. O
significado de cada estado, passed, failed, undefined e skipped, s˜ao, repectivamente, o passo
ocorreu sem erro, o passo causou um erro ao executar, n˜ao foi encontrada uma definic¸˜ao para
o passo, e o passo foi ignorado porque o anterior falhou.
0.7 Passos para instalac¸˜ao
Nesta sec¸˜ao descrevem-se os passos usados para instalac¸˜ao do Cucumber e de algumas bibli-
otecas relacionadas. Estes passos s˜ao necess´arios para a reproduc¸˜ao dos exemplos de caso de
teste apresentados em uma das pr´oximas sec¸˜oes. Esses passos e os casos de teste foram exe-
cutados sobre uma m´aquina com a distribuic¸˜ao Ubuntu 12.04 (precise) 64-bit, com o kernel
3.2.0-23-generic.
Instalou-se o gerenciador de pacotes padr˜ao do Ruby, RubyGems, na vers˜ao 1.8, que era
uma das dispon´ıveis no gerenciador de pacotes da distribuic¸˜ao. A partir do RubyGems, ent˜ao,
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´odigo Ruby, de diversos
navegadores. Executou-se o de uso do Cucumber com o Watir da pasta de exemplos do
reposit´orio do Cucumber para verificar a instalac¸˜ao. Para que este funcionasse corretamente
foi necess´ario fazer duas pequenas modificac¸˜oes nos fontes do exemplo.
Excerto de c´odigo 4 Comandos usados para instalac¸˜ao do Cucumber e demais gemas
$ 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-´a, nesta sec¸˜ao, um exemplo do uso da ferramenta Cucumber, para o teste de
uma aplicac¸˜ao Web, no ambiente descrito na sec¸˜ao anterior. O software a ser testado ´e uma
simples aplicac¸˜ao Web, desenvolvida pelos autores, que permite fazer a m´edia aritm´etica de
9. 9
Excerto de c´odigo 5 Vers˜ao final do arquivo env.rb do exemplo com o Watir, adaptado para
usar a vers˜ao instalada do Watir
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´odigo 6 A linha comentada e adicionada, respectivamente, ao arquivo se-
arch steps.rb, devido `a mudanc¸a do nome do bot˜ao do Google
# @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 aplicac¸˜ao que ´e
o c´alculo da m´edia aritm´etica.
Excerto de c´odigo 7 O conte´udo do arquivo arithmetic mean.feature
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˜ao inv´alida!
Foi usado o mesmo c´odigo do arquivo env.rb para definic¸˜ao do browser usado pelo exem-
plo do Watir, descrito no excerto 5. A organizac¸˜ao dos arquivos seguiu a convenc¸˜ao do
Cucumber explicada na sec¸˜ao “Funcionamento b´asico”. A linha de comando utilizada para
executar o Cucumber ´e a demonstrada no excerto 9, ela foi chamada de dentro da pasta fea-
tures, e teve a sa´ıda apresentada na figura 1.
A execuc¸˜ao dos testes faz o navegador Mozilla Firefox abrir, carregar a p´agina com a
aplicac¸˜ao Web, preencher o campo, clicar o bot˜ao e checar o resultado contra o especificado
no cen´ario. As pausas de dois segundos foram feitas para que o processo de teste pudesse ser
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 aplicac¸˜ao ´e apresentada
na figura 2.
11. 11
Excerto de c´odigo 8 O fonte arithmetic mean steps.rb que define os passos utilizados ante-
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´odigo 9 Linha de comando utilizada para executar o Cucumber sobre o exemplo
$ cucumber -r features/step_definitions/arithmetic_mean_steps.rb
-r features/support/env.rb
12. 12
Figura 2: Captura da execuc¸˜ao do navegador durante o teste
0.9 Considerac¸˜oes Finais
Cucumber ´e uma ferramenta que suporta uma ampla variedade de linguagens e ambientes,
n˜ao sendo isso raz˜ao para n˜ao adot´a-la. Cucumber, no entanto, como foi visto, ´e intrinse-
camente ligado `a filosofia do BDD, sendo uma ferramenta que dificilmente seria adotada
por um grupo que n˜ao tivesse conhecimento de, ou pretendesse utilizar-se, dessa t´ecnica de
programac¸˜ao. N˜ao ´e somente a hist´oria do BDD que ´e ligada ao Cucumber, mas o BDD
tamb´em influenciou por completo a concepc¸˜ao da ferramenta.
A compreens˜ao do funcionamento da ferramenta, principalmente em relac¸˜ao ao sistema
de passos em linguagem natural e as definic¸˜oes dos passos em c´odigo, pode ser confusa em
princ´ıpio. Essa confus˜ao pode ser creditada a aparente falta de motivos para esta organizac¸˜ao.
Essa separac¸˜ao leva a ter de se manter dois artefatos sincronizados, ao inv´es de s´o um c´odigo
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 definic¸˜oes de passos
j´a prontos, e se manteria somente um artefato o qual pode ser lido tamb´em pelos clientes do
neg´ocio. Essa assunc¸˜ao, no entanto, ´e invalidada pelas cr´ıticas de que o uso de biblioteca
de passos prontos levava `a escrita de cen´arios dif´ıceis de ler, tediosos e em baixo n´ıvel de
abstrac¸˜ao[7], as quais tiveram respaldo da comunidade.
Podemos compreender essa decis˜ao do design da ferramenta se considerarmos que a des-
vantagem de ter de dar manutenc¸˜ao a esses dois artefatos sincronizados ´e, tamb´em, uma van-
tagem. Se cada modificac¸˜ao na especificac¸˜ao do comportamento da ferramenta (o arquivo
feature) quebra os testes e forc¸a a observar o seu c´odigo, e cada alterac¸˜ao do c´odigo leva a
reflex˜ao se o passo ainda ´e refletido por aquela nova definic¸˜ao, se ganha uma especificac¸˜ao
que ´e t´ecnica e n˜ao-t´ecnica simultaneamente e que liga forc¸osamente ambos os lados. Dessa
forma, a especificac¸˜ao do comportamento do sistema ´e unificada, e a mudanc¸a dos pontos
de vista de cada um dos lados (desenvolvedores e clientes) passa a forc¸ar a observac¸˜ao desta
pelo outro.
13. Referˆencias Bibliogr´aficas
[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˜nO, D. Feature Introduction - Cucumber Wiki.
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 Confiden-
tial. 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]. Dis-
pon´ı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 WiP-
Flash.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>.