Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > How to interrupt unit tests if a library is not present.

Reply
Thread Tools

How to interrupt unit tests if a library is not present.

 
 
Diana Jaunzeikare
Guest
Posts: n/a
 
      06-29-2009
[Note: parts of this message were removed to make it a legal post.]

Hi all,

I am developing support for PhyloXML in BioRuby as Google Summer of Code
project. I have a question about unit testing.

My code depends on libxml-ruby library (other parts of BioRuby does not). So
I want to test if libxml-ruby is required and then if it is not, i want to
quit my unit test suite (a file tes_phyloxml.rb) nicely (don't perform any
unit tests related to phyloxml since they anyways gonna fail) but the rest
of unit test suites should continue running.

Right now the it completely exits, if can't load xml library, but I would
like the other tests to continue running.

#First let's test if xml library is here, since it will be required by
bio/db/phyloxml
begin
require 'xml'
rescue LoadError
puts "Please install libxml-ruby library. It is needed for Bio:hyloXML
module. Unit tests will exit now.
exit 1
end

require 'bio/db/phyloxml'


class TestPhyloXML1 < Test::Unit::TestCase

def setup
@phyloxml = Bio:hyloXML.new(TestPhyloXMLData.example_xml)
end

def test_init
assert_equal(@phyloxml.class, Bio:hyloXML)
end

#[...]

end


Thanks,

Diana

--
I blog here: latvianlinuxgirl.blogspot.com

 
Reply With Quote
 
 
 
 
David A. Black
Guest
Posts: n/a
 
      06-29-2009
Hi --

On Tue, 30 Jun 2009, Diana Jaunzeikare wrote:

> Hi all,
>
> I am developing support for PhyloXML in BioRuby as Google Summer of Code
> project. I have a question about unit testing.
>
> My code depends on libxml-ruby library (other parts of BioRuby does not). So
> I want to test if libxml-ruby is required and then if it is not, i want to
> quit my unit test suite (a file tes_phyloxml.rb) nicely (don't perform any
> unit tests related to phyloxml since they anyways gonna fail) but the rest
> of unit test suites should continue running.
>
> Right now the it completely exits, if can't load xml library, but I would
> like the other tests to continue running.
>
> #First let's test if xml library is here, since it will be required by
> bio/db/phyloxml
> begin
> require 'xml'
> rescue LoadError
> puts "Please install libxml-ruby library. It is needed for Bio:hyloXML
> module. Unit tests will exit now.
> exit 1
> end
>
> require 'bio/db/phyloxml'
>
>
> class TestPhyloXML1 < Test::Unit::TestCase
>
> def setup
> @phyloxml = Bio:hyloXML.new(TestPhyloXMLData.example_xml)
> end
>
> def test_init
> assert_equal(@phyloxml.class, Bio:hyloXML)
> end
>
> #[...]
>
> end


Maybe something like this, if it's not too convoluted:

no_xml = false

begin
require 'xml'
rescue LoadError
puts "No libxml; not running those tests...." # or whatever
no_xml = true
end

unless no_xml
class TestPhyloXML1

etc.


David

--
David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Now available: The Well-Grounded Rubyist (http://manning.com/black2)
"Ruby 1.9: What You Need To Know" Envycasts with David A. Black
http://www.envycasts.com

 
Reply With Quote
 
 
 
 
Diana Jaunzeikare
Guest
Posts: n/a
 
      06-29-2009
[Note: parts of this message were removed to make it a legal post.]

Thanks a lot! It worked like a charm!

Diana

On Mon, Jun 29, 2009 at 12:10 PM, David A. Black <(E-Mail Removed)> wrote:

> Hi --
>
>
> On Tue, 30 Jun 2009, Diana Jaunzeikare wrote:
>
> Hi all,
>>
>> I am developing support for PhyloXML in BioRuby as Google Summer of Code
>> project. I have a question about unit testing.
>>
>> My code depends on libxml-ruby library (other parts of BioRuby does not).
>> So
>> I want to test if libxml-ruby is required and then if it is not, i want to
>> quit my unit test suite (a file tes_phyloxml.rb) nicely (don't perform any
>> unit tests related to phyloxml since they anyways gonna fail) but the rest
>> of unit test suites should continue running.
>>
>> Right now the it completely exits, if can't load xml library, but I would
>> like the other tests to continue running.
>>
>> #First let's test if xml library is here, since it will be required by
>> bio/db/phyloxml
>> begin
>> require 'xml'
>> rescue LoadError
>> puts "Please install libxml-ruby library. It is needed for Bio:hyloXML
>> module. Unit tests will exit now.
>> exit 1
>> end
>>
>> require 'bio/db/phyloxml'
>>
>>
>> class TestPhyloXML1 < Test::Unit::TestCase
>>
>> def setup
>> @phyloxml = Bio:hyloXML.new(TestPhyloXMLData.example_xml)
>> end
>>
>> def test_init
>> assert_equal(@phyloxml.class, Bio:hyloXML)
>> end
>>
>> #[...]
>>
>> end
>>

>
> Maybe something like this, if it's not too convoluted:
>
> no_xml = false
>
> begin
> require 'xml'
> rescue LoadError
> puts "No libxml; not running those tests...." # or whatever
> no_xml = true
> end
>
> unless no_xml
> class TestPhyloXML1
>
> etc.
>
>
> David
>
> --
> David A. Black / Ruby Power and Light, LLC
> Ruby/Rails consulting & training: http://www.rubypal.com
> Now available: The Well-Grounded Rubyist (http://manning.com/black2)
> "Ruby 1.9: What You Need To Know" Envycasts with David A. Black
> http://www.envycasts.com
>
>


 
Reply With Quote
 
David A. Black
Guest
Posts: n/a
 
      06-29-2009
Hi --

On Tue, 30 Jun 2009, Diana Jaunzeikare wrote:

> Thanks a lot! It worked like a charm!


Rob Biedenharn, in another context, reminded me that
exception-handling blocks can have an "else" clause. So you could do
the slightly simpler:

begin
require "xml"
rescue LoadError
puts "No xml library..."
else
class TestPhyloXML1 < Test::Unit::TestCase
...
end
end


David

--
David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Now available: The Well-Grounded Rubyist (http://manning.com/black2)
"Ruby 1.9: What You Need To Know" Envycasts with David A. Black
http://www.envycasts.com

 
Reply With Quote
 
David A. Black
Guest
Posts: n/a
 
      06-29-2009
On Tue, 30 Jun 2009, David A. Black wrote:

> Hi --
>
> On Tue, 30 Jun 2009, Diana Jaunzeikare wrote:
>
>> Thanks a lot! It worked like a charm!

>
> Rob Biedenharn, in another context, reminded me that
> exception-handling blocks can have an "else" clause. So you could do
> the slightly simpler:
>
> begin
> require "xml"
> rescue LoadError
> puts "No xml library..."
> else
> class TestPhyloXML1 < Test::Unit::TestCase
> ...
> end
> end


OK, third time a charm.

begin
require 'xml'
class TestPhyloXML1 < Test::Unit::TestCase
...
end
rescue LoadError
puts "No xml library..."
end

I think that's as compact and streamlined as I can get it


David

--
David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Now available: The Well-Grounded Rubyist (http://manning.com/black2)
"Ruby 1.9: What You Need To Know" Envycasts with David A. Black
http://www.envycasts.com

 
Reply With Quote
 
Diana Jaunzeikare
Guest
Posts: n/a
 
      06-29-2009
[Note: parts of this message were removed to make it a legal post.]

On Mon, Jun 29, 2009 at 4:07 PM, David A. Black <(E-Mail Removed)> wrote:

> On Tue, 30 Jun 2009, David A. Black wrote:
>
> Hi --
>>
>> On Tue, 30 Jun 2009, Diana Jaunzeikare wrote:
>>
>> Thanks a lot! It worked like a charm!
>>>

>>
>> Rob Biedenharn, in another context, reminded me that
>> exception-handling blocks can have an "else" clause. So you could do
>> the slightly simpler:
>>
>> begin
>> require "xml"
>> rescue LoadError
>> puts "No xml library..."
>> else
>> class TestPhyloXML1 < Test::Unit::TestCase
>> ...
>> end
>> end
>>

>
> OK, third time a charm.
>
> begin
> require 'xml'
> class TestPhyloXML1 < Test::Unit::TestCase
> ...
> end
> rescue LoadError
> puts "No xml library..."
> end
>
> I think that's as compact and streamlined as I can get it
>
>
>
> David
>
> --
> David A. Black / Ruby Power and Light, LLC
> Ruby/Rails consulting & training: http://www.rubypal.com
> Now available: The Well-Grounded Rubyist (http://manning.com/black2)
> "Ruby 1.9: What You Need To Know" Envycasts with David A. Black
> http://www.envycasts.com
>
>

Yes indeed! Thanks!

Diana

 
Reply With Quote
 
Matt Neuburg
Guest
Posts: n/a
 
      06-30-2009
Diana Jaunzeikare <(E-Mail Removed)> wrote:

> [Note: parts of this message were removed to make it a legal post.]
>
> On Mon, Jun 29, 2009 at 4:07 PM, David A. Black <(E-Mail Removed)> wrote:
>
> > On Tue, 30 Jun 2009, David A. Black wrote:
> >
> > Hi --
> >>
> >> On Tue, 30 Jun 2009, Diana Jaunzeikare wrote:
> >>
> >> Thanks a lot! It worked like a charm!
> >>>
> >>
> >> Rob Biedenharn, in another context, reminded me that
> >> exception-handling blocks can have an "else" clause. So you could do
> >> the slightly simpler:
> >>
> >> begin
> >> require "xml"
> >> rescue LoadError
> >> puts "No xml library..."
> >> else
> >> class TestPhyloXML1 < Test::Unit::TestCase
> >> ...
> >> end
> >> end
> >>

> >
> > OK, third time a charm.
> >
> > begin
> > require 'xml'
> > class TestPhyloXML1 < Test::Unit::TestCase
> > ...
> > end
> > rescue LoadError
> > puts "No xml library..."
> > end
> >
> > I think that's as compact and streamlined as I can get it


Indeed - quite a while ago I wrote myself a utility for requiring
without penalty in case of failure, and here it is (as you'll see, it
looks like a mere generalization of what David Black has already shown):

def myrequire(*what)
catch NameError
what.each do |thing|
begin
require((t = Array(thing))[0])
Array(t[1]).each {|inc| include self.class.const_get(inc)}
rescue LoadError
puts "Failed to locate required \"#{thing}\". "
puts $!
end
end
end

Here are some usage notes:

(1) no penalty for failure; we catch the LoadError and we don't re-raise

(2) arg can be an array, so multiple requires can be combined in one
line

(3) array element itself can be a pair, in which case second must be
array of desired includes as symbols; that way, we don't try to perform
the includes unless the require succeeded (and if an include fails, that
does raise all the way since we don't catch NameError)

So, you might say e.g.

myrequire "pathname", "yaml", "erb", "pp", "uri", "rubygems", "exifr"

Or (an example with an include):

myrequire ['rexml/document', :REXML]

m.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
must "explanation" {.test.} style not working in my unit tests Vahagn Hayrapetyan Ruby 3 05-02-2011 08:34 AM
"Library unit is not available in library work" tss26 VHDL 0 10-13-2009 09:15 AM
Tests without study guides or practice tests? =?Utf-8?B?Q2hyaXNS?= Microsoft Certification 8 12-20-2005 04:59 AM
Unit tests exist for java library classes? Mark Java 1 08-13-2003 04:36 AM



Advertisments