Forum: Ruby Test::Unit: setup per TestCase class or per suite

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Michael S. (Guest)
on 2007-02-26 20:02
(Received via mailing list)
For a performance test I need to populate the database with a large
number of records. The individual test cases only read the database
contents. It is rather time consuming and, after all, unnecessary to do
a full setup and teardown for each test case. I'd much prefer a clean
way to do setup and teardown once for the entire TestCase subclass.
AFAIR, in JUnit, there is a decorator for just this purpose. Is there
something similar for Test::Unit?

Michael
Robert D. (Guest)
on 2007-02-26 20:11
(Received via mailing list)
On 2/26/07, Michael S. <removed_email_address@domain.invalid> wrote:
>
> --
> Michael S.
> mailto:removed_email_address@domain.invalid
> http://www.schuerig.de/michael/
>
>
I always use constants for that kind of problems.
For what you hide behind the constants is of course a matter of taste
sometimes I do something like the following, but that is just like me.

class << DatabaseProxy = Class.new
   <init code>
    def whatever...
    end
    def play_it_again_sam
    end
    def etcetc
end

class X < Test::Unit::TestCase

   def testxxx...
         DatabaseProxy.whatever

...
end

HTH
Robert
Farrel L. (Guest)
on 2007-02-26 20:11
(Received via mailing list)
On 26/02/07, Michael S. <removed_email_address@domain.invalid> wrote:
>
> --
> Michael S.
> mailto:removed_email_address@domain.invalid
> http://www.schuerig.de/michael/
>
>

You should be able to put the data you need initialised only once in
the initialize method. I think.

Farrel
Michael S. (Guest)
on 2007-02-26 21:13
(Received via mailing list)
On Monday 26 February 2007, Farrel L. wrote:
> On 26/02/07, Michael S. <removed_email_address@domain.invalid> wrote:
> > For a performance test I need to populate the database with a large
> > number of records. The individual test cases only read the database
> > contents. It is rather time consuming and, after all, unnecessary
> > to do a full setup and teardown for each test case.

> You should be able to put the data you need initialised only once in
> the initialize method. I think.

I don't think so. When I have

class MyPerformanceTest < Test::Unit::TestCase
  def initialize
    ...
  end

  def test_something
    ...
  end

  def test_something_else
    ...
  end
 ...
end

for each of the individual test methods a fresh instance of
MyPerformanceTest is created and initialized.

Michael
Michael S. (Guest)
on 2007-02-26 21:21
(Received via mailing list)
On Monday 26 February 2007, Robert D. wrote:
> On 2/26/07, Michael S. <removed_email_address@domain.invalid> wrote:
> > For a performance test I need to populate the database with a large
> > number of records. The individual test cases only read the database
> > contents. It is rather time consuming and, after all, unnecessary
> > to do a full setup and teardown for each test case. I'd much prefer
> > a clean way to do setup and teardown once for the entire TestCase
> > subclass. AFAIR, in JUnit, there is a decorator for just this
> > purpose. Is there something similar for Test::Unit?

>     end
>     def etcetc
> end
>
> class X < Test::Unit::TestCase
>
>    def testxxx...
>          DatabaseProxy.whatever
>
> ...
> end

You've lost me there. I don't understand how this is supposed to work,
in particular, how it achieves my aim of setting up and tearing down
the database only once per suite.

Are you using the initialization of the constant to set up the database?
I'm not sure that this approach plays nicely with multiple test suites
run by rake.

Michael
Brian C. (Guest)
on 2007-02-26 22:14
(Received via mailing list)
On Tue, Feb 27, 2007 at 03:02:06AM +0900, Michael S. wrote:
> For a performance test I need to populate the database with a large
> number of records. The individual test cases only read the database
> contents. It is rather time consuming and, after all, unnecessary to do
> a full setup and teardown for each test case. I'd much prefer a clean
> way to do setup and teardown once for the entire TestCase subclass.

Options I can think of:

1. Use a class variable - or even a global variable - to record when the
setup has been done, so it only gets done once.

2. Write all your tests which depend on this database as a single test.
You
can always call out to other methods if you like.

  def test_everything
    init_database
    do_1
    do_2
    ... etc
  end
Robert D. (Guest)
on 2007-02-26 22:41
(Received via mailing list)
On 2/26/07, Michael S. <removed_email_address@domain.invalid> wrote:
> > I always use constants for that kind of problems.
> >     def etcetc
> You've lost me there. I don't understand how this is supposed to work,
> in particular, how it achieves my aim of setting up and tearing down
> the database only once per suite.
>
> Are you using the initialization of the constant to set up the database?
> I'm not sure that this approach plays nicely with multiple test suites
> run by rake.
>
I was trying to impress the girls ;)

X = File.readlines("/etc/passwd")
class Test...

   def test
      X is here for you all the time

end

Is this better?

Cheers
Robert
This topic is locked and can not be replied to.