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

Post on 28-Mar-2018

223 views 5 download

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

© 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

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

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

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

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

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

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:casadocodigo-tdd-ruby@googlegroups.com.

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

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

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

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

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