SlideShare uma empresa Scribd logo
1 de 14
Baixar para ler offline
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
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
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
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
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
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
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
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
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
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
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
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.
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
[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>.

Mais conteúdo relacionado

Mais procurados

GCC - Compile! Linque! Debug!
GCC - Compile! Linque! Debug!GCC - Compile! Linque! Debug!
GCC - Compile! Linque! Debug!PeslPinguim
 
Facebook's Hack programming language / Linguagem de programação Hack do Facebook
Facebook's Hack programming language / Linguagem de programação Hack do FacebookFacebook's Hack programming language / Linguagem de programação Hack do Facebook
Facebook's Hack programming language / Linguagem de programação Hack do FacebookRafael Alves
 
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)Leinylson Fontinele
 
Aula 3 compiladores e interpretadores
Aula 3   compiladores e interpretadoresAula 3   compiladores e interpretadores
Aula 3 compiladores e interpretadoresLCCIMETRO
 
055 A 094 Material Auxiliar Para Curso AvançAdo I Msp430
055 A 094   Material Auxiliar Para Curso AvançAdo I Msp430055 A 094   Material Auxiliar Para Curso AvançAdo I Msp430
055 A 094 Material Auxiliar Para Curso AvançAdo I Msp430Texas Instruments
 
Cake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modeloCake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modeloCBA2012
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para LinuxChris x-MS
 
Introdução a Arquitetura Android
Introdução a Arquitetura AndroidIntrodução a Arquitetura Android
Introdução a Arquitetura AndroidMaycon Viana Bordin
 
dotnetConf 2016 Goiânia: .NET Core | ASP.NET Core
dotnetConf 2016 Goiânia: .NET Core | ASP.NET CoredotnetConf 2016 Goiânia: .NET Core | ASP.NET Core
dotnetConf 2016 Goiânia: .NET Core | ASP.NET CoreRogério Moraes de Carvalho
 
Colaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPColaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPThiago Colares
 
Colaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPColaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPCBA2012
 

Mais procurados (18)

Comparativo do uso de linguagens de programação e geradores de código no dese...
Comparativo do uso de linguagens de programação e geradores de código no dese...Comparativo do uso de linguagens de programação e geradores de código no dese...
Comparativo do uso de linguagens de programação e geradores de código no dese...
 
Delphi6bd
Delphi6bdDelphi6bd
Delphi6bd
 
GCC - Compile! Linque! Debug!
GCC - Compile! Linque! Debug!GCC - Compile! Linque! Debug!
GCC - Compile! Linque! Debug!
 
Facebook's Hack programming language / Linguagem de programação Hack do Facebook
Facebook's Hack programming language / Linguagem de programação Hack do FacebookFacebook's Hack programming language / Linguagem de programação Hack do Facebook
Facebook's Hack programming language / Linguagem de programação Hack do Facebook
 
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)
 
Aula 3 compiladores e interpretadores
Aula 3   compiladores e interpretadoresAula 3   compiladores e interpretadores
Aula 3 compiladores e interpretadores
 
055 A 094 Material Auxiliar Para Curso AvançAdo I Msp430
055 A 094   Material Auxiliar Para Curso AvançAdo I Msp430055 A 094   Material Auxiliar Para Curso AvançAdo I Msp430
055 A 094 Material Auxiliar Para Curso AvançAdo I Msp430
 
Cake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modeloCake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modelo
 
Linguagens de programação
Linguagens de programaçãoLinguagens de programação
Linguagens de programação
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para Linux
 
Linguagem Delphi-Introdução
Linguagem Delphi-IntroduçãoLinguagem Delphi-Introdução
Linguagem Delphi-Introdução
 
Introdução a Arquitetura Android
Introdução a Arquitetura AndroidIntrodução a Arquitetura Android
Introdução a Arquitetura Android
 
dotnetConf 2016 Goiânia: .NET Core | ASP.NET Core
dotnetConf 2016 Goiânia: .NET Core | ASP.NET CoredotnetConf 2016 Goiânia: .NET Core | ASP.NET Core
dotnetConf 2016 Goiânia: .NET Core | ASP.NET Core
 
Colaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPColaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHP
 
Paradigmas de Linguagem
Paradigmas de LinguagemParadigmas de Linguagem
Paradigmas de Linguagem
 
Isc aula 7
Isc   aula 7Isc   aula 7
Isc aula 7
 
BDD com Cucumber
BDD com CucumberBDD com Cucumber
BDD com Cucumber
 
Colaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPColaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHP
 

Semelhante a Cucumber: um breve review

Cucumber - Um breve Review
Cucumber - Um breve ReviewCucumber - Um breve Review
Cucumber - Um breve ReviewLaís Berlatto
 
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 !
 
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
 
BDD (Behavior-Driven Development)
BDD (Behavior-Driven Development)BDD (Behavior-Driven Development)
BDD (Behavior-Driven Development)Renato Groff
 
BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015Renato Groff
 
Linguagens de programação 03-12-09
Linguagens de programação   03-12-09Linguagens de programação   03-12-09
Linguagens de programação 03-12-09essa
 
Linguagens de programação 03-12-09
Linguagens de programação   03-12-09Linguagens de programação   03-12-09
Linguagens de programação 03-12-09essa
 
Reutilização
ReutilizaçãoReutilização
Reutilizaçãoemjorge
 
Desenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software LivreDesenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software Livreelliando dias
 
Apostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NETApostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NETJosé Corrêa Viana
 
apostila-desenvolvimento-asp-net
 apostila-desenvolvimento-asp-net apostila-desenvolvimento-asp-net
apostila-desenvolvimento-asp-netSandra Rocha
 
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
 
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
 

Semelhante a Cucumber: um breve review (20)

Cucumber - Um breve Review
Cucumber - Um breve ReviewCucumber - Um breve Review
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.
 
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO ILIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
 
Object pascal
Object pascalObject pascal
Object pascal
 
Testes automatizados.pptx
Testes automatizados.pptxTestes automatizados.pptx
Testes automatizados.pptx
 
Pascal 70
Pascal 70Pascal 70
Pascal 70
 
Java programação orientada a objetos
Java   programação orientada a objetosJava   programação orientada a objetos
Java programação orientada a objetos
 
Ruby
RubyRuby
Ruby
 
Integração Continua - Jenkins
Integração Continua - JenkinsIntegração Continua - Jenkins
Integração Continua - Jenkins
 
BDD (Behavior-Driven Development)
BDD (Behavior-Driven Development)BDD (Behavior-Driven Development)
BDD (Behavior-Driven Development)
 
BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015
 
Linguagens de programação 03-12-09
Linguagens de programação   03-12-09Linguagens de programação   03-12-09
Linguagens de programação 03-12-09
 
Linguagens de programação 03-12-09
Linguagens de programação   03-12-09Linguagens de programação   03-12-09
Linguagens de programação 03-12-09
 
Reutilização
ReutilizaçãoReutilização
Reutilização
 
Desenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software LivreDesenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software Livre
 
Apostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NETApostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NET
 
apostila-desenvolvimento-asp-net
 apostila-desenvolvimento-asp-net apostila-desenvolvimento-asp-net
apostila-desenvolvimento-asp-net
 
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
 
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
 
Ruby and Rails
Ruby and RailsRuby and Rails
Ruby and Rails
 

Mais de 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
 
Data encryption standard DES & 3DES
Data encryption standard DES & 3DESData encryption standard DES & 3DES
Data encryption standard DES & 3DESLaí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
 

Mais de Laís Berlatto (19)

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
 
Data encryption standard DES & 3DES
Data encryption standard DES & 3DESData encryption standard DES & 3DES
Data encryption standard DES & 3DES
 
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ˆ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>.