Acceptans-tester med SeleniumOchRails.

Rubys standardbiblioteks testramverk: Test::Unit

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.

Setup och teardown finns också

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.

Lägga till fler assertions i Test::Unit::TestCase

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.

RSpec: mer semantiskt beskrivande tester

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;

Testa Med RSpec

Rake och Rails

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.

ZenTest: skapar stumpar åt dig

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.)

Läs mer

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

Revised on June 08, 2011 13:38:20 by Anonymous Coward