Your SlideShare is downloading. ×
Cucumber: um breve review
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Cucumber: um breve review

91
views

Published on

Trabalho acerca da ferramenta Cucumber

Trabalho acerca da ferramenta Cucumber

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
91
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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