CSC/ECE 517 Fall 2010/ch1 1f vn
Introduction
Unit testing is a method by which we can isolate and test a unit functionality of the program, typically individual methods during and long after the code is written. Unit testing frameworks provides us with constructs which simplifies the process of unit testing. This chapter walks through three different unit testing frameworks available for Ruby, explains how to use them with examples, and compares them with one another. The three commonly used unit testing frameworks for ruby are
- Test::Unit
- Shoulda
- RSpec
Test::Unit
Ruby comes with an in-built, ready to use unit testing framework called Test::Unit. It is a XUnit type framework and typically have a setup method for initialization, a teardown method for cleanup and the actual test methods itself. The tests themselves are bundled separately from the code it is testing.
Test Fixture
Test fixture represents the initial environment setup(eg. initialization data) and the expected outcome of the tests for that environment. This is typically done in the setup()/teardown() methods and it helps to separate test initialization/cleanup from the actual tests. It also helps to reuse the same fixture for more than one tests.
From example, consider a method prime_check(num) which takes a number as input and outputs whether it is prime number or not. In order to unit test this method we will be needing the following fixture containing a 2-dimensional array with a number and the expected output of whether it is prime or not.
def setup @NUMBERS = [[3,true], [4,false], [7,true], [10,false]] end
Assertions
The core part of test::unit framework is the ability to assert a statement of expected outcome. If an assert statement is correct then the test will proceed, otherwise the test will fail. Test::unit provides a bunch of assert methods for this purpose like:
assert( boolean, [message] ) | True if boolean |
assert_equal( expected, actual, [message] ) assert_not_equal( expected, actual, [message] ) |
True if expected == actual |
assert_raise( Exception,... ) {block} assert_nothing_raised( Exception,...) {block} |
True if the block raises (or doesn't) one of the listed exceptions. |
For the full list of assertion methods provided by test::unit refer to test::unit assertions
Example
The test case class extends the Test::Unit::TestCase class. The test methods should start with 'test' prefix. This helps in isolating the test methods from the helper methods.
require 'test/unit'
class BinarySearch < Test::Unit::TestCase
def setup @input_array = [1,2,3,4,5] end def test_success_left_half assert_equal(binary_search(@input_array,1),true) end def test_success_right_half assert_equal(binary_search(@input_array,5),true) end def test_success_middle assert_equal(binary_search(@input_array,3),true) end def test_failure assert_equal(binary_search(@input_array,6),false) end def teardown #nothing to do here end
end
Test Suite
Shoulda
Shoulda is not a testing framework by itself. It extends the Test::Unit framework with the idea of matchers, helpers and assertions