C'est en grande partie une question de goût, et la plupart des outils de test valent leur soutien en sel. Ma préférence personnelle est pour RSpec plutôt que Test :: Unit car a) la sortie et la disposition des tests se concentrent sur ce que l'objet sous test est censé faire (par opposition à ce que le code est) et b) en disant 'X devrait Y' est plus logique pour moi que «d'affirmer que X prédique Y».
Pour vous donner un peu de contexte pour les points ci-dessus, voici une comparaison (assez artificielle) du code de sortie / source de deux tests unitaires fonctionnellement équivalents, l'un écrit en utilisant RSpec et l'autre en utilisant Test :: Unit.
Code sous test
class DeadError < StandardError; end
class Dog
def bark
raise DeadError.new "Can't bark when dead" if @dead
"woof"
end
def die
@dead = true
end
end
Test :: Unité
require 'test/unit'
require 'dog'
class DogTest < Test::Unit::TestCase
def setup
@dog = Dog.new
end
def test_barks
assert_equal "woof", @dog.bark
end
def test_doesnt_bark_when_dead
@dog.die
assert_raises DeadError do
@dog.bark
end
end
end
RSpec
require 'rspec'
require 'dog'
describe Dog do
before(:all) do
@dog = Dog.new
end
context "when alive" do
it "barks" do
@dog.bark.should == "woof"
end
end
context "when dead" do
before do
@dog.die
end
it "raises an error when asked to bark" do
lambda { @dog.bark }.should raise_error(DeadError)
end
end
end
Test :: Sortie unitaire (aussi complète que possible)
Ξ code/examples → ruby dog_test.rb --verbose
Loaded suite dog_test
Started
test_barks(DogTest): .
test_doesnt_bark_when_dead(DogTest): .
Finished in 0.004937 seconds.
Sortie RSpec (formateur de documentation)
Ξ code/examples → rspec -fd dog_spec.rb
Dog
when alive
barks
when dead
raises an error when asked to bark
Finished in 0.00224 seconds
2 examples, 0 failures
2 tests, 2 assertions, 0 failures, 0 errors
PS Je pense que Berin (répondeur précédent) confond les rôles de Cucumber (qui est issu du projet RSpec mais est indépendant) et RSpec. Le concombre est un outil pour les tests d'acceptation automatisés dans un style BDD, tandis que RSpec est une bibliothèque de code pour les tests qui peut être et est utilisée aux niveaux unitaire, d'intégration et fonctionnel. Par conséquent, l'utilisation de RSpec n'empêche pas les tests unitaires - c'est simplement que vous appelez les spécifications de vos tests unitaires.