passing data to tests with test/unit

M

Matt Berney

I have a test case, based on the Test::Unit::TestCase. How does one pass
data to the test in such a way that the test can be run multiple times
with different input.

For example:

class TC_CreateOrder < Test::Unit::TestCase
def test_NewOrder
assert "order successful"
end
end

Now, I want to be able to generate a new order for various order types,
(TYPE1, TYPE2, TYPE3, etc.)

class TS_OrderTests
def self.suite
suite = Test::Unit::TestSuite.new
suite << TC_CreateOrder.suite # TYPE1 goes here
suite << TC_CreateOrder.suite # TYPE2 goes here
suite << TC_CreateOrder.suite # TYPE3 goes here
return suite
end
end

Test::Unit::UI::Console::TestRunner.run(TS_OrderTests)

Thanks in advance.
 
B

Brian Candler

I have a test case, based on the Test::Unit::TestCase. How does one pass
data to the test in such a way that the test can be run multiple times
with different input.

For example:

class TC_CreateOrder < Test::Unit::TestCase
def test_NewOrder
assert "order successful"
end
end

Now, I want to be able to generate a new order for various order types,
(TYPE1, TYPE2, TYPE3, etc.)

class TS_OrderTests
def self.suite
suite = Test::Unit::TestSuite.new
suite << TC_CreateOrder.suite # TYPE1 goes here
suite << TC_CreateOrder.suite # TYPE2 goes here
suite << TC_CreateOrder.suite # TYPE3 goes here
return suite
end
end

Test::Unit::UI::Console::TestRunner.run(TS_OrderTests)

If it's only one test method, you can factor it out in the class:

class TC_CreateOrder < Test::Unit::TestCase
def do_test(t)
.. process t
end

def test_type1
do_test(TYPE1)
end

def test_type2
do_test(TYPE2)
end

def test_type3
do_test(TYPE3)
end
end

Otherwise, how about:

class TC_CreateOrder1 < TC_CreateOrder
FIXTURE = TYPE1
end

class TC_CreateOrder2 < TC_CreateOrder
FIXTURE = TYPE2
end

class TC_CreateOrder3 < TC_CreateOrder
FIXTURE = TYPE3
end

(I'm not sure how you'd prevent the base test TC_CreateOrder being run)

Regards,

Brian.
 
M

Matt Berney

Thanks Brian,

This would work ok if there was only one test method and only 3 types.
Now let's say that I want to use this test technique multiple times,
with multiple test methods. And, the data input is over 100 items.
Duplicating this structure 100 times doesn't seem tenable.

What I am really looking for is a data-driven test method, such that I
can use the same test case and pass it different data. However, for
test execution and measurement purposes, it is preferable to record
these as separate tests.
 
A

ara.t.howard

Thanks Brian,

This would work ok if there was only one test method and only 3 types.
Now let's say that I want to use this test technique multiple times,
with multiple test methods. And, the data input is over 100 items.
Duplicating this structure 100 times doesn't seem tenable.

What I am really looking for is a data-driven test method, such that I
can use the same test case and pass it different data. However, for
test execution and measurement purposes, it is preferable to record
these as separate tests.


def setup
TEST_DATA = YAML.load(IO.read(ENV['TEST_DATA'])) # TEST_DATA is a filename for
# yaml data
end

TEST_DATA=a.yml ruby test/a.rb

-a
 
B

Brian Candler

This would work ok if there was only one test method and only 3 types.
Now let's say that I want to use this test technique multiple times,
with multiple test methods. And, the data input is over 100 items.
Duplicating this structure 100 times doesn't seem tenable. ...

But this was just an example; if this works then you can do it dynamically.

How about something like:

$test_classes = []

fixtures = [TYPE1, TYPE2, TYPE3]
fixtures.each do |f|
klass = Class.new(TC_CreateOrder)
klass.const_set:)FIXTURE, f)
$test_classes << klass # to prevent garbage collection
end
 
M

Matt Berney

Thanks to everyone who posted responses. Through a combination of your
feedback and experimentation, here is the solution I came up with:

class TC_CreateOrder < Test::Unit::TestCase
def test_NewOrder
orderTypeList = File.open('orders.yaml') { |yf| YAML::load(yf) }
orderTypeList.each { |type|
# perform the test
assert "order successful"
@_result.add_run
end
end


The trick was the last line "@_result.add_run". By adding this line,
each time through the loop increments the test count such that each
order is a separate test case.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,535
Members
45,007
Latest member
obedient dusk

Latest Threads

Top