© Casa do Código - s3. · PDF fileWindows. Portanto, se você for...

18

Transcript of © Casa do Código - s3. · PDF fileWindows. Portanto, se você for...

Page 1: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux
Page 2: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

© Casa do CódigoTodos os direitos reservados e protegidos pela Lei nº9.610, de 10/02/1998.Nenhuma parte deste livro poderá ser reproduzida, nem transmitida, sem auto-rização prévia por escrito da editora, sejam quais forem os meios: fotográficos,eletrônicos, mecânicos, gravação ou quaisquer outros.

Casa do CódigoLivros para o programadorRua Vergueiro, 3185 - 8º andar04101-300 – Vila Mariana – São Paulo – SP – Brasil

Page 3: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux
Page 4: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux
Page 5: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

Casa do Código

Dedicatória

Dedico este livro a duas pessoas: minha mãe e minha noiva.Sem o trabalho árduo e constante suporte da minha mãe, eu não estaria aqui

hoje, escrevendo um livro. Ela é minha heroína e a pessoa mais batalhadora que jáconheci. Obrigado Lilian Pessoa por me dar as oportunidades que tive na vida.

Escrever um livro é uma empreitada bem mais trabalhosa que eu pensei. Cen-tenas de horas de trabalho. Essas horas não foram um investimento apenas meu, foitambém da minha noiva. Vários meses sem ter um �nal de semana tranquilo parapassar ao lado dela. Obrigado Ana Raquel por segurar essa barra e por me apoiar atéa última palavra deste livro.

i

Page 6: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux
Page 7: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

Casa do Código

Agradecimentos

Primeiro eu gostaria de agradecer ao Adriano Almeida, da Casa do Código, peloconvite para escrever este livro. Sem esse primeiro empurrão é muito improvávelque esse livro existiria. Escrevê-lo foi não só um excelente desa�o mas também umagrande oportunidade de aprendizado.

Gostaria de agradecer também à Plataformatec e a todo mundo que trabalhacomigo lá. São os melhores pro�ssionais com quem eu já trabalhei e me inspiramtodo dia a ser um pro�ssional melhor.

Não posso deixar tambémde agradecer aminha família e amigos como um todo.Ao fazer este livro, tive que abdicar de passar inúmeras horas com eles, decisão quenão foi fácil de tomar e muito menos de manter.

Por �m, gostaria de agradecer às pessoas que investiram seu tempo revisando asprimeiras versões deste livro. Eles não tinham nenhuma obrigação de fazê-lo, �ze-ram pela boa vontade, amizade, por serem colaborativos e pela vontade de aprenderalgo novo. São eles: Bernardo Chaves, Erich Kist, Danilo Inacio e Anna Cruz.

iii

Page 8: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux
Page 9: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

Casa do Código

Sobre o autor

Hugo Baraúna é cofundador e sócio da Plataformatec, empresa de consultoria emdesenvolvimento de so�ware especializada em Ruby e Rails.

A Plataformatec é referência nacional e internacional no mundo Ruby, devidoprincipalmente a seus projetos open source e sua colaboração com a comunidade.Ele atua tanto na direção da empresa quanto como desenvolvedor, tendo participadode projetos de consultoria, coaching e desenvolvimento para startups e empresas daFortune ����.

Hugo se formou em Engenharia de Computação pela Politécnica da USP. Du-rante a faculdade, passou pelo laboratório USP-Microso� e por empresas comoProcwork e IBM.

Para ele, só é possível fazer produtos e serviços de qualidade quando se ama oque faz.

v

Page 10: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux
Page 11: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

Casa do Código

ApresentaçãoAbordagem do livro

Este livro não é um manual do Cucumber e de RSpec. Já existem diversos lugareslistando as funcionalidades, classes e métodos do Cucumber e RSpec. Portanto, oobjetivo não é repetir o que já existe pronto em vários outros lugares.

A abordagem deste livro é apresentar como usar essas ferramentas, em vez demostrar todos os detalhes de cada uma delas. Saber o que as ferramentas oferecem édiferente de saber como usá-las. Além da mostra do uso básico, várias boas práticasnão documentadas previamente também são apresentadas, utilizando exemplos aolongo do livro inteiro.

Estrutura do livro

Este livro está estruturado em quatro partes:

�) A primeira consiste em uma introdução ao conceito e histórico do TDD e BDD,assim como umprimeiro contato com o RSpec e com oCucumber. Ela é formadapelos capítulos � e �;

�) A segunda é uma apresentação geral do RSpec. Passando pela estrutura básica deum teste de unidade feito com ele, pela organização de testes e pelo uso de testdoubles como mocks e stubs. Ela é formada pelos capítulos � a �;

�) A terceira parte consiste em uma apresentação do Cucumber e de como usá-lopara escrever especi�cações executáveis. Ela é formada pelos capítulos � a �;

�) Por �m, na quarta e última parte, nós construiremos uma aplicação do zero se-guindo o conceito de outside-in development do BDD, utilizando RSpec e Cu-cumber. Ela é formada pelos capítulos �� a ��.

vii

Page 12: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

Casa do Código

Para quem é este livro?

Estou aprendendo ou já sei programar em Ruby mas nunca �z TDDSe você se enquadra no caso acima, este livro é perfeito para você. Você irá apren-

der como fazer testes automatizados e seguir o �uxo de TDD e BDD para fazer umcódigo mais fácil de ser mantido e com mais qualidade.

Aprender uma habilidade nova não é simples, mas pode ser mais e�ciente com aajuda de uma apresentação estruturada e de um caminho de�nido. Este livro mostrapasso a passo como usar o RSpec e o Cucumber para construir uma aplicação inteiraseguindo o �uxo de TDD/BDD.

Já faço testes automatizados mas não sei se estou fazendo do jeito certoExistem diversos fatores que in�uenciam o desenvolvimento de bons testes. O

que testar? Como testar? Em qual camada testar? Por onde começo?Fazer testes do jeito certo não é apenas ter cobertura de testes em ����. Por

exemplo, a maioria das pessoas não sabem que em um teste a clareza é muito maisimportante do que o DRY (don’t repeat yourself ). A maioria das pessoas não sabema diferença entre mocks e stubs e quando usar um ao invés do outro.

Este livro responde todas as dúvidas acima e mais várias outras, que o ajudarãoa estruturar seu conhecimento em testes automatizados e a escrever testes de quali-dade.

Já �z testes de unidade, mas não conheço Cucumber, nem o conceito de espe-ci�cação executável

Testes de unidade são uma parte muito importante na prática de TDD, mas exis-tem outras camadas de teste, tal como a camada de testes de aceitação. Este livromostra o que são testes de aceitação e como fazê-los utilizando Cucumber.

Na explicação do uso de Cucumber, este livro vai além dos testes de aceitação. OCucumber é, na verdade, uma ferramenta de documentação, que une especi�caçãoe testes automatizados, formando o que conhecemos por “especi�cação executável”.

Este livro mostra como usar o Cucumber do modo certo, quando vale a penausá-lo e como usá-lo em conjunto com o RSpec para fechar o ciclo de outside-indevelopment.

O que preciso ter instalado?

Ao longo do livro veremos vários exemplos de código, e na última parte cons-truiremos um projeto de � a ���. Para ir desenvolvendo o código junto com o livro,você precisará de algumas coisas instaladas.

viii

Page 13: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

Casa do Código

Você precisará ter instalado o Ruby �.� ou �.�. Qualquer uma das duas versõesdeve funcionar, mas dê preferência para a �.�.

Além do Ruby, será necessário instalar o Bundler, RSpec e Cucumber. A versãodo Bundler utilizada é a �.�.�. A versão do Cucumber é a �.�.��. As versões do RSpece de seus componentes usadas são:

• rspec: �.��.�

• rspec-core: �.��.�

• rspec-expectations: �.��.�

• rspec-mocks: �.��.�

Sobre o sistema operacional, você pode usar o Mac OS X, o Linux ou Windows.Dito isso, historicamente o Ruby funcionamelhor no Linux e noMacOSXdo que noWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby,uma boa opção é usar uma máquina virtual rodando Linux.

Umúltimo detalhe sobre o sistema operacional, ao longo do livro alguns coman-dos de shell Unix-like são usados, tal como o mkdir para criar diretório, o cd paraentrar em um diretório e o touch para criar um arquivo. Apesar de serem usa-dos comandos de um shell Unix-like, a intenção de cada comando será explicada aolongo do livro, de modo que você possa saber o que deve ser feito, caso não estejausando um shell Unix-like, como no Windows.

Você tem dúvidas ou achou algum erro no livro?

Este livro possui um grupo de discussão de email com o seguinte endereço:[email protected].

Se você tiver dúvidas sobre o conteúdo do livro ou algo relacionado, você podeenviar um e-mail para o endereço acima.

Caso você ache algum possível erro no livro, por favor o envie nessa lista dediscussão.

Por �m, se você tiver alguma dúvida sobre o código desenvolvido na quarta partedeste livro, a parte do projeto, você pode veri�car um repositório no Github com ocódigo �nal como referência: https://github.com/hugobarauna/forca.

ix

Page 14: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux
Page 15: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

Casa do Código Sumário

Sumário

� Visão geral sobre TDD ��.� TDD e sua história . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ��.� E por qual motivo eu deveria usar TDD? . . . . . . . . . . . . . . . . . �

� Primeiros passos com RSpec e Cucumber ��.� Olá RSpec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ��.� Olá Cucumber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� O que é BDD? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ��

� Introdução ao básico do RSpec ���.� Aprendendo a estrutura básica de um teste com RSpec . . . . . . . . . ���.� Por que existem tantos matchers no RSpec . . . . . . . . . . . . . . . . ���.� Conhecendo os RSpec built-in matchers . . . . . . . . . . . . . . . . . ���.� Custom matchers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Entendendo o protocolo interno de matcher do RSpec . . . . . . . . . ���.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ��

� Organização, refatoração e reuso de testes com o RSpec ���.� Reduzindo duplicação com hooks do RSpec . . . . . . . . . . . . . . . ���.� DRY versus clareza nos testes . . . . . . . . . . . . . . . . . . . . . . . ���.� A�er hook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Around hook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Organizando seus testes . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Reuso de testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ��

xi

Page 16: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

Sumário Casa do Código

� Mocks e stubs ��

�.� Por que preciso de mocks? . . . . . . . . . . . . . . . . . . . . . . . . . ��

�.� Conhecendo o conceito de test doubles . . . . . . . . . . . . . . . . . . ��

�.� Usando stubs com RSpec . . . . . . . . . . . . . . . . . . . . . . . . . . ��

�.� Escrevendo mock expectations com RSpec . . . . . . . . . . . . . . . . ���

�.� Quando usar mock e quando usar stub . . . . . . . . . . . . . . . . . . ���

�.� Usando o método double para fazer testes isolados . . . . . . . . . . . ���

�.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

� Conhecendo o Cucumber ���

�.� Por que usar cucumber? . . . . . . . . . . . . . . . . . . . . . . . . . . ���

�.� Cucumber como estímulo de conversa sobre os requisitos . . . . . . . ���

�.� Cucumber: especi�cação e testes juntos! . . . . . . . . . . . . . . . . . ���

�.� Cucumber para construir uma documentação viva . . . . . . . . . . . ���

�.� Visão geral de cucumber . . . . . . . . . . . . . . . . . . . . . . . . . . ���

�.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

� Especi�cando funcionalidades com Cucumber ���

�.� Instalando e fazendo setup do Cucumber . . . . . . . . . . . . . . . . ���

�.� Estrutura de uma feature com cucumber . . . . . . . . . . . . . . . . . ���

�.� Escrevendo um cenário . . . . . . . . . . . . . . . . . . . . . . . . . . . ���

�.� Escrevendo cenários expressivos com Cucumber . . . . . . . . . . . . ���

�.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

� Automatizando especi�cações com cucumber ���

�.� Escrevendo os primeiros step de�nitions . . . . . . . . . . . . . . . . . ���

�.� Escrevendo step de�nitions para cenários expressivos . . . . . . . . . ���

�.� Support code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���

�.� Cucumber World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���

�.� Usando Cucumber hooks . . . . . . . . . . . . . . . . . . . . . . . . . . ���

�.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

xii

Page 17: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

Casa do Código Sumário

� Boas práticas no uso de Cucumber ����.� Use e abuse das descrições da funcionalidade e dos cenários . . . . . ����.� Evite detalhes desnecessários . . . . . . . . . . . . . . . . . . . . . . . . ����.� Cenários imperativos VS cenários declarativos . . . . . . . . . . . . . ����.� Organizando os arquivos da minha especi�cação executável . . . . . ����.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

�� BDD na prática, começando um projeto com BDD �����.� De�nindo o escopo da nossa aplicação: Jogo da Forca . . . . . . . . . �����.� Especi�cando uma funcionalidade com Cucumber . . . . . . . . . . . �����.� Usando RSpec no nosso primeiro teste . . . . . . . . . . . . . . . . . . �����.� Usando Aruba para testar uma aplicação CLI . . . . . . . . . . . . . . �����.� Reutilizando step de�nitions de um modo melhor . . . . . . . . . . . �����.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

�� Começando o segundo cenário �����.� De�nindo o segundo cenário . . . . . . . . . . . . . . . . . . . . . . . . �����.� Reduza duplicação através de support code . . . . . . . . . . . . . . . �����.� Implementando o �uxo do jogo no binário . . . . . . . . . . . . . . . . �����.� Modi�cando nosso cenário para receber o feedback correto . . . . . . �����.� Usando subject e let do RSpec para evitar duplicação nos testes . . . . �����.� Refatorando o código para poder implementar o segundo cenário . . �����.� Extraindo uma classe através de refatoração . . . . . . . . . . . . . . . �����.� Possibilitando ao jogador terminar o jogo no meio . . . . . . . . . . . �����.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

�� Finalizando a primeira funcionalidade �����.� Deixando o segundo cenário no verde . . . . . . . . . . . . . . . . . . �����.� Finalizando a primeira funcionalidade . . . . . . . . . . . . . . . . . . �����.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

�� Refatorando nosso código �����.� Identi�cado os pontos a serem refatorados . . . . . . . . . . . . . . . . �����.� Extraindo uma classe de um método privado . . . . . . . . . . . . . . �����.� Distribuindo responsabilidades para outras classes . . . . . . . . . . . �����.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

xiii

Page 18: © Casa do Código - s3.  · PDF fileWindows. Portanto, se você for usuário de Windows e quiser programar em Ruby, uma boa opção é usar uma máquina virtual rodando Linux

Sumário Casa do Código

�� Especi�cando a segunda funcionalidade �����.� Documentando especi�cação e critério de aceite com Cucumber . . . �����.� De�nindo o teste de aceitação do primeiro cenário . . . . . . . . . . . �����.� Melhore a testabilidade do seu so�ware . . . . . . . . . . . . . . . . . . �����.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

�� Finalizando a segunda funcionalidade �����.� Refatorando nosso jogo para ter uma máquina de estados . . . . . . . �����.� Refatorando o �uxo do jogo para usar a máquina de estados . . . . . �����.� Organizando seus testes otimizando para leitura . . . . . . . . . . . . �����.� Interface discovery utilizando test doubles . . . . . . . . . . . . . . . . �����.� Finalizando a funcionalidade Adivinhar letra . . . . . . . . . . . . . . �����.� Pontos-chave deste capítulo . . . . . . . . . . . . . . . . . . . . . . . . ���

�� Finalizando nosso jogo �����.� Especi�cando o �m do jogo . . . . . . . . . . . . . . . . . . . . . . . . �����.� Jogador vence o jogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . �����.� Jogador perde o jogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . �����.� Próximos passos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���

Bibliogra�a ���Versão: ��.�.��

xiv