tourbus 2.0.1 → 2.0.2

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.
@@ -46,7 +46,7 @@ better name, these are called Tours.
46
46
  it write:
47
47
 
48
48
  class Simple < Tourist
49
- def test_homepage
49
+ def tour_homepage
50
50
  visit "http://#{@host}/"
51
51
  assert_contain "My Home Page"
52
52
  end
@@ -55,9 +55,12 @@ better name, these are called Tours.
55
55
  * Files in ./tours should have classes that match their names. E.g.
56
56
  "class BigHairyTest < Tourist" belongs in ./tours/big_hairy_test.rb
57
57
 
58
- * Think Test::Unit. test_* methods will be found automagically.
59
- setup() and teardown() methods will be executed at the appropriate
60
- times.
58
+ * Like how Test::Unit finds test_* methods automagically, TourBus will
59
+ make each tourist run any tour_* methods. setup() and teardown()
60
+ methods will be executed at the appropriate times.
61
+
62
+ * Two more magic methods: +before_tours+ and +after_tours+ will be run
63
+ before any tours and after all tours, respectively.
61
64
 
62
65
  === Example TourBus Run
63
66
 
@@ -3,6 +3,7 @@ require 'monitor'
3
3
  require 'common'
4
4
  require 'webrat'
5
5
  require 'webrat/adapters/mechanize'
6
+ require 'webrat_headers_patch' # must come after webrat requires
6
7
  require 'test/unit/assertions'
7
8
 
8
9
  # A tourist is essentially a test suite file. A Tourist subclass
@@ -21,30 +22,30 @@ class Tourist
21
22
  include Webrat::Matchers
22
23
  include Webrat::SaveAndOpenPage
23
24
  include Test::Unit::Assertions
24
-
25
+
25
26
  attr_reader :host, :tours, :number, :tour_type, :tourist_id
26
-
27
+
27
28
  def initialize(host, tours, number, tourist_id)
28
29
  @host, @tours, @number, @tourist_id = host, tours, number, tourist_id
29
30
  @tour_type = self.send(:class).to_s
30
31
  end
31
-
32
+
32
33
  # before_tour runs once per tour, before any tours get run
33
34
  def before_tours; end
34
-
35
+
35
36
  # after_tour runs once per tour, after all the tours have run
36
37
  def after_tours; end
37
-
38
+
38
39
  def setup
39
40
  end
40
-
41
+
41
42
  def teardown
42
43
  end
43
-
44
+
44
45
  def wait(time)
45
46
  sleep time.to_i
46
47
  end
47
-
48
+
48
49
  # Lists tourists in tours folder. If a string is given, filters the
49
50
  # list by that string. If an array of filter strings is given,
50
51
  # returns items that match ANY filter string in the array.
@@ -57,28 +58,28 @@ class Tourist
57
58
  # 3. If you passed in any filters, these basenames are rejected unless they match at least one filter
58
59
  # 4. The filenames remaining are then checked to see if they define a class of the same name that inherits from Tourist
59
60
  Dir[File.join('.', 'tours', '**', '*.rb')].map {|fn| File.basename(fn, ".rb")}.select {|fn| filter.size.zero? || filter.any?{|f| fn =~ /#{f}/}}.select {|tour| Tourist.tourist? tour }
60
- end
61
-
61
+ end
62
+
62
63
  def self.tours(tourist_name)
63
64
  Tourist.make_tourist(tourist_name).tours
64
65
  end
65
-
66
+
66
67
  # Returns true if the given tourist name can be found in the tours folder, and defines a similarly-named subclass of Tourist
67
68
  def self.tourist?(tourist_name)
68
69
  Object.const_defined?(tourist_name.classify) && tourist_name.classify.constantize.ancestors.include?(Tourist)
69
70
  end
70
-
71
+
71
72
  # Factory method, creates the named child class instance
72
73
  def self.make_tourist(tourist_name,host="http://localhost:3000",tours=[],number=1,tourist_id=nil)
73
74
  tourist_name.classify.constantize.new(host,tours,number,tourist_id)
74
75
  end
75
-
76
+
76
77
  # Returns list of tours this tourist knows about. (Meant to be run on a subclass
77
78
  # instance; returns the list of tours available).
78
79
  def tours
79
- methods.grep(/^tour_/).map {|m| m.sub(/^tour_/,'')}
80
+ methods.map(&:to_s).grep(/^tour_/).map {|m| m.sub(/^tour_/,'')}
80
81
  end
81
-
82
+
82
83
  def run_tour(tour_name)
83
84
  @current_tour = "tour_#{tour_name}"
84
85
  raise TourBusException.new("run_tour couldn't run tour '#{tour_name}' because this tourist did not respond to :#{@current_tour}") unless respond_to? @current_tour
@@ -86,16 +87,16 @@ class Tourist
86
87
  send @current_tour
87
88
  teardown
88
89
  end
89
-
90
+
90
91
  protected
91
-
92
+
92
93
  def session
93
94
  @session ||= Webrat::MechanizeSession.new
94
95
  end
95
-
96
+
96
97
  def log(message)
97
98
  puts "#{Time.now.strftime('%F %H:%M:%S')} Tourist ##{@tourist_id}: (#{@current_tour}) #{message}"
98
99
  end
99
-
100
+
100
101
  end
101
102
 
@@ -0,0 +1,17 @@
1
+ class Webrat::MechanizeAdapter
2
+ # Replace the Webrat version of get with one that doesn't drop the
3
+ # headers param. Headers can be set using Webrat::Session#header
4
+ # (#header is available in your Tourist sublasses). For example:
5
+ #
6
+ # class MyTests < Tourist
7
+ # def before_tours
8
+ # header 'X-My-Header', 'something'
9
+ # end
10
+ #
11
+ def get_with_headers(url, data, headers = nil)
12
+ @response = mechanize.get({url: url, headers: headers}, data)
13
+ end
14
+
15
+ alias_method :get_without_headers, :get
16
+ alias_method :get, :get_with_headers
17
+ end
metadata CHANGED
@@ -1,101 +1,130 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: tourbus
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.2
4
5
  prerelease:
5
- version: 2.0.1
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - David Brady
9
9
  - James Britt
10
10
  - JT Zemp
11
11
  - Tim Harper
12
12
  - Joe Tanner
13
+ - Chris Bailey
13
14
  autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
-
17
- date: 2010-09-23 00:00:00 -06:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
17
+ date: 2013-01-05 00:00:00.000000000 Z
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
21
20
  name: mechanize
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ requirement: !ruby/object:Gem::Requirement
24
22
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
28
26
  version: 1.0.0
29
27
  type: :runtime
30
- version_requirements: *id001
31
- - !ruby/object:Gem::Dependency
32
- name: trollop
33
28
  prerelease: false
34
- requirement: &id002 !ruby/object:Gem::Requirement
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: 1.0.0
35
+ - !ruby/object:Gem::Dependency
36
+ name: trollop
37
+ requirement: !ruby/object:Gem::Requirement
35
38
  none: false
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: "0"
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
40
43
  type: :runtime
41
- version_requirements: *id002
42
- - !ruby/object:Gem::Dependency
43
- name: faker
44
44
  prerelease: false
45
- requirement: &id003 !ruby/object:Gem::Requirement
45
+ version_requirements: !ruby/object:Gem::Requirement
46
46
  none: false
47
- requirements:
48
- - - ">="
49
- - !ruby/object:Gem::Version
50
- version: "0"
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ - !ruby/object:Gem::Dependency
52
+ name: faker
53
+ requirement: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
51
59
  type: :runtime
52
- version_requirements: *id003
53
- - !ruby/object:Gem::Dependency
54
- name: hpricot
55
60
  prerelease: false
56
- requirement: &id004 !ruby/object:Gem::Requirement
61
+ version_requirements: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: hpricot
69
+ requirement: !ruby/object:Gem::Requirement
57
70
  none: false
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: "0"
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
62
75
  type: :runtime
63
- version_requirements: *id004
64
- - !ruby/object:Gem::Dependency
65
- name: webrat
66
76
  prerelease: false
67
- requirement: &id005 !ruby/object:Gem::Requirement
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webrat
85
+ requirement: !ruby/object:Gem::Requirement
68
86
  none: false
69
- requirements:
70
- - - ">="
71
- - !ruby/object:Gem::Version
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
72
90
  version: 0.7.0
73
91
  type: :runtime
74
- version_requirements: *id005
75
- - !ruby/object:Gem::Dependency
76
- name: activesupport
77
92
  prerelease: false
78
- requirement: &id006 !ruby/object:Gem::Requirement
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: 0.7.0
99
+ - !ruby/object:Gem::Dependency
100
+ name: activesupport
101
+ requirement: !ruby/object:Gem::Requirement
79
102
  none: false
80
- requirements:
81
- - - ">="
82
- - !ruby/object:Gem::Version
103
+ requirements:
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
83
106
  version: 3.0.0
84
107
  type: :runtime
85
- version_requirements: *id006
86
- description: TourBus, a web load-testing tool that combines complex 'tour' definitions with scalable, concurrent testing
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
114
+ version: 3.0.0
115
+ description: TourBus, a web load-testing tool that combines complex 'tour' definitions
116
+ with scalable, concurrent testing
87
117
  email: github@shinybit.com
88
- executables:
118
+ executables:
89
119
  - tourbus
90
120
  - tourwatch
91
121
  - tourproxy
92
122
  extensions: []
93
-
94
- extra_rdoc_files:
123
+ extra_rdoc_files:
95
124
  - README.rdoc
96
125
  - MIT-LICENSE
97
126
  - examples/contact_app/README.rdoc
98
- files:
127
+ files:
99
128
  - bin/tourbus
100
129
  - bin/tourproxy
101
130
  - bin/tourwatch
@@ -111,42 +140,39 @@ files:
111
140
  - lib/tour_rat.rb
112
141
  - lib/tour_watch.rb
113
142
  - lib/tourist.rb
143
+ - lib/webrat_headers_patch.rb
114
144
  - spec/lib/tourproxy_spec.rb
115
145
  - spec/spec_helper.rb
116
146
  - README.rdoc
117
147
  - MIT-LICENSE
118
- has_rdoc: true
119
148
  homepage: http://github.com/dbrady/tourbus/
120
149
  licenses: []
121
-
122
150
  post_install_message:
123
- rdoc_options:
151
+ rdoc_options:
124
152
  - --line-numbers
125
153
  - --inline-source
126
154
  - --main
127
155
  - README.rdoc
128
156
  - --title
129
157
  - Tourbus - Web Load Testing in Ruby
130
- require_paths:
158
+ require_paths:
131
159
  - lib
132
- required_ruby_version: !ruby/object:Gem::Requirement
160
+ required_ruby_version: !ruby/object:Gem::Requirement
133
161
  none: false
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: "0"
138
- required_rubygems_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
139
167
  none: false
140
- requirements:
141
- - - ">="
142
- - !ruby/object:Gem::Version
143
- version: "0"
168
+ requirements:
169
+ - - ! '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
144
172
  requirements: []
145
-
146
173
  rubyforge_project:
147
- rubygems_version: 1.6.2
174
+ rubygems_version: 1.8.24
148
175
  signing_key:
149
176
  specification_version: 3
150
177
  summary: TourBus web stress-testing tool
151
178
  test_files: []
152
-