Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Cucumber - Um breve Review

1.181 Aufrufe

Veröffentlicht am

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

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

×