È in gran parte una questione di gusti, e la maggior parte degli strumenti di test che meritano il loro sale supportano entrambi. La mia preferenza personale è per RSpec su Test :: Unit perché a) l'output e il layout dei test si focalizzano su cosa l'oggetto sotto test dovrebbe fare (a differenza di ciò che è il codice) eb) dicendo "X dovrebbe Y" ha più senso per me che 'asserire che X predicato Y'.
Per darti un po 'di contesto per i punti sopra, ecco un confronto (piuttosto forzato) del codice sorgente / sorgente di due test unitari funzionalmente equivalenti, uno scritto usando RSpec e l'altro usando Test :: Unità.
Codice sotto 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 :: Uscita unità (il più completo possibile)
Ξ 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.
Uscita RSpec (formattatore di documentazione)
Ξ 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
P.S. Penso che Berin (precedente rispondente) stia combinando i ruoli di Cucumber (che è cresciuto fuori dal progetto RSpec ma è indipendente) e RSpec. Cucumber è uno strumento per test di accettazione automatizzati in stile BDD, mentre RSpec è una libreria di codici per il test che può essere, ed è, utilizzata a livello di unità, integrazione e funzionalità. Quindi l'uso di RSpec non preclude il test delle unità: è solo che chiami le specifiche dei tuoi test unitari.