Qual é a diferença entre RSpec e Cucumber? [fechadas]

114

Tenho 6 meses de experiência em desenvolvimento Rails. Eu construí um aplicativo da web que está em uso agora com autenticação e autorização e banco de dados postgresql.

Estou passando para meu segundo aplicativo Rails, mas desta vez, depois das lições aprendidas, gostaria de desenvolvê-lo usando TDD, pois percebi que é muito mais fácil escalá-lo e corrigir bugs. É lento para se desenvolver, mas no longo prazo é muito mais fácil de lidar.

Já ouvi falar de Rspec e Cucumber, mas estou completamente confuso com eles.

Gostaria de saber qual é a diferença entre RSpec e Cucumber e para que são utilizados.

Também seria útil saber se, da perspectiva de um iniciante (que também é o único desenvolvedor), uma estrutura de teste é realmente necessária.

banditKing
fonte
6
Para te confundir ainda mais, o Minitest também pode ser uma opção
lucas clemente
5
Capybara é realmente um driver que pode ser usado em qualquer um dos frameworks de teste, não um framework em si. Watir-webdriver e Selenium são duas coisas que têm funções semelhantes, mas dirigem um navegador real e são muito mais lentos do que Capivara dirigindo Rack :: Test
DVG
37
Como isso não é construtivo ???
Jason Swett
19
Ótima pergunta e ótima resposta. É exatamente o que eu precisava. Estou perplexo com o encerramento da questão como não construtivo. Quem se importa se isso vai solicitar um debate? É para isso que serve a votação da comunidade.
dpurrington
14
Votando para reabrir porque eu acho que a base para encerrar a questão é enganosa. Definitivamente pode ser (e tem sido!) Respondida usando "apoiado por fatos, referências ou experiência", e qualquer questão StackOverflow possivelmente "provavelmente solicitará debate, argumentos, pesquisa" (que todos nós conhecemos e vimos). Quanto à "votação"? O modus operandi do SO é sobre votos positivos e negativos de perguntas e respostas. É basicamente uma grande enquete. Fechar isso foi idiota. É uma boa ajuda sobre questões e respostas de tópicos .
Adam Cameron

Respostas:

323

RSpec e Cucumber são ambos frameworks de teste. RSpec inclui o Teste de Unidade tradicional (o que significa testar uma classe ou parte do aplicativo isoladamente do resto do aplicativo. Portanto, seu modelo faz o que seu modelo deve fazer, o controlador faz o que deve fazer, etc).

RSpec e Cucumber são usados ​​para Teste de Aceitação (que é chamado ATDD, BDD, Especificação por Exemplo, etc. dependendo de quem você perguntar). Estes são testes de integração orientados para o caso de negócios, o que significa que eles simulam a maneira como um usuário usa o aplicativo e usa a pilha Rails completa, de forma que problemas com a maneira como as diferentes partes de seu aplicativo funcionam juntas podem ser encontrados de uma forma que os testes de unidade não encontrar.

A principal diferença entre RSpec e Cucumber é o fator de legibilidade do negócio. O principal atrativo do Cucumber é que a especificação (recursos) são separados do código de teste, de modo que os proprietários do produto podem fornecer ou revisar a especificação sem ter que vasculhar o código. Estes são os arquivos .feature que você cria no Cucumber. RSpec tem um mecanismo semelhante, mas em vez disso, você descreve uma etapa com um bloco Descrever, Contexto ou It que contém a especificação de negócios e, em seguida, imediatamente tem o código que executa essa instrução. Essa abordagem é um pouco mais fácil para os desenvolvedores trabalharem, mas um pouco mais difícil para pessoas não técnicas.

Qual usar? Se você for o único desenvolvedor e proprietário do produto, eu ficaria com RSpec, acho que é mais fácil para um técnico entender, oferece algumas vantagens em manter as coisas com escopo definido e sob controle e mantê-lo fora de confusão com RegExs para teste passos. Se você estiver construindo isso para um cliente, e ele for prático em relação à Especificação, vá com Cucumber para seu Teste de Aceitação e use RSpec para Testes de Unidade.

Apenas para demonstrar a principal diferença entre os dois:

Pepino:

#articles.feature
Given an article exists called "Testing Demonstration"
When I visit the list of articles
Then I should see an article called "Testing Demonstration"

#article_steps.rb
Given /^an article exists called "(.+)"$/ do |title|
  FactoryGirl.create(:article, title: title)
end 
When /^I visit the list of articles$/ do
  visit articles_path
end
Then /^I should see an article called "(.+)"$/ do |title|
  page.should have_content title
end

Rspec

describe "Articles" do
  let(:article) { FactoryGirl.create(:article) }
  context "Index Page" do
    before { visit articles_path }
    it { page.should have_content article.title }
  end
end

Esta série de blog é excelente para começar a usar o RSpec.

DVG
fonte
24
Esta é uma excelente resposta. Muito obrigado pelo seu tempo e conselhos. Há muitos livros sobre trilhos que eu li, mas até agora não encontrei nenhum que faça esse tipo de distinção e explique qual é qual. Obrigado novamente
banditKing 01 de
2
Eu não poderia recomendar essa resposta menos para quem precisa. Obrigado pelos detalhes!
Ikon
3
Esta é de fato uma das respostas mais abrangentes e fáceis de entender sobre stackoverflow (completa com um ótimo exemplo!)
Sheharyar