In my last post I made a tongue-in-cheek observation that load testing really doesn’t work by today’s perceived standards for web automation and testing.
Part of my grievance for that was based on frustration in dealing with different load testing platforms. Not frustration born out of incompetence, more the frustration born out writing tests for increasingly complex browsers with an antiquated toolset.
That’s not to say that protocol based application load testing (or the languages they sit on) aren’t powerful in their own right. LoadRunner, JMeter et al. has their place in the load testing world. But I would like to relegate them to the background as useful, sometimes expensive tools to spin up the wheels so to speak. Nothing like a bit of JMeter infused fun to get the wheels smoking on your system under test. But for the real part, measuring user experience on the web platform?
If you can’t wait to get started then I’d like to introduce BrowserMob.com. Been around since mid 2008 and offers real browser testing using Selenium scripts distributed across a grid of EC2 computers. Reasonably priced, well documented and supported by the legendary Patrick Lightbody, founder of things like OpenQA and Selenium Remote Control.
But hang on a second, you don’t like Selenium right? Have zero budget? Love Watir? Well I’m working on a similar construct aptly called WatirGrid which also allows for distributed testing across a grid network using Watir. The engine (gem) itself is open source and you can get it as follows:
gem install watirgrid
If you’d like to contribute please follow the WatirGrid project on github.
The Basics
WatirGrid is built on Rinda which implements the Linda distributed computing paradigm in Ruby. According to Wikipedia: “Linda is a model of coordination and communication among several parallel processes operating upon objects stored in and retrieved from shared, virtual, associative memory.â€
In other words, WatirGrid allows multiple parallel processes to provide remote Watir objects in the form of tuple spaces across a grid network. This grid network is controlled by a ring server and looks a bit like this:
Key Terminology
The controller implements a repository of tuples (tuple space) that can be accessed concurrently. The controller hosts the ring server which advertises these tuples across a grid network. Typically you will host one controller on a central machine.
The providers make remote Watir objects available to the tuple space hosted by the ring server. Typically you will host one or many providers on your grid network, for example, each PC may become a single provider of a Watir tuple in the form of an Internet Explorer, Firefox or Safari browser object.
Simple Example
Pick a server to host the controller for the ring server and execute the following:
$ controller
This should find your external facing IP and start the corresponding DRb and Ring Servers:
DRb server started on : druby://143.238.105.61:11235 Ring server started on: druby://143.238.105.61:12358
On each client PC, host the provider for the distributed (DRb) Watir objects
$ provider
This should find the recently started Ring Server and register a tuple for the Watir object:
DRb server started on : druby://143.238.105.61:11236 Ring server found on : druby://143.238.105.61:12358 New tuple registered : druby://143.238.105.61:12358
You will now be able to execute commands across remote browsers on your grid network.
e.g.
grid = Watir::Grid.new(:ring_server_port => 12358) grid.start(:quantity => 1, :read_all => true) threads = [] grid.browsers.each do |browser| threads << Thread.new do b = browser[:object].new_browser b.goto("http://www.google.com") b.text_field(:name, 'q').set("watirgrid") b.button(:name, "btnI").click end end threads.each {|thread| thread.join}
You may wish to host the controller and providers on different machines in a real scenario. You can specify things like server hostnames, ports and access control lists for each of the different types of servers. For more help see:
$ controller --help
Usage: controller [options]
Specific options:
-H, --drb-server-host HOST Specify DRb Server interface to host on
-d, --drb-server-port PORT Specify DRb Server port to listen on
-h, --ring-server-host HOST Specify Ring Server interface to host on
-r, --ring-server-port PORT Specify Ring Server port to listen on
-a, --access-control-list ACLS Specify a comma separated Access Control List
-l, --log-level LEVEL Specify log level {DEBUG|INFO|ERROR}
--help Show this message
$ provider --help
Usage: provider [options]
Specific options:
-H, --drb-server-host HOST Specify DRb Server interface to host on
-d, --drb-server-port PORT Specify DRb Server port to listen on
-h, --ring-server-host HOST Specify Ring Server host to connect to
-r, --ring-server-port PORT Specify Ring Server port to broadcast on
-b, --browser-type TYPE Specify browser type to register {ie|firefox|safari}
-a, --access-control-list ACLS Specify a comma separated Access Control List
-l, --log-level LEVEL Specify log level {DEBUG|INFO|ERROR}
--help Show this messageNeed more help?


As an afterthought, I’m finding this book *very* useful in continuing development on WatirGrid => Distributed Programming with Ruby
http://www.bookwormr.com/book/show/isbn/0321638360
A tiny screencast demonstrating WatirGrid with three concurrent browsers …
http://www.youtube.com/watch?v=FHbCdIxjRPU
Unfortunately, I can’t evaluate it cause the “Found 0 tuples.” error during the script executing under Windows OS (((
Sorry it didn’t work out for you Viktor! If you’re happy to wait until after Christmas I’ll spend some time with you on skype to help resolve the problem. My skype is ninteyknots
Great! Thank you!
Tim,
Great post watirgrid looks like it has a lot of potential.
Looking forward to messing with it.
When you become ‘browsermob’ style famous you’ll have to consider a name change from WatirGrid to ‘Flood’,'Monsoon’,'Downpour’ some snazzy name to attract the masses
Thanks! If we end up doing a web based (commercial) version then I think we’ll definitely change the name… The ‘engine’ which is watirgrid will always stay open source and remain the same no doubt =)