grid 0.3.7 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.7
1
+ 0.4.0
@@ -0,0 +1,67 @@
1
+ require '../lib/grid'
2
+ require 'watir-webdriver-performance' # only if using webdriver_performance
3
+
4
+ ##
5
+ # Set some parameters before we begin
6
+ params={}
7
+ params[:controller_uri] = "druby://ec2-50-16-63-81.compute-1.amazonaws.com:11235"
8
+ params[:browser] = "chrome"
9
+ params[:quantity] = 5
10
+
11
+ ##
12
+ # Let's instantiate a grid object
13
+ grid = Grid.new(params)
14
+
15
+ ##
16
+ # How big is my grid?
17
+ puts grid.size
18
+
19
+ ##
20
+ # The setup method will prepare the browsers on the grid
21
+ grid.setup
22
+
23
+ ##
24
+ # Info about providers on the grid
25
+ p grid.providers.first[:hostname]
26
+ p grid.providers.first[:architecture]
27
+
28
+ ##
29
+ # The iterate method can be passed a block of watir code,
30
+ # and is yielded a browser object in return
31
+ grid.iterate do |browser|
32
+ 2.times do # because we want to iterate more than once for each browser
33
+ browser.goto "altentee.com"
34
+ puts browser.title
35
+ # if using webdriver_performance we can get performance metrics
36
+ puts browser.performance.summary[:response_time]
37
+ end
38
+ end
39
+
40
+ ##
41
+ # The teardown method will close browsers and release nodes back to the grid
42
+ grid.teardown
43
+
44
+ ##
45
+ # There's also a iterate_with_index method if you want to keep track
46
+ # of individual browsers for further reporting and analysis
47
+ grid = Grid.new(params)
48
+ grid.setup
49
+
50
+ grid.iterate_with_index do |browser, index|
51
+ puts "I am browser index #{index}"
52
+ browser.goto "watirgrid.com"
53
+ puts browser.performance.summary[:dom_processing]
54
+ end
55
+
56
+ grid.teardown
57
+
58
+ ##
59
+ # Finally, here's a shorthand control method to do the setup, iteration and teardown
60
+ # in one foul swoop!
61
+
62
+ params[:rampup] = 10 #seconds, optional rampup period for all the browsers
63
+ Grid.control(params) do |browser, index|
64
+ puts "I am browser index #{index}"
65
+ browser.goto "gridinit.com"
66
+ puts browser.performance.summary[:time_to_first_byte]
67
+ end
@@ -1,10 +1,10 @@
1
- @NFR001
1
+ @NFR-001
2
2
  Feature: User logons
3
3
  In order to use the web applicaion users must be
4
4
  able to logon and access the portal in 3 seconds
5
5
 
6
- Scenario: Logon with 50 users in 3 minutes
7
- Given 200 users open "chrome"
6
+ Scenario: Logon with 50 users in 1 minute
7
+ Given 50 users open "chrome"
8
8
  And navigate to the portal
9
9
  When they enter their credentials
10
10
  Then they should see their account settings
@@ -1,29 +1,39 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', '..', 'lib'))
3
- require 'grid'
4
3
  require 'rspec/expectations';
4
+ require 'watir-webdriver-performance'
5
+ require 'grid'
5
6
 
6
- Grid.control(:controller_uri=>"druby://ec2-50-16-63-81.compute-1.amazonaws.com:11235", :browser=>"chrome") do |browser, id|
7
-
8
- Given /^(\d+) users open "([^"]*)"$/ do |arg1, arg2|
9
- pending # express the regexp above with the code you wish you had
10
- end
7
+ Given /^(\d+) users open "([^"]*)"$/ do |quantity, browser|
8
+ params={}
9
+ params[:controller_uri] = "druby://ec2-50-16-63-81.compute-1.amazonaws.com:11235"
10
+ params[:browser] = browser # type of webdriver browser to spawn
11
+ params[:quantity] = quantity.to_i # max number of browsers to use
12
+ params[:rampup] = 10 # seconds
13
+ @grid = Grid.new(params)
14
+ @grid.setup
15
+ end
11
16
 
12
- Given /^navigate to the portal$/ do
13
- pending # express the regexp above with the code you wish you had
14
- end
17
+ Given /^navigate to the portal$/ do
18
+ @grid.iterate {|browser| browser.goto "http://gridinit.com/examples/logon.html" }
19
+ end
15
20
 
16
- When /^they enter their credentials$/ do
17
- pending # express the regexp above with the code you wish you had
21
+ When /^they enter their credentials$/ do
22
+ @grid.iterate do |browser|
23
+ browser.text_field(:name => "email").set "tim@mahenterprize.com"
24
+ browser.text_field(:name => "password").set "mahsecretz"
25
+ browser.button(:type => "submit").click
18
26
  end
27
+ end
19
28
 
20
- Then /^they should see their account settings$/ do
21
- pending # express the regexp above with the code you wish you had
29
+ Then /^they should see their account settings$/ do
30
+ @grid.iterate do |browser|
31
+ browser.text.should =~ /Maybe I should get a real Gridinit account/
22
32
  end
33
+ end
23
34
 
24
- Then /^the response time should be less than (\d+) seconds$/ do |arg1|
25
- pending # express the regexp above with the code you wish you had
35
+ Then /^the response time should be less than (\d+) seconds$/ do |response_time|
36
+ @grid.iterate do |browser|
37
+ browser.performance.summary[:response_time].should < response_time.to_i * 1000
26
38
  end
27
-
28
39
  end
29
-
data/grid.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{grid}
8
- s.version = "0.3.7"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Tim Koopmans"]
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
28
28
  "Rakefile",
29
29
  "VERSION",
30
30
  "bin/grid",
31
+ "examples/basic/basic.rb",
31
32
  "examples/cucumber/example.feature",
32
33
  "examples/cucumber/step_definitions/.DS_Store",
33
34
  "examples/cucumber/step_definitions/example_steps.rb",
@@ -42,6 +43,7 @@ Gem::Specification.new do |s|
42
43
  s.rubygems_version = %q{1.4.2}
43
44
  s.summary = %q{Gridinit command line utilities}
44
45
  s.test_files = [
46
+ "examples/basic/basic.rb",
45
47
  "examples/cucumber/step_definitions/example_steps.rb",
46
48
  "spec/grid_spec.rb",
47
49
  "spec/spec_helper.rb"
data/lib/grid.rb CHANGED
@@ -10,56 +10,88 @@ require 'highline/import'
10
10
 
11
11
  class Grid
12
12
 
13
- ##
14
- # This is a helper method to control a grid based on watir.
15
- # It involves some general block thuggery and could
16
- # honestly benefit from some brutal refactoring...
17
- def self.control(params = {}, &block)
18
- $stdout.flush
19
- log = Logger.new(STDOUT, 'daily')
20
- log.level = params[:loglevel] || Logger::DEBUG
21
- grid = Watir::Grid.new(params)
22
- grid.start(:take_all => true)
23
- log.debug("Grid size : #{grid.size}")
24
- log.debug("Grid rampup : #{rampup(grid.size, params)} secs")
13
+ def initialize(params = {})
14
+ @log = Logger.new(STDOUT, 'daily')
15
+ @log.level = params[:loglevel] || Logger::INFO
16
+ @exclusive = params[:exclusive]
17
+ @exclusive ? params[:take_all] = true : params[:read_all] = true
18
+ @webdriver_browser_type = params[:browser].to_sym if params[:browser]
19
+ @grid = Watir::Grid.new(params)
20
+ @grid.start(params)
21
+ @providers = @grid.browsers
22
+ @browsers = []
23
+ end
24
+
25
+ def size
26
+ @grid.size
27
+ end
28
+
29
+ def browsers
30
+ @browsers
31
+ end
32
+
33
+ def providers
34
+ @providers
35
+ end
36
+
37
+ def setup
38
+ @grid.browsers.each_with_index do |browser, index|
39
+ sleep 0.15
40
+ @browsers[index] ||= browser[:object].new_browser(@webdriver_browser_type)
41
+ end
42
+ end
43
+
44
+ def teardown
45
+ @browsers.each do |browser|
46
+ browser.close
47
+ end
48
+ @grid.release_tuples if @exclusive
49
+ end
50
+
51
+ def iterate &block
52
+ threads = []
53
+ @browsers.each do |browser|
54
+ threads << Thread.new do
55
+ yield browser
56
+ end
57
+ end
58
+ threads.each {|thread| thread.join}
59
+ end
60
+
61
+ def iterate_with_index &block
25
62
  threads = []
26
- grid.browsers.each_with_index do |browser, index|
27
- sleep rampup(grid.size, params)
28
- threads << Thread.new(params[:browser]) do |webdriver_browser_type|
29
- $stdout.flush
30
- start = ::Time.now
31
- log.debug("Browser #{index+1}##{Thread.current.object_id} start : #{::Time.now}")
32
- log.debug("Browser #{index+1}##{Thread.current.object_id} architecture : #{browser[:architecture]}")
33
- log.debug("Browser #{index+1}##{Thread.current.object_id} type : #{browser[:browser_type]}")
34
- log.debug("Browser #{index+1}##{Thread.current.object_id} hostname : #{browser[:hostname]}")
35
- if browser[:browser_type] =~ /webdriver/
36
- webdriver_browser_type = "firefox" unless webdriver_browser_type
37
- @browser = browser[:object].new_browser(webdriver_browser_type.to_sym)
38
- else
39
- @browser = browser[:object].new_browser
40
- end
41
- yield @browser, "#{index+1}##{Thread.current.object_id}"
42
- log.debug("Browser #{index+1}##{Thread.current.object_id} stop : #{::Time.now}")
43
- log.debug("Browser #{index+1}##{Thread.current.object_id} elapsed : #{(::Time.now - start).to_i} secs")
63
+ @browsers.each_with_index do |browser, index|
64
+ threads << Thread.new do
65
+ yield browser, index
44
66
  end
45
67
  end
46
- begin
47
- threads.each {|thread| thread.join}
48
- rescue => e
49
- puts e.inspect
50
- puts e.backtrace
51
- grid.release_tuples
68
+ threads.each {|thread| thread.join}
69
+ end
70
+
71
+ def self.control(params = {}, &block)
72
+ @exclusive = params[:exclusive]
73
+ @exclusive ? params[:take_all] = true : params[:read_all] = true
74
+ @webdriver_browser_type = params[:browser].to_sym if params[:browser]
75
+ @grid = Watir::Grid.new(params)
76
+ @grid.start(params)
77
+ @browsers = []
78
+ threads = []
79
+ @grid.browsers.each_with_index do |browser, index|
80
+ sleep rampup(params)
81
+ threads << Thread.new(@webdriver_browser_type) do |webdriver_browser_type|
82
+ @browser = browser[:object].new_browser(webdriver_browser_type)
83
+ yield @browser, index
84
+ end
52
85
  end
53
- grid.release_tuples
86
+ threads.each {|thread| thread.join}
87
+ @grid.release_tuples if @exclusive
54
88
  end
55
89
 
56
90
  private
57
91
 
58
- ##
59
- # Calculate rampup in seconds
60
- def self.rampup(total_threads, params = {})
92
+ def self.rampup(params = {})
61
93
  if params[:rampup]
62
- params[:rampup] / total_threads
94
+ params[:rampup] / @grid.size
63
95
  else
64
96
  0.5
65
97
  end
data/spec/grid_spec.rb CHANGED
@@ -1,7 +1,61 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "Grid" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
4
+
5
+ let!(:grid) do
6
+ params={}
7
+ params[:controller_uri] = "druby://ec2-50-16-63-81.compute-1.amazonaws.com:11235"
8
+ params[:browser] = "chrome"
9
+ params[:quantity] = 5
10
+ grid = Grid.new(params)
11
+ end
12
+
13
+ it "should be able to check the size of a grid" do
14
+ grid.size.should == 5
15
+ end
16
+
17
+ it "should be able setup browsers on the grid" do
18
+ grid.setup
19
+ grid.browsers.first.should be_an_instance_of(DRb::DRbObject)
20
+ grid.teardown
21
+ end
22
+
23
+ it "should be able to get information about individual providers on the grid" do
24
+ grid.providers.first[:hostname].should_not be_empty
25
+ grid.providers.first[:architecture].should_not be_empty
26
+ end
27
+
28
+ it "should be able to iterate over the grid" do
29
+ grid.setup
30
+ grid.iterate do |browser|
31
+ 2.times do # because we want to iterate more than once for each browser
32
+ browser.goto "altentee.com"
33
+ browser.title.should =~ /The Automation Company/
34
+ # if using webdriver_performance we can get performance metrics
35
+ browser.performance.summary[:response_time].should > 0
36
+ end
37
+ end
38
+ grid.teardown
39
+ end
40
+
41
+ it "should be able to iterate over the grid with an index" do
42
+ grid.setup
43
+ grid.iterate_with_index do |browser, index|
44
+ browser.goto "watirgrid.com"
45
+ browser.performance.summary[:dom_processing].should > 0
46
+ end
47
+ grid.teardown
48
+ end
49
+
50
+ it "should be able to control the grid using shorthand method" do
51
+ params={}
52
+ params[:controller_uri] = "druby://ec2-50-16-63-81.compute-1.amazonaws.com:11235"
53
+ params[:browser] = "chrome" # type of webdriver browser to spawn
54
+ params[:quantity] = 5 # max number of browsers to use
55
+ params[:rampup] = 10 # seconds
56
+ Grid.control(params) do |browser, index|
57
+ browser.goto "gridinit.com"
58
+ browser.performance.summary[:time_to_first_byte].should > 0
59
+ end
6
60
  end
7
61
  end
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,7 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
3
  require 'rspec'
4
4
  require 'grid'
5
+ require 'watir-webdriver-performance'
5
6
 
6
7
  # Requires supporting files with custom matchers and macros, etc,
7
8
  # in ./support/ and its subdirectories.
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grid
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 3
9
- - 7
10
- version: 0.3.7
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tim Koopmans
@@ -253,6 +253,7 @@ files:
253
253
  - Rakefile
254
254
  - VERSION
255
255
  - bin/grid
256
+ - examples/basic/basic.rb
256
257
  - examples/cucumber/example.feature
257
258
  - examples/cucumber/step_definitions/.DS_Store
258
259
  - examples/cucumber/step_definitions/example_steps.rb
@@ -295,6 +296,7 @@ signing_key:
295
296
  specification_version: 3
296
297
  summary: Gridinit command line utilities
297
298
  test_files:
299
+ - examples/basic/basic.rb
298
300
  - examples/cucumber/step_definitions/example_steps.rb
299
301
  - spec/grid_spec.rb
300
302
  - spec/spec_helper.rb