Acceptans-tester med SeleniumOchRails.
För att skriva tester med Ruby kan du subklassa Test::Unit::TestCase.
require "test/unit"
# This is the file I want tested
require "age"
# Test-case for our Age class
class Testage < Test::Unit::TestCase
# Testing the old_enough method
def test_age_tester
@age = Age.new
assert_instance_of(Age, @age);
assert( @age.old_enough(1931), "1931 is alright" );
assert( @age.old_enough(1970), "1970 is alright" );
assert( [email protected]_enough(1971), "1971 is too young." );
end
end
Som du ser är det helt vanlig xUnit-format på assertsen, och det är inte speciellt Ruby-artat egentligen. Varje testmetod måste heta något med test_. Annars körs de inte.
De speciella metoderna setup körs före alla enskilda test_-metoder, teardown efter.
require "test/unit"
require "age"
class Testage < Test::Unit::TestCase
def setup
@age = Age.new
assert_instance_of(Age, @age);
end
# Testing the old_enough method
def test_age_tester
assert( @age.old_enough(1931), "1931 is alright" );
assert( @age.old_enough(1970), "1970 is alright" );
assert( [email protected]_enough(1971), "1971 is too young." );
end
end
Nu har vi bäddat för att fler tester kan skrivas för de andra metoderna i Age, utan att vi upprepar oss. Test::Units dokumentation berättar resten.
Om vi kommer på att vi ska ha en extra assertion kan vi skapa den runtime, för alla klasser står på vid gavel (som alltid i Ruby):
# Open the Test module (look at the class we were subclassing earlier!)
module Test
# "Unit" is the middle part of the name we used
module Unit
# TestCase is a class
class TestCase
# Adding a new, important assertion
def assert_funny
puts "It aint."
end
end
end
end
OK, på det sättet kan man lasta in det syntaktiska socker man känner att ens tester behöver. Lägg in ovanstående tillägg i en egen fil, kalla den kanske myasserts.rb, och require:a in den efter test/unit.
Dave Astels beskriver BDD, Behaviour-driven development, som är ett buzzword som betyder “test-driven development done right”, i en video hos Google. I den videon visar han RSpec, “Behaviour Specification Framework for Ruby”.
http://rspec.rubyforge.org/
http://www.onlinecnaclass.com/
Hämta RSpec som gem:
sudo gem install rspec
Ovanstående test-case kunde se ut såhär som specifikation:
require "age"
require "rubygems"
require_gem "rspec"
age = Age.new
age.old_enough(1931).should.be false;
Rake-tasksen som Rails bidrar med är otroliga: alla test-case som ligger i din applikations testkataloger kommer att köras när du kör rake.
Ryan Davis aka Zenspider, har skrivit ZenTest.
ZenTest tittar på existerande kod, och letar efter tester, och om den inte hittar några tester så skapar den dem för Test::Unit. Små stumpar av kod som:
def test_statement
raise NotImplementedError, 'Need to write test_statement'
end
Artikeln How to Use ZenTest with Ruby berättar vad ZenTest är, och varför det är bra. (Den som läst Fowlers Refactoring kan nicka igenkännande.)
Artikeln Why and how: Ruby and Rails testing
Test Driven Development with Ruby – av Peter Marklund, ger en översikt över testning i Ruby och Ruby on Rails