
Exemple : écrire un test pour une méthode `add(a, b)`
Apprenez à écrire votre premier test RSpec avec un exemple concret. Ce guide pas à pas vous montre comment tester une méthode `add(a, b)` en Ruby, en utilisant la structure `describe/it/expect`.
Etape 1 : Le code que nous allons tester
Pour notre premier test, nous avons besoin d'un sujet : un morceau de code de production. Restons simples et créons une classe `Calculator` avec une seule méthode, `add`. C'est un exemple parfait car son comportement est prévisible et facile à vérifier.
Créez un nouveau fichier nommé `calculator.rb` à la racine de votre projet avec le contenu suivant :
# calculator.rb
class Calculator
def add(a, b)
a + b
end
endC'est ce code simple que nous allons maintenant couvrir avec un test automatisé pour garantir qu'il fonctionne comme attendu.
Etape 2 : Créer le fichier de test correspondant
RSpec suit une convention de nommage claire : un fichier de test doit porter le même nom que le fichier qu'il teste, suivi de `_spec.rb`. Il doit être placé dans le répertoire `spec` que nous avons initialisé précédemment.
Par conséquent, créons le fichier `spec/calculator_spec.rb`. C'est dans ce fichier que nous allons décrire le comportement attendu de notre classe `Calculator`.
Etape 3 : Rédiger le test avec la syntaxe RSpec
Ouvrez `spec/calculator_spec.rb` et ajoutons le contenu suivant. Nous allons le décomposer ligne par ligne juste après.
# spec/calculator_spec.rb
require_relative '../calculator'
describe Calculator do
it 'correctly adds two positive numbers' do
calculator = Calculator.new
result = calculator.add(2, 3)
expect(result).to eq(5)
end
endDécortiquons cette structure :
- `require_relative '../calculator'` : C'est la première ligne cruciale. Elle indique à notre fichier de test de charger le code de `calculator.rb`. Sans cela, le test ne connaîtrait pas l'existence de la classe `Calculator` et échouerait.
- `describe Calculator do ... end` : Ce bloc déclare que nous sommes en train de décrire le comportement de la classe `Calculator`. C'est le conteneur principal pour tous les tests liés à cette classe.
- `it 'correctly adds two positive numbers' do ... end` : Ce bloc définit un exemple (example) ou un cas de test spécifique. La chaîne de caractères est une description lisible de ce que le test vérifie. Elle devrait se lire comme une phrase en anglais.
- `calculator = Calculator.new` : Nous créons une instance de la classe que nous voulons tester. C'est la phase de préparation (Arrange).
- `result = calculator.add(2, 3)` : Nous exécutons la méthode que nous testons avec des arguments spécifiques. C'est la phase d'action (Act).
- `expect(result).to eq(5)` : C'est le coeur du test, l'assertion (Assert). Nous disons à RSpec : "Nous nous attendons (expect) à ce que la variable `result` soit égale (to eq) à 5". Si cette condition est vraie, le test passe. Sinon, il échoue.
Etape 4 : Lancer le test et célébrer le succès
Maintenant que notre code et notre test sont en place, retournons dans le terminal et lançons la suite de tests.
bundle exec rspecSi tout est correct, vous devriez voir une sortie verte et rassurante :
.
Finished in 0.00... seconds (files took 0.1... seconds to load)
1 example, 0 failuresLe point vert (`.`) signifie qu'un test a été exécuté avec succès. Le résumé "1 example, 0 failures" confirme que notre test est passé. Félicitations, vous venez d'écrire et de réussir votre premier test automatisé !
Anticiper l'échec : que se passe-t-il si le code est faux ?
La vraie valeur d'un test se révèle quand il échoue. Modifions temporairement notre méthode `add` dans `calculator.rb` pour qu'elle soit incorrecte :
# calculator.rb (avec un bug intentionnel)
class Calculator
def add(a, b)
a - b # Oups, une soustraction au lieu d'une addition
end
endRelançons maintenant `bundle exec rspec`. Cette fois, la sortie est rouge et beaucoup plus détaillée :
F
Failures:
1) Calculator correctly adds two positive numbers
Failure/Error: expect(result).to eq(5)
expected: 5
got: -1
(Compared using ==)
# ./spec/calculator_spec.rb:7:in `block (2 levels) in <top (required)>`
Finished in ... seconds
1 example, 1 failureCe rapport d'échec est extrêmement précieux. Il nous dit exactement quel test a échoué (`Calculator correctly adds two positive numbers`), pourquoi il a échoué (`expected: 5`, `got: -1`), et où se trouve l'assertion qui a échoué (`spec/calculator_spec.rb:7`). C'est ce filet de sécurité qui nous permet de détecter les régressions instantanément.