working with Test::Unit

Discussion in 'Ruby' started by aidy, Jan 2, 2008.

  1. aidy

    aidy Guest

    Hi,

    I use Watir and Test::Unit.

    There are a number of sites I test that are very similar.

    I have a base test unit script e.g.

    class Main_Site_Test < Test::Unit::TestCase
    include Watir::Assertions

    def setup
    @browser = Project::Browser.new
    @register = Project::Register.new
    @home = Project::HomeExceptions.new
    @login = {:url=> 'main_site.com'}
    end


    def test_0002_login
    @browser.goto(@login[:url])
    @home.log_in_link.click
    @home.username_edit.set('')
    @home.password_edit.set('pass123')
    @register.go_button.click
    verify(@browser.include('Welcome'), 'not logged in successfully')

    rescue => e
    @browser.close
    end

    So for the next site I will do this

    class Similar_Test < Main_Site_Test
    def setup
    super
    @login = {:url=> 'similar_test.com'}
    end
    end

    However, I can't run the Similar_Test class without running the
    Main_Site_Test class

    require 'main_site_test'
    require 'similar_test'

    Also, I have written 'test_0002_login', can I not just use that
    specific method in different test classes?

    Any suggestions?

    Aidy
     
    aidy, Jan 2, 2008
    #1
    1. Advertising

  2. aidy

    Brian Adkins Guest

    On Jan 2, 9:55 am, aidy <> wrote:
    > Hi,
    >
    > I use Watir and Test::Unit.
    >
    > There are a number of sites I test that are very similar.
    >
    > I have a base test unit script e.g.
    >
    > class Main_Site_Test < Test::Unit::TestCase
    > include Watir::Assertions
    >
    > def setup
    > @browser = Project::Browser.new
    > @register = Project::Register.new
    > @home = Project::HomeExceptions.new
    > @login = {:url=> 'main_site.com'}
    > end
    >
    > def test_0002_login
    > @browser.goto(@login[:url])
    > @home.log_in_link.click
    > @home.username_edit.set('')
    > @home.password_edit.set('pass123')
    > @register.go_button.click
    > verify(@browser.include('Welcome'), 'not logged in successfully')
    >
    > rescue => e
    > @browser.close
    > end
    >
    > So for the next site I will do this
    >
    > class Similar_Test < Main_Site_Test
    > def setup
    > super
    > @login = {:url=> 'similar_test.com'}
    > end
    > end
    >
    > However, I can't run the Similar_Test class without running the
    > Main_Site_Test class
    >
    > require 'main_site_test'
    > require 'similar_test'
    >
    > Also, I have written 'test_0002_login', can I not just use that
    > specific method in different test classes?
    >
    > Any suggestions?
    >
    > Aidy


    I think this only partially applies to your situation, but the
    following thread has info regarding inheritance issues with Test::Unit

    http://groups.google.com/group/comp.lang.ruby/browse_frm/thread/a2ee41414dc9376d/eea4ead591c1da1f

    If it's not helpful, maybe you could clarify what you want to do. It
    seems from your post that you don't want to be required to execute
    Main_Site_Test to execute Similar_Test, but you also want to reuse
    test_0002_login which is in Main_Site_Test.
     
    Brian Adkins, Jan 2, 2008
    #2
    1. Advertising

  3. aidy wrote:
    > However, I can't run the Similar_Test class without running the
    > Main_Site_Test class
    >
    > require 'main_site_test'
    > require 'similar_test'
    >
    > Also, I have written 'test_0002_login', can I not just use that
    > specific method in different test classes?
    >
    > Any suggestions?


    Would using mixin instead inheritance work in your case?


    Best regards,

    Jari Williamsson
     
    Jari Williamsson, Jan 2, 2008
    #3
  4. aidy

    aidy Guest

    Hi Jari,

    > Would using mixin instead inheritance work in your case?
    >


    Could you give me an example of where the module would be used and
    what it would contain?

    Aidy
     
    aidy, Jan 3, 2008
    #4
  5. aidy

    aidy Guest

    On 2 Jan, 16:41, Brian Adkins <> wrote:
    > On Jan 2, 9:55 am,aidy<> wrote:
    >
    > If it's not helpful, maybe you could clarify what you want to do. It
    > seems from your post that you don't want to be required to execute
    > Main_Site_Test to execute Similar_Test, but you also want to reuse
    > test_0002_login which is in Main_Site_Test.- Hide quoted text -
    >


    class Common < Test::Unit::TestCase
    include Watir::Assertions

    def setup
    @browser = Project::Browser.new
    @home = Project::HomeExceptions.new
    @register = Project::Register.new
    @login = {:url=> 'baseclass.com'}
    end

    def test_login
    @browser.goto(@login[:url])
    @home.log_in_link.click
    @home.username_edit.set('')
    @home.password_edit.set('pass123')
    @register.go_button.click
    end

    end

    class Sub_Class < Common

    def setup
    @login = {:url=> 'subclass.com'}
    end

    def test_login
    super
    end

    end

    I am looking to use the methods in the Common class only in the sub
    class. I do not want the the Common
    class to run as well.

    Aidy
     
    aidy, Jan 3, 2008
    #5
  6. aidy

    Matt Berney Guest

    aidy wrote:
    > Hi Jari,
    >
    >> Would using mixin instead inheritance work in your case?
    >>

    >
    > Could you give me an example of where the module would be used and
    > what it would contain?
    >
    > Aidy


    We encountered a similar condition with our test framework. While the
    Test::Unit framework provides the mechanism to run tests, we found that
    there was a lot of duplication of code...particularly in the
    setup/teardown methods.

    Our approach used something like this (names changed to protect the
    innocent)

    common_testcase.rb

    module MyNamespace
    module TestCase

    def setup
    # Enter common setup code here
    puts "Common setup code"
    end

    def teardown
    # Enter common teardown code here
    puts "Common teardown code"
    end

    def doWork
    # Enter common worker code here
    puts "Common worker method"
    end

    end # TestCase
    end # MyNamespace

    my_testcase.rb


    class TC_MyTestCase < Test::Unit::TestCase

    require 'common_testcase.rb'
    include MyNameSpace::TestCase


    # Test Case - Do the test
    def test_doTest
    doWork
    end
    end # TC_MyTestCase

    By implementing the common functionality in a separate module, it can be
    included in each of your test cases. Place the common code in the
    module, and mixin with the test cases. Just don't place any 'test_*'
    methods in the common code.

    Hope this helps.




    --
    Posted via http://www.ruby-forum.com/.
     
    Matt Berney, Jan 3, 2008
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Edvard Majakari
    Replies:
    4
    Views:
    688
    Edvard Majakari
    Feb 25, 2005
  2. VvanN
    Replies:
    5
    Views:
    492
    Phlip
    Apr 28, 2006
  3. Bill David
    Replies:
    2
    Views:
    273
    Arne Vajhøj
    Jun 18, 2008
  4. Bill Mosteller
    Replies:
    0
    Views:
    230
    Bill Mosteller
    Oct 22, 2009
  5. timr
    Replies:
    2
    Views:
    168
Loading...

Share This Page