Objectifs
- Comprendre pourquoi les tests automatisés sont essentiels.
- Découvrir RSpec, le framework de test de référence en Ruby.
- Écrire un test unitaire simple en utilisant la syntaxe
describe,context, etit. - Utiliser des “matchers” de base comme
eqpour vérifier les résultats.
Pourquoi tester son code ?
Écrire des tests automatisés est une pratique fondamentale du développement logiciel moderne. Les tests permettent de :
- Garantir la correction : S’assurer que votre code fait bien ce que vous attendez de lui.
- Prévenir les régressions : S’assurer que les nouveaux changements ne cassent pas des fonctionnalités qui marchaient avant.
- Faciliter la refactorisation : Vous pouvez modifier et améliorer votre code en toute confiance, car la suite de tests vous alertera si vous cassez quelque chose.
- Servir de documentation : Les tests décrivent précisément comment votre code est censé se comporter.
RSpec : Tester en langage quasi naturel
RSpec est un framework de test qui s’inscrit dans la mouvance du BDD (Behavior-Driven Development). Il fournit un langage (DSL - Domain Specific Language) qui permet d’écrire des tests qui se lisent presque comme des phrases en anglais, en se concentrant sur le comportement attendu de votre code.
Structure d’un fichier de test RSpec
Par convention, les fichiers de test se terminent par _spec.rb et se placent dans un dossier spec/.
# spec/calculatrice_spec.rb
require_relative '../lib/calculatrice' # On charge le code à tester
# 'describe' ouvre un bloc de tests pour une classe ou une méthode
describe Calculatrice do
# 'context' permet de regrouper des tests dans une situation donnée
context "pour l'addition" do
# 'it' décrit un comportement spécifique que l'on veut tester
it "doit retourner 4 pour l'addition de 2 et 2" do
# 1. Préparation (Setup)
calc = Calculatrice.new
# 2. Exécution (Exercise)
resultat = calc.additionner(2, 2)
# 3. Vérification (Verify) - C'est l'assertion
# On s'attend (expect) à ce que le résultat soit égal (eq) à 4.
expect(resultat).to eq(4)
end
it "doit gérer les nombres négatifs" do
calc = Calculatrice.new
resultat = calc.additionner(-5, 3)
expect(resultat).to eq(-2)
end
end
end
L’assertion : expect(...).to
C’est le cœur du test. On vérifie une attente avec expect et un “matcher”.
expect(valeur).to eq(attendue): Vérifie l’égalité de valeur.expect(valeur).to be_truthy/be_falsey: Vérifie la “truthiness”.expect(valeur).to be_nil: Vérifie que la valeur estnil.expect(tableau).to include(element): Vérifie qu’un tableau contient un élément.expect { ... }.to raise_error(TypeError): Vérifie qu’un bloc de code lève bien une exception.
Mettre en place RSpec
-
Ajouter RSpec au
Gemfile:# Gemfile group :test do gem 'rspec' end -
Installer :
bundle install -
Initialiser RSpec (une seule fois) :
bundle exec rspec --initCette commande crée le dossierspec/et un fichierspec_helper.rb. -
Écrire les tests dans des fichiers
_spec.rbdans le dossierspec/. -
Lancer les tests :
bundle exec rspec
Bonnes pratiques
- Un test, une seule attente. Idéalement, un bloc
itne devrait contenir qu’une seule instructionexpect. - Structure Arrange-Act-Assert (ou Given-When-Then) :
- Arrange : Préparez vos objets et vos données.
- Act : Exécutez la méthode que vous testez.
- Assert : Vérifiez le résultat avec
expect.
- Le nom de votre test (
it "...") doit décrire un comportement. Il doit compléter la phrase “La classe/méthode … devrait …”.
Exercices
-
Mise en place :
- Créez un nouveau projet avec un
Gemfile. - Ajoutez-y
rspecet lancezbundle install, puisbundle exec rspec --init.
- Créez un nouveau projet avec un
-
Créer une classe simple :
- Créez un dossier
lib/et à l’intérieur, un fichiersalutations.rb. - Dans ce fichier, créez une classe
Salutationsavec une méthodemessagequi retourne “Bonjour tout le monde !”.
- Créez un dossier
-
Écrire le test :
- Dans
spec/, créez un fichiersalutations_spec.rb. - Écrivez un test qui :
- Charge le fichier
salutations.rb. - Décrit la classe
Salutations. - Dans un bloc
it, crée une instance de la classe, appelle la méthodemessage, et vérifie que le résultat est bien égal à “Bonjour tout le monde !”.
- Charge le fichier
- Lancez
bundle exec rspecet observez le test passer au vert.
- Dans
-
Faire échouer le test :
- Modifiez le test pour qu’il s’attende à une chaîne différente.
- Relancez
rspecet observez le message d’erreur détaillé que RSpec vous fournit.