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
Felipe Haack Schmitz, Henrique Becker e La´ıs de Figueiredo Berlatto
Universidade de Passo Fund...
2
0.1 Resumo
Introduz-se a ferramenta Cucumber, explicando-se a ligac¸˜ao da ferramenta com a t´ecnica de
programac¸˜ao BD...
3
0.3 A ferramenta Cucumber
Cucumber foi, originalmente, escrito em Ruby e sua implementac¸˜ao de referˆencia (e mais uti-...
4
introduzindo BDD foi publicado por ele na revista “Better Software”3
. No final deste artigo
ele fala que Dave Astels est...
5
Cucumber (em pelo menos sua principal implementac¸˜ao) se integra com v´arias bibliote-
cas, as quais lhe permitem contr...
6
0.6 Funcionamento b´asico
Comec¸aremos a explanac¸˜ao sobre o funcionamento do Cucumber pelo arquivo feature, e seu
form...
7
Excerto de c´odigo 3 O fonte addition steps.rb que define os passos utilizados anteriormente
Before do
@calc = Calculador...
8
chama “features”, dentro dela deve haver os arquivos feature e a pasta “step definitions”,
que contˆem os c´odigos-fonte ...
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 Wa...
10
Figura 1: Sa´ıda do Cucumber sobre o exemplo
um conjunto qualquer de valores. A funcionalidade a ser testada ´e a ´unic...
11
Excerto de c´odigo 8 O fonte arithmetic mean steps.rb que define os passos utilizados ante-
riormente
numbers = []
Given...
12
Figura 2: Captura da execuc¸˜ao do navegador durante o teste
0.9 Considerac¸˜oes Finais
Cucumber ´e uma ferramenta que ...
Referˆencias Bibliogr´aficas
[1] TEAM, C. Cucumber Wiki. 2012. [Online; acessado em 25/06/2012]. Dispon´ıvel em:
<https://g...
14
[12] GIBBS, E. JBehave and RSpec History. 2007. [Online; acessado em
25/06/2012]. Dispon´ıvel em: <http://edgibbs.com/2...
Nächste SlideShare
Wird geladen in …5
×

Cucumber: um breve review

370 Aufrufe

Veröffentlicht am

Trabalho acerca da ferramenta Cucumber

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

  • Gehören Sie zu den Ersten, denen das gefällt!

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ˆencia da Computac¸˜ao Disciplina de Qualidade e Teste de Software
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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>.

×