Es en gran medida una cuestión de gustos, y la mayoría de las herramientas de prueba que valen su sal son compatibles. Mi preferencia personal es RSpec sobre Test :: Unit porque a) el resultado y el diseño de las pruebas se centran en lo que se supone que debe hacer el objeto bajo prueba (en oposición a lo que es el código) yb) decir 'X debería Y' tiene más sentido para mí que 'afirmar que X predicado Y'.
Para darle un poco de contexto para los puntos anteriores, aquí hay una comparación (bastante artificial) del código de salida / fuente de dos pruebas unitarias funcionalmente equivalentes, una escrita usando RSpec y la otra usando Test :: Unit.
Código bajo prueba
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
Prueba :: Unidad
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
Prueba :: Salida de la unidad (tan llena como podría hacerlo)
Ξ 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.
Salida RSpec (formateador de documentación)
Ξ 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
PD: Creo que Berin (respondedor anterior) está combinando los roles de Cucumber (que surgió del proyecto RSpec pero es independiente) y RSpec. Cucumber es una herramienta para pruebas de aceptación automatizadas en un estilo BDD, mientras que RSpec es una biblioteca de códigos para pruebas que se puede usar y se usa a nivel de unidad, integración y funcional. Por lo tanto, el uso de RSpec no excluye las pruebas unitarias, es solo que usted llama a las especificaciones de sus pruebas unitarias.