We are creating a smoke test for our web based application using the
Test/Unit module in Ruby (v1.8.6) with Watir (v1.6.2).

The smoke test would consist of a series of tests such as:

Test 1: Open an IE browser and goto to the application's home page
Test 2: Sign into the application
Test 3: Test some feature that is accessible to the signed in user
Test 4: Test some other feature that is accessible to the signed in
user

We would like to:
1) Use the same browser (Watir::IE object) throughout the entire
series of tests and
2) Be able to run the smoke test multiple times concurrently.

In trying to do this, we are running into problems with variable
scope.

When we assigned the Watir::IE object to an instance variable (@), the
variable appeared to be destroyed during the teardown of each test.
This prevents us from re-using the same browser across multiple tests.

When we assigned the Watir::IE object to a class (@@) or global ($)
variable, we could use the same browser throughout the series of
tests.  However, when using multiple threads to run the smoke test
multiple times concurrently, the threads collided due to everyone
using the same browser.

The below code illustrates our problem.

If you run the code as it is, two browsers will be opened and all of
the .goto() commands end up being performed on the last created
browser (ie both threads are sharing one browser).  If you change the
'@@browser' to '@browser', the test_open_browser test completes as
expected (ie two browsers open and each navigates to a page).
However, the browser is not retained from test to test, resulting in
the test_navigate_somewhere_else test giving the following error:

test_navigate_somewhere_else(TC_MyTest):
NoMethodError: undefined method `goto' for nil:NilClass
    caller.rb:16:in `test_navigate_somewhere_else'


Question: Are there any ideas on how we can retain a variable (the
browser) between tests, yet still be thread-safe?

Thanks,
Justin Ko


Code:

require 'watir'
require 'watir/ie'
require 'test/unit'
require 'test/unit/ui/console/testrunner'

class TC_MyTest < Test::Unit::TestCase
  def test_open_browser
    pages = ['www.google.ca', 'www.bestbuy.ca', 'www.futureshop.ca']
    @@browser = Watir::IE.new
    sleep(2+rand(10))
    @@browser.goto( pages[rand(pages.length)] )
  end

  def test_navigate_somewhere_else
    pages = ['www.henrys.com', 'www.gmail.com', 'maps.google.ca']
    @@browser.goto( pages[rand(pages.length)] )
  end
end

class TS_MyTests
  def self.suite
    suite = Test::Unit::TestSuite.new
    suite << TC_MyTest.suite
    return suite
  end
end

threads = []

2.times do |x|
  threads << Thread.new(x) { |myPage|
    Test::Unit::UI::Console::TestRunner.run(TS_MyTests)
  }
end
threads.each { |aThread|  aThread.join }
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Watir General" group.
To post to this group, send email to watir-general@googlegroups.com
Before posting, please read the following guidelines: 
http://wiki.openqa.org/display/WTR/Support
To unsubscribe from this group, send email to 
watir-general-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/watir-general
-~----------~----~----~----~------~----~------~--~---

Reply via email to