SlideShare a Scribd company logo
1 of 14
Download to read offline
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

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

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
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
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

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
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
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

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

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

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

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.
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
[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>.

More Related Content

What's hot

Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascriptLaís Lima
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDouglas V. Pasqua
 
Padrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - ProxyPadrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - ProxyEduardo Nicola F. Zagari
 
RSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteRSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteEduardo Mendes
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesDavid Robert Camargo de Campos
 
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...iMasters
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniterAnderson Gonçalves
 
T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)Carlos Santos
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015Renato Groff
 
Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)André Justi
 
BDD + PHP = behat!
BDD + PHP = behat!BDD + PHP = behat!
BDD + PHP = behat!Vitor Mattos
 
Começando com Zend Framework 2
Começando com Zend Framework 2Começando com Zend Framework 2
Começando com Zend Framework 2Cezar Souza
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPiMasters
 

What's hot (20)

Java VS Kotlin
Java VS KotlinJava VS Kotlin
Java VS Kotlin
 
Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascript
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHP
 
Tutorial codeigniter
Tutorial codeigniterTutorial codeigniter
Tutorial codeigniter
 
Introdução ao vraptor
Introdução ao vraptorIntrodução ao vraptor
Introdução ao vraptor
 
Padrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - ProxyPadrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - Proxy
 
Growing oos guided_by_tests entire
Growing oos guided_by_tests entireGrowing oos guided_by_tests entire
Growing oos guided_by_tests entire
 
RSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteRSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em Teste
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefes
 
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniter
 
T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)
 
Curso de Grails
Curso de GrailsCurso de Grails
Curso de Grails
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015
 
Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)
 
BDD + PHP = behat!
BDD + PHP = behat!BDD + PHP = behat!
BDD + PHP = behat!
 
Intro à Graphql
Intro à GraphqlIntro à Graphql
Intro à Graphql
 
Começando com Zend Framework 2
Começando com Zend Framework 2Começando com Zend Framework 2
Começando com Zend Framework 2
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
 

Viewers also liked

Data encryption standard DES & 3DES
Data encryption standard DES & 3DESData encryption standard DES & 3DES
Data encryption standard DES & 3DESLaís Berlatto
 
Trible data encryption standard (3DES)
Trible data encryption standard (3DES)Trible data encryption standard (3DES)
Trible data encryption standard (3DES)Ahmed Mohamed Mahmoud
 
Double DES & Triple DES
Double DES & Triple DESDouble DES & Triple DES
Double DES & Triple DESHemant Sharma
 
Web Mining & Text Mining
Web Mining & Text MiningWeb Mining & Text Mining
Web Mining & Text MiningHemant Sharma
 

Viewers also liked (6)

Live mocha
Live mochaLive mocha
Live mocha
 
Data encryption standard DES & 3DES
Data encryption standard DES & 3DESData encryption standard DES & 3DES
Data encryption standard DES & 3DES
 
Trible data encryption standard (3DES)
Trible data encryption standard (3DES)Trible data encryption standard (3DES)
Trible data encryption standard (3DES)
 
BDD & Cucumber
BDD & CucumberBDD & Cucumber
BDD & Cucumber
 
Double DES & Triple DES
Double DES & Triple DESDouble DES & Triple DES
Double DES & Triple DES
 
Web Mining & Text Mining
Web Mining & Text MiningWeb Mining & Text Mining
Web Mining & Text Mining
 

Similar to Cucumber - Um breve Review

Docker: Introdução à Conteinerização de Apps e Nuvem.
Docker: Introdução à Conteinerização de Apps e Nuvem.Docker: Introdução à Conteinerização de Apps e Nuvem.
Docker: Introdução à Conteinerização de Apps e Nuvem.Marcel Cattaneo
 
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO ILIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO IOs Fantasmas !
 
Desenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software LivreDesenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software Livreelliando dias
 
Testes automatizados.pptx
Testes automatizados.pptxTestes automatizados.pptx
Testes automatizados.pptxCarlos Gonzaga
 
Java programação orientada a objetos
Java   programação orientada a objetosJava   programação orientada a objetos
Java programação orientada a objetosPaulo Carvalho
 
Ruby: Simples e Expressivo - Women Techmakers João Pessoa
Ruby: Simples e Expressivo - Women Techmakers João PessoaRuby: Simples e Expressivo - Women Techmakers João Pessoa
Ruby: Simples e Expressivo - Women Techmakers João PessoaWomen Techmakers João Pessoa
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para LinuxChris x-MS
 
Curso de Introdução ao Software Livre - Aula de 29/10/2009
Curso de Introdução ao Software Livre - Aula de 29/10/2009Curso de Introdução ao Software Livre - Aula de 29/10/2009
Curso de Introdução ao Software Livre - Aula de 29/10/2009Antônio Arapiraca
 
Tradução de Aplicativos Livres
Tradução de Aplicativos LivresTradução de Aplicativos Livres
Tradução de Aplicativos LivresÁtila Camurça
 
Programação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com JavaProgramação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com JavaRosicleia Frasson
 
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) Grupo Treinar
 

Similar to Cucumber - Um breve Review (20)

Isc aula 7
Isc   aula 7Isc   aula 7
Isc aula 7
 
Docker: Introdução à Conteinerização de Apps e Nuvem.
Docker: Introdução à Conteinerização de Apps e Nuvem.Docker: Introdução à Conteinerização de Apps e Nuvem.
Docker: Introdução à Conteinerização de Apps e Nuvem.
 
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO ILIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
 
Desenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software LivreDesenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software Livre
 
Testes automatizados.pptx
Testes automatizados.pptxTestes automatizados.pptx
Testes automatizados.pptx
 
Ruby
RubyRuby
Ruby
 
Java programação orientada a objetos
Java   programação orientada a objetosJava   programação orientada a objetos
Java programação orientada a objetos
 
Ruby: Simples e Expressivo - Women Techmakers João Pessoa
Ruby: Simples e Expressivo - Women Techmakers João PessoaRuby: Simples e Expressivo - Women Techmakers João Pessoa
Ruby: Simples e Expressivo - Women Techmakers João Pessoa
 
Pascal 70
Pascal 70Pascal 70
Pascal 70
 
Iniciando com docker
Iniciando com dockerIniciando com docker
Iniciando com docker
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para Linux
 
Curso de Introdução ao Software Livre - Aula de 29/10/2009
Curso de Introdução ao Software Livre - Aula de 29/10/2009Curso de Introdução ao Software Livre - Aula de 29/10/2009
Curso de Introdução ao Software Livre - Aula de 29/10/2009
 
Tradução de Aplicativos Livres
Tradução de Aplicativos LivresTradução de Aplicativos Livres
Tradução de Aplicativos Livres
 
Integração Continua - Jenkins
Integração Continua - JenkinsIntegração Continua - Jenkins
Integração Continua - Jenkins
 
Programação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com JavaProgramação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com Java
 
Delphi6bd
Delphi6bdDelphi6bd
Delphi6bd
 
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
 
Android juliana-mono
Android juliana-monoAndroid juliana-mono
Android juliana-mono
 
Ruby and Rails
Ruby and RailsRuby and Rails
Ruby and Rails
 
15. introducao ao c++
15. introducao ao c++15. introducao ao c++
15. introducao ao c++
 

More from Laís Berlatto

Testes de usabilidade
Testes de usabilidade Testes de usabilidade
Testes de usabilidade Laís Berlatto
 
Specificationby example
Specificationby example Specificationby example
Specificationby example Laís Berlatto
 
Aplicação de técnicas de processamento de linguagem natural para ferramenta P...
Aplicação de técnicas de processamento de linguagem natural para ferramenta P...Aplicação de técnicas de processamento de linguagem natural para ferramenta P...
Aplicação de técnicas de processamento de linguagem natural para ferramenta P...Laís Berlatto
 
Programação Diversitária
Programação DiversitáriaProgramação Diversitária
Programação DiversitáriaLaís Berlatto
 
Specification By Example: Estudo de caso em uma software house
Specification By Example: Estudo de caso em uma software houseSpecification By Example: Estudo de caso em uma software house
Specification By Example: Estudo de caso em uma software houseLaís Berlatto
 
Histórico da informática
Histórico da informáticaHistórico da informática
Histórico da informáticaLaís Berlatto
 
Especificações da ISO para gestão de Segurança da Informação
Especificações da ISO para gestão de Segurança da InformaçãoEspecificações da ISO para gestão de Segurança da Informação
Especificações da ISO para gestão de Segurança da InformaçãoLaís Berlatto
 
Modelos de Previsão para sistemas de turbulência
Modelos de Previsão para sistemas de turbulênciaModelos de Previsão para sistemas de turbulência
Modelos de Previsão para sistemas de turbulênciaLaís Berlatto
 
Teste de Usabilidade e Percurso Cognitivo
Teste de Usabilidade e Percurso CognitivoTeste de Usabilidade e Percurso Cognitivo
Teste de Usabilidade e Percurso CognitivoLaís Berlatto
 
Berlatto reengenharia por exemplos uma proposta para evolucao de sistemas leg...
Berlatto reengenharia por exemplos uma proposta para evolucao de sistemas leg...Berlatto reengenharia por exemplos uma proposta para evolucao de sistemas leg...
Berlatto reengenharia por exemplos uma proposta para evolucao de sistemas leg...Laís Berlatto
 

More from Laís Berlatto (18)

Testes de usabilidade
Testes de usabilidade Testes de usabilidade
Testes de usabilidade
 
Specificationby example
Specificationby example Specificationby example
Specificationby example
 
Aplicação de técnicas de processamento de linguagem natural para ferramenta P...
Aplicação de técnicas de processamento de linguagem natural para ferramenta P...Aplicação de técnicas de processamento de linguagem natural para ferramenta P...
Aplicação de técnicas de processamento de linguagem natural para ferramenta P...
 
E-business
E-businessE-business
E-business
 
Programação Diversitária
Programação DiversitáriaProgramação Diversitária
Programação Diversitária
 
Specification By Example: Estudo de caso em uma software house
Specification By Example: Estudo de caso em uma software houseSpecification By Example: Estudo de caso em uma software house
Specification By Example: Estudo de caso em uma software house
 
Bluetooth
BluetoothBluetooth
Bluetooth
 
Cloud computing
Cloud computingCloud computing
Cloud computing
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
 
Amostragem
AmostragemAmostragem
Amostragem
 
Estudo de caso
Estudo de casoEstudo de caso
Estudo de caso
 
Ética hacker
Ética hackerÉtica hacker
Ética hacker
 
Histórico da informática
Histórico da informáticaHistórico da informática
Histórico da informática
 
Especificações da ISO para gestão de Segurança da Informação
Especificações da ISO para gestão de Segurança da InformaçãoEspecificações da ISO para gestão de Segurança da Informação
Especificações da ISO para gestão de Segurança da Informação
 
Modelos de Previsão para sistemas de turbulência
Modelos de Previsão para sistemas de turbulênciaModelos de Previsão para sistemas de turbulência
Modelos de Previsão para sistemas de turbulência
 
Arm Cortex
Arm CortexArm Cortex
Arm Cortex
 
Teste de Usabilidade e Percurso Cognitivo
Teste de Usabilidade e Percurso CognitivoTeste de Usabilidade e Percurso Cognitivo
Teste de Usabilidade e Percurso Cognitivo
 
Berlatto reengenharia por exemplos uma proposta para evolucao de sistemas leg...
Berlatto reengenharia por exemplos uma proposta para evolucao de sistemas leg...Berlatto reengenharia por exemplos uma proposta para evolucao de sistemas leg...
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>.