Iniciando com Ruby e Rspec

Iniciando com Ruby e Rspec

Olá pessoal. Daremos continuidade hoje na nossa série sobre testes com um post que te ajudará a iniciar com testes em aplicações ruby utilizando o rspec. Caso não tenha visto a primeira parte dessa série, antes de ler esse post seria legal você lê-lo para entender por que testar é importante.

O rspec é uma gem (library ou biblioteca) entre os mais populares frameworks para a realização de testes automatizados em ruby. Diferente de outras abordagens de teste, o rspec foca em testar comportamentos específicos ao invés de testar somente métodos, ou seja, utiliza a abordagem BDD ou Behaviour Driven Development, em tradução literal, desenvolvimento guiado a comportamentos.

Como o nome já diz, ao utilizar o BDD nos preocupamos como nossas classes se comportam e interagem com o nosso negócio, dando assim um match perfeito com a escrita de estórias de usuário, dando mais foco em como a aplicação se comporta do que em como ela deveria funcionar. Vale lembrar também que por ser uma gem que utiliza esse conceito, nada nos impede de também utilizar o TDD (Test Driven Development) para guiar o desenvolvimento.

 

Primeiro passo: Configurando o Rspec

Crie um arquivo com o nome Gemfile e adicione o seguinte conteúdo

 


#Gemfile


source 'https://rubygems.org'


gem 'rspec'

Em seguida, vamos instalar o Bundler o gerenciador de gems do ruby

instalando bundle

 

Pronto, agora apenas execute o bundler com o seguinte comando para que a gem do rspec seja instalada:

instalando gems

 

Feito isso, podemos inicializar o rspec da seguinte forma:

rspec init

Após o comando, foram gerados dois arquivos, o .rspec (arquivo oculto) e o spec/spec_helper.rb. O primeiro arquivo nos permite setar algumas opções interessantes. No momento, usaremos as seguintes opções:

  • –color: Habilita cores no resultado do teste
  • –require spec_helper: Dá o require no arquivo spec_helper automaticamente em seus arquivos de teste.

 

Ficando assim dessa forma:

# arquivo .rspec

--color
--require spec_helper

 

Para verificar que tudo está de acordo, execute em seu terminal o comando rspec e você verá o resultado parecido com a imagem:

executando rspec

 

Agora estamos prontos para criar nosso primeiro teste.

 

O Algoritmo de Fibonacci

Fibonacci é uma sequência numérica que começa por 0 ou em alguns casos por 1, onde cada termo da série corresponde a soma dos dois números anteriores. Sendo assim, a sequência de fibonacci é:

1,  1,  2,  3,  5,  8,  13,  21,  34,  55,  89,  144 …

 

Assim, seguindo o TDD criaremos primeiro nosso teste para em seguida criarmos nossa Classe que calcula o número de Fibonacci para qualquer inteiro n. Assim, o que esperamos da nossa classe é que:

Fib(5) = 5,  Fib(6) = 8,  Fib(7) = 13, …

 

Para iniciarmos, crie um arquivo chamado fibonacci_spec.rb. Aqui vale uma observação: Todos nossos testes terão a terminação “_spec.rb”. Assim, dado um nome_do_arquivo.rb seu teste sempre será nome_do_arquivo_spec.rb, seguindo também a mesma hierarquia de pastas. Ex: arquivo: /lib/calculadora.rb e teste: /spec/lib/calculadora_spec.rb

Sendo assim, criaremos o arquivo com a seguinte estrutura:

 

#arquivo /spec/fibonacci_spec.rb

describe Fibonacci do
  # teste
end

 

Todo teste começa com a keyword describe. Ela agrupa nossos testes e informa qual classe está sendo testada. No rspec temos uma série de keywords com funcionalidades diferentes, mas vamos aprendendo mais sobre elas à medida que forem aparecendo.

Vamos executar nossos testes chamando no terminal novamente o comando rspec:

falha_rspec_constante_nao_inicializada

 

Perceba que já obtivemos um erro por que a constante Fibonacci não existe. Isso indica que não existe nenhuma classe que tenha definido essa constante. Sendo assim, vamos agora criar nosso arquivo fibonacci.rb.

# arquivo fibonacci.rb

class Fibonacci
  #codigo
end

Também precisamos carregar esse arquivo em nosso teste. Mais tarde veremos como evitar ter que carregar todos esses arquivos, mas por hora altere o arquivo spec/fibonacci_spec.rb  adicionando o seguinte conteúdo para a nossa classe:

#arquivo /spec/fibonacci_spec.rb 

require './fibonacci.rb'

describe Fibonacci do 
  # teste 
end 

Agora podemos novamente executar o rspec e observar que nenhum erro acontece, mas também nada ainda para ser testado

rspec_nada_pra_testar

 

Sendo assim, vamos criar nosso primeiro teste para nossa classe. Normalmente, uma boa prática quando se cria testes é separar o seu teste em 3 partes: setup, exercise verify. No setup realizamos toda a configuração necessária para que nosso teste execute, cria-se objetos, seta valores, etc. Já no exercise, chamamos o método que estamos testando para obter seu valor. Por fim, no verify como o nome já diz, verificamos se o valor retornado era o valor que esperamos.  

require './fibonacci.rb'

describe Fibonacci do
  it "calculates the fibonacci of a number" do
    # setup
    fibonacci = Fibonacci.new
 
    # exercise
    result = fibonacci.calculate(7)

    # verify
    expect(result).to eq(13)
  end
end

Perceba, que agora possuímos uma nova keyword, o it. O it  define um exemplo que será executado, ou seja, basicamente um caso de teste. É normal para cada caso de teste termos um it para definí-lo. Já o expect é a palavra que usamos para definir o que esperamos como retorno do trecho de código executado. Existem muitas formas de verificar os mais variados tipos de retorno, ou até mesmo comportamentos. Veremos com mais detalhes nas outras postagens, mas caso já deseje ir estudando, aqui você pode encontrar ajuda.

Outro detalhe é que não necessariamente precisaríamos de deixar explícito a chamada de nosso método, poderíamos nesse caso chamá-lo diretamente dentro do nosso expect, porém deixamos separado aqui para ficar claro cada uma das 3 partes do teste.

Vamos novamente executar nosso teste.

rspec_metodo_calculate_nao_encontrado

 

Perceba que novamente o rspec nos retornou um erro. Dessa vez que não existe o método calculate em nossa classe, mas o que já era esperado já que estamos seguindo o TDD. Vamos então implementá-lo:

#arquivo fibonacci.rb

class Fibonacci
  def calculate(number)
    # codigo
  end
end

 

Agora vamos novamente executar nosso teste:

rspec_error_nil_value

 

Opa, outro erro. Mas não desanime, é normal irmos indo passo-a-passo, ou os famosos baby steps. Dessa forma, nosso código vai nos dando feedbacks e nos auxiliando na construção de nossa classe, o que é uma grande vantagem do TDD.

Agora temos um erro nos informando, que esperávamos para o Fatorial de 7 o valor 13, mas recebemos nil, já que nosso método ainda não possui seu código implementado. Então por fim vamos implementar a lógica de nosso método:

#arquivo fibonacci.rb

class Fibonacci
  def calculate(number)
    if number == 1 || number == 2
      1
    else
      calculate(number - 1) + calculate(number - 2)
    end
  end
end

Agora, ao executar novamente nosso teste, veremos que ele funciona perfeitamente!

rspec_sucesso

 

Assim encerramos nosso primeiro post sobre como usar o rspec para criar testes unitários para nossas aplicações e ainda por cima agora você também já pode dizer entender como TDD funciona. Viu que legal? 🙂

Fizemos um exemplo bem simples, mas que fosse didático para que você possa conseguir iniciar no mundo dos testes e TDD. Na semana que vem veremos alguns exemplos mais próximos da realidade, aprendendo a como criar um teste para um modelo em uma aplicação Rails!

 

Recomendo para os interessados ler a documentação do rspec que por sinal é bem completa. Lá você terá mais noção de o quão poderosa é essa ferramenta.

Espero que tenham gostado da postagem de hoje. 

Algumas fontes utilizadas nesse post:

Sobre nós

Vivemos em uma era onde a tecnologia se faz presente em todo setor corporativo, independente do ramo de atividade. Surgimos visando esta crescente demanda.

Nossos contatos

+55 (11) 2528 7798
+55 (11) 98081 4290