Cucumber - Um breve Review

890 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
890
No SlideShare
0
A partir de incorporações
0
Número de incorporações
5
Ações
Compartilhamentos
0
Downloads
12
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Cucumber - Um breve Review

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

×