grid 0.3.7 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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