Handling browser on test start and end

When I started building a unit tests framework for our product, I decided that I want the browser to remain open through all tests, and only be closed at the end. This is because I don’t want a developer running these tests on his machine to be disturbed with many browser windows opened and closed.

However, as I quickly found out, there is no easy way to run code at the beginning and end of a test suite. This seems to be intentional, as each test case should be separate and independent of other tests in the suite. The setup and teardown methods are run for each test case.

One simple solution was to drop it and simply start the browser on every test case and close it on end, but when I played with it a little more, I reached an even better solution. I’m starting the browser at the beginning of the test and assign it to a global $browser. Then, if the test fail (which can be detected by @test_passed), we set $browser to nil, so the browser window remains, and subsequent tests create and use a new browser window. If the test succeed, the browser window is reused through $browser. At the end of the test, we close the browser if $browser is not nil. With this constellation, after the test suite finishes running, we have a browser open for each failed test, so we can inspect what went wrong and how the application looks at the time of the fail.

Here is the code I used to implement it:

# cleanup on close
END { # close browser at completion of the tests
	$browser.close if $browser && $browser.exists? && !ENV['DONT_CLOSE_BROWSER_AT_END']
	Watir::IE.quit
} 

module MyTestSuite < Watir::TestCase
	#############################################################
	# setup method:
	# This setup function is called by the UnitTest framework before any test is run.
	# The function initialize the global $browser object if needed
	#############################################################
	def setup
		return if $browser
		$browser = Watir::IE.new
		$browser.speed = :fast
		$browser.add_checker(PageCheckers::NAVIGATION_CHECKER)
		$browser.maximize unless ENV['DO_NOT_MAXIMIZE_BROWSER']
	end

	#############################################################
	# teardown method:
	# This teardown function is called by the UnitTest framework after any test is run.
	# The function reset the global $browser object in case an error
	# occurred (unless NO_NEW_BROWSER_ON_ERROR), so
	# a new browser window will be created in case an error occurred.
	#############################################################
	def teardown
		$browser = nil unless @test_passed || ENV['NO_NEW_BROWSER_ON_ERROR']
	end 

	# ... test cases methods goes here
end
About these ads

One Response to “Handling browser on test start and end”

  1. Watir - first impressions « splintor’s blog Says:

    [...] programming and geekery in general « Macro to add a hyperlink to a mail message Handling browser on test start and end [...]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


Follow

Get every new post delivered to your Inbox.

%d bloggers like this: