Langages/Ruby/Rails/Tests/RSpec

Un article de Agora2ia.


Sommaire

Présentation

RSpec est un framework Ruby et/ou (???) Rails permettant de créer des tests.

Plus exactement, RSpec se veut un framework de spécifications exécutables.

Il permet le BehaviourDrivenDevelopment

Le but est de pouvoir écrire des tests, en Ruby, mais avec une syntaxe telle que ces tests soient compréhensibles par un non informaticien, tout juste un anglophone ! Le code d'un test RSpec se lit facilement, sans ajouter de commentaires. Les 'statements' sont suffisamment expressifs et clairs.

Les rapports HTML générés sont à la fois compréhensibles (rédigés en langage humain) et succincts (échecs en rouge et succès en vert), avec la portion de code en échec et un pointeur vers le fichier source.

  • Code concis
  • Spécifications aussi claires que possibles
it "should require a zipcode" do
    @weather.zipcode = 11111
    @weather.save
    ...
    @weather.zipcode.should = 11111
end


Le plugin RSpec pour rails

  • Installer
    • RSpec : > gem install rspec
    • Le plugin (RSpec pour rails) dans le projet : > script/plugin install svn://rubyforge.org/var/svn/rspec/tags/CURRENT/rspec_on_rails
  • Installation dans l'arborescence du projet => une installation par projet !


Les rapports

Avec RSpec on peut générer différents rapports selon leur utilisation.

Sauf contre-indication, les lignes de commandes qui suivent doivent être exécutées depuis la racine du projet.

Un très prisé est le rapport HTTML. Depuis une console, on peut exécuter :

  • Pour générer le rapport sur l'ensemble du contenu du répertoire spec :
spec -fh:result.html spec
  • Si vous utilisez conjointement le serveur RSpec, vous pouvez alors ajouter l'option qui indique de se connecter au serveur (--drb) :
spec -fh:result.html --drb spec


Les fixtures

FactoryGirl

  • FactoryGirl (sur Github) : A library for setting up Ruby objects as test data.

Déclaration :

# /spec/factories.rb
FactoryGirl.define do

   factory :user do
      sequence(:name)  { |n| "Person #{n}" }
      sequence(:nick)  { |n| "Nickname #{n}" }
      sequence(:email) { |n| "person_#{n}@example.com"}
      password "foobar"
      password_confirmation "foobar"
      state "verified"
      factory :admin do
         admin true
      end
   end

   factory :company do
      company_name    "Apple"
      company_country "United States"
      company_domain  "my-company.com"
      company_profile "Apple Lorum Ipsum"
   end

   factory :companyrelationship do
      company_id    "1"
      user
    end

end

Utilisation :

# /spec/models/user_spec.rb
describe User do
   let(:user) { FactoryGirl.create(:user) }
   before { @company = Company.new(company_name: "My Company", founder: user.id}

   subject (user)
   it { should respond_to(:name) }
   it { should respond_to(:email) }


RSpec et le Behavior Driven Development

RSpec se veut donc un framework pour faire du BehaviourDrivenDevelopment...

Voir le chapitre TDD et BDD avec Rails...


Outils

  • Autotest : PROJECT_ROOT> autospec (Voir chapitre suivant)
  • RCov
  • spec_server


autotest


notification


Stratégie d'execution : DMA vs. Simulée

DMA (Direct Model Access)

On parcours bien toutes les couches MVC, ce qui a un prix en terme de durée d'execition.


Simulated

Le fait de simuler le navigateur permet d'être bien plus performant.


Ressources