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