Forum: Ruby Putting unit test cases in the code - RDoc & UnitTest

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.
Ccfe7d097475a32dc3ff78d6fc42c852?d=identicon&s=25 listrecv (Guest)
on 2005-11-14 16:35
(Received via mailing list)
Hi.  I find that the best place to put unit test cases is in the file
for the class being tested itself.  This puts everything in the same
place, and also makes examples readily available for someone trying to
understand the code.

Question 1: Can I do this without having Test::Unit automatically run
the tests, every time the file is require 'd?

Question 2: How can I do this so that RDoc shows the examples in the
generated documentation?
B5e329ffa0cc78efbfc7ae2d084c149f?d=identicon&s=25 dbalmain.ml (Guest)
on 2005-11-14 17:05
(Received via mailing list)
How about just something like that at the end of your file;

if ENV["RUN_TESTS"]
  require 'test/unit'
  class MyTest < Test::Unit::TestCase
    #your tests
  end
end


Cheers,
Dave
1fba4539b6cafe2e60a2916fa184fc2f?d=identicon&s=25 dblack (Guest)
on 2005-11-14 17:08
(Received via mailing list)
Hi --

On Tue, 15 Nov 2005, listrecv@gmail.com wrote:

> Hi.  I find that the best place to put unit test cases is in the file
> for the class being tested itself.  This puts everything in the same
> place, and also makes examples readily available for someone trying to
> understand the code.
>
> Question 1: Can I do this without having Test::Unit automatically run
> the tests, every time the file is require 'd?

You can put this at the end of the file:

if $0 == __FILE__
   # test code here
end

and then that code will only run if that exact file has been invoked.


David
Ccfe7d097475a32dc3ff78d6fc42c852?d=identicon&s=25 listrecv (Guest)
on 2005-11-14 17:14
(Received via mailing list)
David,

That's a great idea.  The only problem is that, let's say FileA and
FileB both require  FileC.  We'd like to run the unit tests for each
file separately, and certainly not more than once.  With your code,
they'll get run recursively, each time they're required.

But maybe I could add
if ENV["RUN_TESTS"} && $0 == __FILE__ ?

Would that do it?  And I guess then RDoc would see the class and doc it
(it'll ignore the if statement wrapping it, I assume).
1fba4539b6cafe2e60a2916fa184fc2f?d=identicon&s=25 dblack (Guest)
on 2005-11-14 17:20
(Received via mailing list)
Hi --

On Tue, 15 Nov 2005, listrecv@gmail.com wrote:

> David,
>
> That's a great idea.  The only problem is that, let's say FileA and
> FileB both require  FileC.  We'd like to run the unit tests for each
> file separately, and certainly not more than once.  With your code,
> they'll get run recursively, each time they're required.

They shouldn't run at all from any require'd file, because the $0 ==
__FILE__ test won't pass in that file.

> But maybe I could add
> if ENV["RUN_TESTS"} && $0 == __FILE__ ?
>
> Would that do it?  And I guess then RDoc would see the class and doc it
> (it'll ignore the if statement wrapping it, I assume).

If it gets that complex you might want to use Rake and set up a test
target.  That might be more scaleable.


David
45196398e9685000d195ec626d477f0e?d=identicon&s=25 transfire (Guest)
on 2005-11-14 18:35
(Received via mailing list)
With Facets I use a remark:

  =begin test
    require 'text/unit'
    class ATest << Test::Unit::TestCase
      ...
    end
  =end

when I want to run the test I remark the remarks:

  #=begin test
     ...
  #=end

That works good for dev testing.

Later when I want to run the enite testsuite I use a Reap task (see
Rubyforge) that extracts and copies the remarked tests to the test
directory.

T.
58479f76374a3ba3c69b9804163f39f4?d=identicon&s=25 drbrain (Guest)
on 2005-11-14 23:05
(Received via mailing list)
On Nov 14, 2005, at 7:32 AM, listrecv@gmail.com wrote:

> Hi.  I find that the best place to put unit test cases is in the file
> for the class being tested itself.  This puts everything in the same
> place, and also makes examples readily available for someone trying to
> understand the code.


So does creating a file per class and placing tests into identically
named files with test_ on the front.

This also makes it easy for testrb to pick up your tests and make
things Just Work?

> Question 1: Can I do this without having Test::Unit automatically run
> the tests, every time the file is require 'd?

You need to not require test/unit.  This is best done by placing
tests in their own files.

> Question 2: How can I do this so that RDoc shows the examples in the
> generated documentation?

Put the tests in their own file and point RDoc at your test files.

Typically I've found examples are best placed in the class and method
documentation because tests can provide an overwhelming amount of
information.
58479f76374a3ba3c69b9804163f39f4?d=identicon&s=25 drbrain (Guest)
on 2005-11-14 23:08
(Received via mailing list)
On Nov 14, 2005, at 9:32 AM, Trans wrote:

>
>   #=begin test
>      ...
>   #=end
>
> That works good for dev testing.
>
> Later when I want to run the enite testsuite I use a Reap task (see
> Rubyforge) that extracts and copies the remarked tests to the test
> directory.

I like to run my tests all the time, and I like source control to run
tests for me when I check in to make sure I didn't forget.  Having to
edit a file to run them is unnecessary extra work.

This extra work does not reinforce good testing discipline.
45196398e9685000d195ec626d477f0e?d=identicon&s=25 transfire (Guest)
on 2005-11-15 04:03
(Received via mailing list)
Eric, you missed the last point. I have a script that exracts all tests
to test_xxx files in test directory, so I have best of both worlds.

T.
58479f76374a3ba3c69b9804163f39f4?d=identicon&s=25 drbrain (Guest)
on 2005-11-15 08:09
(Received via mailing list)
On Nov 14, 2005, at 7:02 PM, Trans wrote:

> Eric, you missed the last point. I have a script that exracts all
> tests
> to test_xxx files in test directory, so I have best of both worlds.

But... I don't need that script, so I will never have to maintain it.
This topic is locked and can not be replied to.