Jest to w dużej mierze kwestia gustu, a większość narzędzi testujących wartych ich soli obsługuje oba. Osobiście wolę RSpec od Test :: Unit, ponieważ a) wyniki i układ testów koncentrują się na tym, co powinien zrobić testowany obiekt (w przeciwieństwie do kodu) oraz b) mówiąc „X powinien Y” ma dla mnie więcej sensu niż „twierdzenie, że X predykat Y”.
Aby dać ci kontekst dla powyższych punktów, oto (całkiem dobrze wymyślone) porównanie kodu wyjściowego / źródłowego dwóch funkcjonalnie równoważnych testów jednostkowych, jednego napisanego przy użyciu RSpec i drugiego przy użyciu Test :: Unit.
Testowany kod
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 :: Jednostka
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 :: Wyjście jednostkowe (tak pełne, jak to tylko możliwe)
Ξ 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.
Wyjście RSpec (formatator dokumentacji)
Ξ 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 Myślę, że Berin (poprzedni respondent) łączy role Ogórka (który wyrósł z projektu RSpec, ale jest niezależny) i RSpec. Ogórek to narzędzie do automatycznego testowania akceptacji w stylu BDD, podczas gdy RSpec to biblioteka kodów do testowania, która może być używana na poziomie jednostki, integracji i funkcjonalności. Dlatego użycie RSpec nie wyklucza testów jednostkowych - po prostu nazywamy je „specyfikacjami” testów jednostkowych.