ruby-jmeter 2.13.10 → 3.0.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.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +1 -1
  5. data/Gemfile +2 -2
  6. data/LICENSE.txt +2 -2
  7. data/README.md +4 -5
  8. data/Rakefile +3 -3
  9. data/examples/{basic_os_process_sampler.rb → OS_process_sampler.rb} +1 -1
  10. data/examples/{basic_assertion_results.rb → assertion_results.rb} +1 -3
  11. data/examples/basic_auth.rb +1 -1
  12. data/examples/{basic_browser_headers.rb → browser_headers.rb} +1 -1
  13. data/examples/{basic_composite_graph.rb → composite_graph.rb} +1 -1
  14. data/examples/{basic_gc_dummy_sampler.rb → dummy_sampler.rb} +1 -3
  15. data/examples/{basic_duration_assertion.rb → duration_assertion.rb} +1 -1
  16. data/examples/etsy_login_browse.rb +1 -4
  17. data/examples/{basic_extract.rb → extract.rb} +1 -1
  18. data/examples/{basic_foreach.rb → foreach_controller.rb} +1 -4
  19. data/examples/{basic_header.rb → header_manager.rb} +2 -3
  20. data/examples/{basic_cache.rb → http_cache_manager.rb} +1 -1
  21. data/examples/{basic_cookies.rb → http_cookie_manager.rb} +1 -1
  22. data/examples/{basic_http_request_defaults.rb → http_request_defaults.rb} +3 -2
  23. data/examples/{basic_post.rb → http_request_post.rb} +1 -5
  24. data/examples/{basic_http_request_with_files.rb → http_request_with_files.rb} +1 -1
  25. data/examples/{basic_query_params.rb → http_request_with_query_params.rb} +1 -1
  26. data/examples/{basic_gc_results.rb → jmeter_plugins_graphs.rb} +1 -2
  27. data/examples/{basic_json_path_assertion.rb → json_path_assertions.rb} +1 -1
  28. data/examples/{basic_json_path_extractor.rb → json_path_extractor.rb} +1 -3
  29. data/examples/{basic_ldap_ext.rb → ldap_sampler.rb} +1 -1
  30. data/examples/{basic_loadosophia.rb → loadosophia.rb} +1 -1
  31. data/examples/{basic_loops.rb → loop_controller.rb} +2 -2
  32. data/examples/{basic_counter.rb → loops_with_counter.rb} +2 -2
  33. data/examples/{basic_perfmon.rb → perfmon.rb} +1 -1
  34. data/examples/real_page_objects.rb +1 -1
  35. data/examples/real_user_objects_github.rb +1 -1
  36. data/examples/regular_expression_extractor.rb +11 -0
  37. data/examples/{basic_assertion.rb → response_assertion.rb} +2 -1
  38. data/examples/{basic_response_time_percentiles_graph.rb → response_time_percentiles_graph.rb} +1 -2
  39. data/examples/{basic_simple_data_writer.rb → simple_data_writer_listener.rb} +1 -1
  40. data/examples/{basic_stepping_thread_group.rb → stepping_thread_group.rb} +1 -3
  41. data/examples/{basic_test_fragment.rb → test_fragment.rb} +1 -1
  42. data/examples/{basic_think_time.rb → think_time.rb} +2 -2
  43. data/examples/{basic_thread_groups.rb → thread_groups.rb} +1 -1
  44. data/examples/{basic_throughput_controller.rb → throughput_controller.rb} +1 -1
  45. data/examples/{basic_throughput_shaping_timer.rb → throughput_shaping_timer.rb} +1 -2
  46. data/examples/{basic_ultimate_thread_group.rb → ultimate_thread_group.rb} +1 -2
  47. data/examples/{basic_user_defined_variables.rb → user_defined_variables.rb} +1 -1
  48. data/examples/{basic_preprocessor_user_parameters.rb → user_parameters.rb} +7 -7
  49. data/lib/ruby-jmeter.rb +13 -8
  50. data/lib/ruby-jmeter/DSL.md +3 -1
  51. data/lib/ruby-jmeter/dsl.rb +11 -615
  52. data/lib/ruby-jmeter/dsl/foreach_controller.rb +0 -2
  53. data/lib/ruby-jmeter/dsl/html_parameter_mask.rb +3 -3
  54. data/lib/ruby-jmeter/dsl/http_request.rb +0 -2
  55. data/lib/ruby-jmeter/dsl/http_request_defaults.rb +0 -1
  56. data/lib/ruby-jmeter/dsl/jms_publisher.rb +2 -0
  57. data/lib/ruby-jmeter/dsl/regular_expression_extractor.rb +1 -3
  58. data/lib/ruby-jmeter/dsl/response_assertion.rb +0 -1
  59. data/lib/ruby-jmeter/dsl/test_fragment.rb +1 -1
  60. data/lib/ruby-jmeter/dsl/user_parameters.rb +3 -1
  61. data/lib/ruby-jmeter/extend/assertions/response_assertion.rb +36 -0
  62. data/lib/ruby-jmeter/extend/config_elements/header_manager.rb +13 -0
  63. data/lib/ruby-jmeter/extend/config_elements/http_cache_manager.rb +11 -0
  64. data/lib/ruby-jmeter/extend/config_elements/http_cookie_manager.rb +11 -0
  65. data/lib/ruby-jmeter/extend/config_elements/http_request_defaults.rb +28 -0
  66. data/lib/ruby-jmeter/extend/config_elements/user_defined_variables.rb +13 -0
  67. data/lib/ruby-jmeter/extend/config_elements/user_parameters.rb +31 -0
  68. data/lib/ruby-jmeter/extend/controllers/foreach_controller.rb +25 -0
  69. data/lib/ruby-jmeter/extend/controllers/loop_controller.rb +11 -0
  70. data/lib/ruby-jmeter/extend/controllers/module_controller.rb +23 -0
  71. data/lib/ruby-jmeter/extend/controllers/throughput_controller.rb +15 -0
  72. data/lib/ruby-jmeter/extend/controllers/transaction_controller.rb +14 -0
  73. data/lib/ruby-jmeter/extend/misc/aliases.rb +21 -0
  74. data/lib/ruby-jmeter/extend/misc/exists.rb +13 -0
  75. data/lib/ruby-jmeter/extend/misc/flood.rb +48 -0
  76. data/lib/ruby-jmeter/extend/misc/with_helpers.rb +27 -0
  77. data/lib/ruby-jmeter/extend/plugins/jmeter_plugins.rb +115 -0
  78. data/lib/ruby-jmeter/extend/processors/extract.rb +28 -0
  79. data/lib/ruby-jmeter/extend/processors/regular_expression_extractor.rb +25 -0
  80. data/lib/ruby-jmeter/extend/samplers/http_request.rb +47 -0
  81. data/lib/ruby-jmeter/extend/samplers/soapxmlrpc_request.rb +9 -0
  82. data/lib/ruby-jmeter/extend/threads/setup_thread_group.rb +18 -0
  83. data/lib/ruby-jmeter/extend/threads/thread_group.rb +19 -0
  84. data/lib/ruby-jmeter/extend/timers/constant_throughput_timer.rb +12 -0
  85. data/lib/ruby-jmeter/extend/timers/random_timer.rb +14 -0
  86. data/lib/ruby-jmeter/helpers/helper.rb +1 -2
  87. data/lib/ruby-jmeter/idl.xml +6 -4
  88. data/lib/ruby-jmeter/version.rb +1 -1
  89. data/ruby-jmeter.gemspec +7 -7
  90. data/spec/constant_throughput_timer_spec.rb +22 -0
  91. data/spec/header_manager_spec.rb +37 -0
  92. data/spec/http_cache_manager_spec.rb +17 -0
  93. data/spec/http_cookie_manager_spec.rb +17 -0
  94. data/spec/http_request_defaults_spec.rb +47 -0
  95. data/spec/http_request_spec.rb +305 -0
  96. data/spec/jmeter_plugins_spec.rb +155 -0
  97. data/spec/json_extractor_spec.rb +19 -0
  98. data/spec/json_path_assertion_spec.rb +28 -0
  99. data/spec/logic_controller_spec.rb +148 -0
  100. data/spec/loop_controller_spec.rb +19 -0
  101. data/spec/module_controller_spec.rb +56 -0
  102. data/spec/regular_expression_extractor_spec.rb +63 -0
  103. data/spec/response_assertion_spec.rb +69 -0
  104. data/spec/setup_thread_group_spec.rb +31 -0
  105. data/spec/thread_group_spec.rb +57 -0
  106. data/spec/throughput_controller_spec.rb +24 -0
  107. data/spec/transaction_controller_spec.rb +30 -0
  108. data/spec/user_defined_variables_spec.rb +22 -0
  109. data/spec/user_parameters_spec.rb +45 -0
  110. data/spec/with_helpers_spec.rb +57 -0
  111. data/spec/xpath_extractor_spec.rb +15 -0
  112. metadata +87 -59
  113. data/examples/basic_flood.rb +0 -12
  114. data/examples/basic_flood_real.rb +0 -7
  115. data/examples/basic_flood_with_csv.rb +0 -16
  116. data/examples/basic_google.rb +0 -8
  117. data/examples/basic_har.json +0 -4252
  118. data/examples/basic_har.rb +0 -34
  119. data/examples/basic_meta_fu.rb +0 -63
  120. data/examples/basic_response_assertion.rb +0 -13
  121. data/examples/basic_run.rb +0 -12
  122. data/examples/basic_testdata.rb +0 -60
  123. data/examples/demo.csv +0 -3
  124. data/examples/real_flood_test.rb +0 -14
  125. data/examples/real_flood_test_data.rb +0 -15
  126. data/examples/real_immi.gov.au_visa.rb +0 -78
  127. data/lib/ruby-jmeter/helpers/jmeter.properties +0 -28
  128. data/spec/dsl_spec.rb +0 -1157
  129. data/spec/stub.rb +0 -31
@@ -16,6 +16,5 @@ test do
16
16
  transaction name: 'Google Search' do
17
17
  visit name: 'Home Page', url: 'http://google.com/'
18
18
  end
19
-
20
19
  end
21
- end.run(path: '/usr/share/jmeter-2.13/bin/', gui: true)
20
+ end.run(path: '/usr/share/jmeter/bin/', gui: true)
@@ -35,5 +35,4 @@ test do
35
35
  get name: 'home', url: '/'
36
36
 
37
37
  end
38
-
39
- end.run(path: '/usr/share/jmeter-2.13/bin/', gui: true)
38
+ end.run(path: '/usr/share/jmeter/bin/', gui: true)
@@ -7,4 +7,4 @@ test do
7
7
  { name: 'email', value: 'support@flood.io' },
8
8
  { name: 'password', value: 'password' }
9
9
  ]
10
- end.run(path: '/usr/share/jmeter-2.13/bin/', gui: true)
10
+ end.run(path: '/usr/share/jmeter/bin/', gui: true)
@@ -7,15 +7,15 @@ test do
7
7
  user_parameters names: ['name1', 'name2'],
8
8
  thread_values: {
9
9
  user_1: [
10
- 'value1',
11
- 'value2'
10
+ 'user1_value1',
11
+ 'user1_value2'
12
12
  ],
13
13
 
14
14
  user_2: [
15
- 'value1',
16
- 'value2'
15
+ 'user2_value1',
16
+ 'user2_value2'
17
17
  ]
18
- }
18
+ },
19
+ per_iteration: true
19
20
  end
20
- # end.run(path: '/usr/share/jmeter-2.13/bin/', gui: true)
21
- end.out
21
+ end.run(path: '/usr/share/jmeter/bin/', gui: true)
data/lib/ruby-jmeter.rb CHANGED
@@ -5,18 +5,23 @@ require 'cgi'
5
5
  require 'open3'
6
6
 
7
7
  require 'ruby-jmeter/version'
8
- require 'ruby-jmeter/helpers/helper'
9
- require 'ruby-jmeter/helpers/parser'
10
- require 'ruby-jmeter/helpers/fallback_content_proxy'
11
- require 'ruby-jmeter/helpers/logger-colors'
12
- require 'ruby-jmeter/helpers/strip-heredoc'
13
- require 'ruby-jmeter/helpers/user-agents'
14
8
 
15
9
  lib = File.dirname(File.absolute_path(__FILE__))
16
- Dir.glob(lib + '/ruby-jmeter/dsl/*').each do |file|
10
+
11
+ Dir.glob(lib + '/ruby-jmeter/helpers/**/*.rb').each do |file|
17
12
  require file
18
13
  end
19
- Dir.glob(lib + '/ruby-jmeter/plugins/*').each do |file|
14
+
15
+ Dir.glob(lib + '/ruby-jmeter/dsl/**/*.rb').each do |file|
16
+ require file
17
+ end
18
+
19
+ Dir.glob(lib + '/ruby-jmeter/extend/**/*.rb').each do |file|
20
20
  require file
21
21
  end
22
+
23
+ Dir.glob(lib + '/ruby-jmeter/plugins/**/*.rb').each do |file|
24
+ require file
25
+ end
26
+
22
27
  require 'ruby-jmeter/dsl'
@@ -223,6 +223,8 @@
223
223
  `monitor_results`
224
224
  - Response Time Graph
225
225
  `response_time_graph`
226
+ - Response Time Graph
227
+ `response_time_graph`
226
228
  - Save Responses to a file
227
229
  `save_responses_to_a_file`
228
230
  - Simple Data Writer
@@ -234,4 +236,4 @@
234
236
  - View Results in Table
235
237
  `view_results_in_table`
236
238
  - View Results Tree
237
- `view_results_tree`
239
+ `view_results_tree`
@@ -6,7 +6,7 @@ module RubyJmeter
6
6
  def initialize(params = {})
7
7
  @root = Nokogiri::XML(<<-EOF.strip_heredoc)
8
8
  <?xml version="1.0" encoding="UTF-8"?>
9
- <jmeterTestPlan version="1.2" properties="2.8" jmeter="2.13" ruby-jmeter="2.13.0">
9
+ <jmeterTestPlan version="1.2" properties="2.9" jmeter="3.0" ruby-jmeter="3.0">
10
10
  <hashTree>
11
11
  </hashTree>
12
12
  </jmeterTestPlan>
@@ -17,519 +17,8 @@ module RubyJmeter
17
17
  @current_node = attach_to_last(node)
18
18
  end
19
19
 
20
- ##
21
- # Config Elements
22
-
23
- def user_defined_variables(params, &block)
24
- if params.is_a?(Hash)
25
- params['Argument.name'] = params[:name]
26
- end
27
- super
28
- end
29
-
30
- alias_method :variables, :user_defined_variables
31
-
32
- def http_request_defaults(params = {}, &block)
33
- params[:image_parser] = true if params.keys.include? :download_resources
34
- params[:concurrentDwn] = true if params.keys.include? :use_concurrent_pool
35
- params[:concurrentPool] = params[:use_concurrent_pool] if params.keys.include? :use_concurrent_pool
36
- params[:embedded_url_re] = params[:urls_must_match] if params.keys.include? :urls_must_match
37
- super
38
- end
39
-
40
- alias_method :defaults, :http_request_defaults
41
-
42
- def http_cookie_manager(params = {}, &block)
43
- params[:clearEachIteration] = true if params.keys.include? :clear_each_iteration
44
- super
45
- end
46
-
47
- alias_method :cookies, :http_cookie_manager
48
-
49
- def http_cache_manager(params = {}, &block)
50
- params[:clearEachIteration] = true if params.keys.include? :clear_each_iteration
51
- super
52
- end
53
-
54
- alias_method :cache, :http_cache_manager
55
-
56
- def with_user_agent(device)
57
- http_header_manager name: 'User-Agent',
58
- value: RubyJmeter::UserAgent.new(device).string
59
- end
60
-
61
- def with_browser(device)
62
- http_header_manager name: 'User-Agent',
63
- value: RubyJmeter::UserAgent.new(device).string
64
- http_header_manager [
65
- { name: 'Accept-Encoding', value: 'gzip,deflate,sdch' },
66
- { name: 'Accept', value: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' }
67
- ]
68
- end
69
-
70
- def http_header_manager(params, &block)
71
- if params.is_a?(Hash)
72
- params['Header.name'] = params[:name]
73
- end
74
- super
75
- end
76
-
77
- alias_method :header, :http_header_manager
78
-
79
- alias_method :auth, :http_authorization_manager
80
-
81
- def thread_group(*args, &block)
82
- params = args.shift || {}
83
- params = { count: params }.merge(args.shift || {}) if params.class == Fixnum
84
- params[:num_threads] = params[:count] || 1
85
- params[:ramp_time] = params[:rampup] || (params[:num_threads]/2.0).ceil
86
- params[:start_time] = params[:start_time] || Time.now.to_i * 1000
87
- params[:end_time] = params[:end_time] || Time.now.to_i * 1000
88
- params[:duration] ||= 60
89
- params[:continue_forever] ||= false
90
- params[:loops] = -1 if params[:continue_forever]
91
- node = RubyJmeter::ThreadGroup.new(params)
92
- attach_node(node, &block)
93
- end
94
-
95
- alias_method :threads, :thread_group
96
-
97
- def setup_thread_group(*args, &block)
98
- params = args.shift || {}
99
- params = { count: params }.merge(args.shift || {}) if params.class == Fixnum
100
- params[:num_threads] = params[:count] || 1
101
- params[:ramp_time] = params[:rampup] || (params[:num_threads]/2.0).ceil
102
- params[:start_time] = params[:start_time] || Time.now.to_i * 1000
103
- params[:end_time] = params[:end_time] || Time.now.to_i * 1000
104
- params[:duration] ||= 60
105
- params[:continue_forever] ||= false
106
- params[:loops] = -1 if params[:continue_forever]
107
- node = RubyJmeter::SetupThreadGroup.new(params)
108
- attach_node(node, &block)
109
- end
110
-
111
- ##
112
- # HTTP Samplers
113
-
114
- def get(*args, &block)
115
- params = args.shift || {}
116
- params = { url: params }.merge(args.shift || {}) if params.class == String
117
- params[:method] ||= 'GET'
118
- params[:name] ||= params[:url]
119
- parse_http_request(params)
120
- node = RubyJmeter::HttpRequest.new(params)
121
- attach_node(node, &block)
122
- end
123
-
124
- alias_method :visit, :get
125
-
126
- def post(*args, &block)
127
- params = args.shift || {}
128
- params = { url: params }.merge(args.shift || {}) if params.class == String
129
- params[:method] ||= 'POST'
130
- params[:name] ||= params[:url]
131
- parse_http_request(params)
132
- node = RubyJmeter::HttpRequest.new(params)
133
- attach_node(node, &block)
134
- end
135
-
136
- alias_method :submit, :post
137
-
138
- def delete(*args, &block)
139
- params = args.shift || {}
140
- params = { url: params }.merge(args.shift || {}) if params.class == String
141
- params[:method] ||= 'DELETE'
142
- params[:name] ||= params[:url]
143
- parse_http_request(params)
144
- node = RubyJmeter::HttpRequest.new(params)
145
- attach_node(node, &block)
146
- end
147
-
148
- def put(*args, &block)
149
- params = args.shift || {}
150
- params = { url: params }.merge(args.shift || {}) if params.class == String
151
- params[:method] ||= 'PUT'
152
- params[:name] ||= params[:url]
153
- parse_http_request(params)
154
- node = RubyJmeter::HttpRequest.new(params)
155
- attach_node(node, &block)
156
- end
157
-
158
- def patch(*args, &block)
159
- params = args.shift || {}
160
- params = { url: params }.merge(args.shift || {}) if params.class == String
161
- params[:method] ||= 'PATCH'
162
- params[:name] ||= params[:url]
163
- parse_http_request(params)
164
- node = RubyJmeter::HttpRequest.new(params)
165
- attach_node(node, &block)
166
- end
167
-
168
- def head(*args, &block)
169
- params = args.shift || {}
170
- params = { url: params }.merge(args.shift || {}) if params.class == String
171
- params[:method] ||= 'HEAD'
172
- params[:name] ||= params[:url]
173
- parse_http_request(params)
174
- node = RubyJmeter::HttpRequest.new(params)
175
- attach_node(node, &block)
176
- end
177
-
178
- def with_xhr
179
- http_header_manager name: 'X-Requested-With',
180
- value: 'XMLHttpRequest'
181
- end
182
-
183
- def with_gzip
184
- http_header_manager name: 'Accept-Encoding',
185
- value: 'gzip, deflate'
186
- end
187
-
188
- def with_json
189
- http_header_manager name: 'Accept',
190
- value: 'text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8, application/json'
191
- end
192
-
193
- def test_data(*args, &block)
194
- params = args.shift || {}
195
- params = { key: params.to_s }.merge(args.shift || {}) if(params.class == String || params.class == Symbol)
196
- params[:command] ||= 'SRANDMEMBER'
197
- params[:name] ||= 'testdata'
198
- params[:regex] ||= '"(.+?)"'
199
- params[:match_num] ||= -1
200
- params[:default] ||= ''
201
-
202
- params[:host] ||= '54.252.206.143'
203
-
204
- params[:url] = params[:key] if URI.parse(URI::encode(params[:key])).scheme
205
-
206
- params[:url] = if params[:host]
207
- "http://#{params[:host]}/data/#{params[:command]}/#{params[:key]}?type=text"
208
- end
209
-
210
- params[:url] = 'http://54.252.206.143/data/' if params[:stub]
211
-
212
- get name: '__testdata', url: params[:url] do
213
- extract name: params[:name],
214
- regex: params[:regex],
215
- match_num: params[:match_num],
216
- default: params[:default]
217
- end
218
- end
219
-
220
- ##
221
- # Other Samplers
222
-
223
- def soapxmlrpc_request(params, &block)
224
- params[:method] ||= 'POST'
225
- super
226
- end
227
-
228
- alias_method :soap, :soapxmlrpc_request
229
-
230
- alias_method :ldap, :ldap_request
231
-
232
- alias_method :ldap_ext, :ldap_extended_request
233
-
234
- alias_method :ldap_extended, :ldap_extended_request
235
-
236
- ##
237
- # Controllers
238
-
239
- def transaction_controller(*args, &block)
240
- params = args.shift || {}
241
- params = { name: params }.merge(args.shift || {}) if params.class == String
242
- params[:parent] = params[:parent] || false
243
- params[:includeTimers] = params[:include_timers] || false
244
- node = RubyJmeter::TransactionController.new(params)
245
- attach_node(node, &block)
246
- end
247
-
248
- alias_method :transaction, :transaction_controller
249
-
250
- def exists(variable, &block)
251
- params ||= {}
252
- params[:condition] = "\"${#{variable}}\" != \"\\${#{variable}}\""
253
- params[:useExpression] = false
254
- params[:name] = "if ${#{variable}}"
255
- node = RubyJmeter::IfController.new(params)
256
- attach_node(node, &block)
257
- end
258
-
259
- alias_method :If, :if_controller
260
-
261
- def loop_controller(params, &block)
262
- params[:loops] = params[:count] || 1
263
- super
264
- end
265
-
266
- alias_method :Loop, :loop_controller
267
-
268
- def throughput_controller(params, &block)
269
- params[:style] = 1 if params[:percent]
270
- params[:maxThroughput] = params[:total] || params[:percent] || 1
271
-
272
- node = RubyJmeter::ThroughputController.new(params)
273
- node.doc.xpath(".//FloatProperty/value").first.content = params[:maxThroughput].to_f
274
-
275
- attach_node(node, &block)
276
- end
277
-
278
- alias_method :Throughput, :throughput_controller
279
-
280
- alias_method :Switch, :switch_controller
281
-
282
- alias_method :While, :while_controller
283
-
284
- alias_method :Interleave, :random_controller
285
-
286
- alias_method :Random_order, :random_order_controller
287
-
288
- alias_method :Simple, :simple_controller
289
-
290
- alias_method :Once, :once_only_controller
291
-
292
- ##
293
- # Listeners
294
-
295
- alias_method :view_results, :view_results_tree
296
-
297
- alias_method :log, :simple_data_writer
298
-
299
- alias_method :response_graph, :response_time_graph
300
-
301
- ##
302
- # Other Elements
303
-
304
- def module_controller(params, &block)
305
- node = RubyJmeter::ModuleController.new(params)
306
-
307
- if params[:test_fragment]
308
- params[:test_fragment].kind_of?(String) &&
309
- params[:test_fragment].split('/')
310
- elsif params[:node_path]
311
- params[:node_path]
312
- else
313
- []
314
- end.each_with_index do |node_name, index|
315
- node.doc.at_xpath('//collectionProp') <<
316
- Nokogiri::XML(<<-EOS.strip_heredoc).children
317
- <stringProp name="node_#{index}">#{node_name}</stringProp>
318
- EOS
319
- end
320
-
321
- attach_node(node, &block)
322
- end
323
-
324
- def user_parameters(params, &block)
325
- if params.is_a?(Hash)
326
- params['Argument.name'] = params[:name]
327
- end
328
-
329
- params[:names] = Nokogiri::XML::Builder.new do |b|
330
- b.builder do
331
- params[:names].each do |name|
332
- b.stringProp name, name: name
333
- end
334
- end
335
- end
336
-
337
- params[:thread_values] = Nokogiri::XML::Builder.new do |b|
338
- b.builder do
339
- params[:thread_values].map do |user, values|
340
- b.collectionProp name: user do
341
- values.each_with_index.map do |value, index|
342
- b.stringProp value, name: index
343
- end
344
- end
345
- end
346
- end
347
- end
348
-
349
- super
350
- end
351
-
352
- alias_method :bsh_pre, :beanshell_preprocessor
353
-
354
- alias_method :bsh_post, :beanshell_postprocessor
355
-
356
- def extract(params, &block)
357
- node = if params[:regex]
358
- params[:refname] = params[:name]
359
- params[:regex] = params[:regex] #CGI.escapeHTML
360
- params[:template] = params[:template] || "$1$"
361
- RubyJmeter::RegularExpressionExtractor.new(params)
362
- elsif params[:xpath]
363
- params[:refname] = params[:name]
364
- params[:xpathQuery] = params[:xpath]
365
- RubyJmeter::XpathExtractor.new(params)
366
- elsif params[:json]
367
- params[:VAR] = params[:name]
368
- params[:JSONPATH] = params[:json]
369
- RubyJmeter::Plugins::JsonPathExtractor.new(params)
370
- elsif params[:css]
371
- params[:refname] = params[:name]
372
- params[:expr] = params[:css]
373
- RubyJmeter::CssjqueryExtractor.new(params)
374
- end
375
- attach_node(node, &block)
376
- end
377
-
378
- alias_method :web_reg_save_param, :extract
379
-
380
- def random_timer(delay=0, range=0, &block)
381
- params = {}
382
- params[:delay] = delay
383
- params[:range] = range
384
- node = RubyJmeter::GaussianRandomTimer.new(params)
385
- attach_node(node, &block)
386
- end
387
-
388
- alias_method :think_time, :random_timer
389
-
390
- def constant_throughput_timer(params, &block)
391
- params[:value] ||= params[:throughput] || 0.0
392
-
393
- node = RubyJmeter::ConstantThroughputTimer.new(params)
394
- node.doc.xpath('.//value').first.content = params[:value].to_f
395
-
396
- attach_node(node, &block)
397
- end
398
-
399
- alias_method :ConstantThroughputTimer, :constant_throughput_timer
400
-
401
- def response_assertion(params = {}, &block)
402
- params[:test_type] = parse_test_type(params)
403
- params['0'] = params.values.first
404
- node = params[:json] ? json_path_assertion(params) : assertion(params)
405
- attach_node(node, &block)
406
- end
407
-
408
- alias_method :assert, :response_assertion
409
-
410
- alias_method :web_reg_find, :response_assertion
411
-
412
- ##
413
- # JMeter Plugins
414
-
415
- def response_codes_per_second(name = 'Response Codes per Second', params = {}, &block)
416
- node = RubyJmeter::Plugins::ResponseCodesPerSecond.new(name, params)
417
- attach_node(node, &block)
418
- end
419
-
420
- def response_times_distribution(name = 'Response Times Distribution', params = {}, &block)
421
- node = RubyJmeter::Plugins::ResponseTimesDistribution.new(name, params)
422
- attach_node(node, &block)
423
- end
424
-
425
- def response_times_over_time(name = 'Response Times Over Time', params = {}, &block)
426
- node = RubyJmeter::Plugins::ResponseTimesOverTime.new(name, params)
427
- attach_node(node, &block)
428
- end
429
-
430
- def response_times_percentiles(name = 'Response Times Percentiles', params = {}, &block)
431
- node = RubyJmeter::Plugins::ResponseTimesPercentiles.new(name, params)
432
- attach_node(node, &block)
433
- end
434
-
435
- def transactions_per_second(name = 'Transactions per Second', params = {}, &block)
436
- node = RubyJmeter::Plugins::TransactionsPerSecond.new(name, params)
437
- attach_node(node, &block)
438
- end
439
-
440
- def latencies_over_time(name = 'Response Latencies Over Time', params = {}, &block)
441
- node = RubyJmeter::Plugins::LatenciesOverTime.new(name, params)
442
- attach_node(node, &block)
443
- end
444
-
445
- def console_status_logger(name = 'Console Status Logger', params = {}, &block)
446
- node = RubyJmeter::Plugins::ConsoleStatusLogger.new(name, params)
447
- attach_node(node, &block)
448
- end
449
-
450
- alias_method :console, :console_status_logger
451
-
452
- def throughput_shaper(name = 'Throughput Shaping Timer', steps=[], params = {}, &block)
453
- node = RubyJmeter::Plugins::ThroughputShapingTimer.new(name, steps)
454
- attach_node(node, &block)
455
- end
456
-
457
- alias_method :shaper, :throughput_shaper
458
-
459
- def dummy_sampler(name = 'Dummy Sampler', params = {}, &block)
460
- node = RubyJmeter::Plugins::DummySampler.new(name, params)
461
- attach_node(node, &block)
462
- end
463
-
464
- alias_method :dummy, :dummy_sampler
465
-
466
- def stepping_thread_group(params = {}, &block)
467
- node = RubyJmeter::Plugins::SteppingThreadGroup.new(params)
468
- attach_node(node, &block)
469
- end
470
-
471
- alias_method :step, :stepping_thread_group
472
-
473
- def ultimate_thread_group(threads = [], params = {}, &block)
474
- node = RubyJmeter::Plugins::UltimateThreadGroup.new(params)
475
-
476
- threads.each_with_index do |group, index|
477
- node.doc.at_xpath('//collectionProp') <<
478
- Nokogiri::XML(<<-EOS.strip_heredoc).children
479
- <collectionProp name="index">
480
- <stringProp name="#{group[:start_threads]}">#{group[:start_threads]}</stringProp>
481
- <stringProp name="#{group[:initial_delay]}">#{group[:initial_delay]}</stringProp>
482
- <stringProp name="#{group[:start_time]}">#{group[:start_time]}</stringProp>
483
- <stringProp name="#{group[:hold_time]}">#{group[:hold_time]}</stringProp>
484
- <stringProp name="#{group[:stop_time]}">#{group[:stop_time]}</stringProp>
485
- </collectionProp>
486
- EOS
487
- end
488
-
489
- attach_node(node, &block)
490
- end
491
-
492
- alias_method :ultimate, :ultimate_thread_group
493
-
494
- def composite_graph(name, params = {}, &block)
495
- node = RubyJmeter::Plugins::CompositeGraph.new(name, params)
496
- attach_node(node, &block)
497
- end
498
-
499
- alias_method :composite, :composite_graph
500
-
501
- def active_threads_over_time(params = {}, &block)
502
- node = RubyJmeter::Plugins::ActiveThreadsOverTime.new(params)
503
- attach_node(node, &block)
504
- end
505
-
506
- alias_method :active_threads, :active_threads_over_time
507
-
508
- def perfmon_collector(params = {}, &block)
509
- node = RubyJmeter::Plugins::PerfmonCollector.new(params)
510
- attach_node(node, &block)
511
- end
512
-
513
- alias_method :perfmon, :perfmon_collector
514
-
515
- def loadosophia_uploader(name = "Loadosophia.org Uploader", params = {}, &block)
516
- node = RubyJmeter::Plugins::LoadosophiaUploader.new(name, params)
517
- attach_node(node, &block)
518
- end
519
-
520
- alias_method :loadosophia, :loadosophia_uploader
521
-
522
- def redis_data_set(params = {}, &block)
523
- node = RubyJmeter::Plugins::RedisDataSet.new(params)
524
- attach_node(node, &block)
525
- end
526
-
527
-
528
-
529
- # API Methods
530
-
531
20
  def out(params = {})
532
- puts doc.to_xml(:indent => 2)
21
+ puts doc.to_xml(indent: 2)
533
22
  end
534
23
 
535
24
  def jmx(params = {})
@@ -538,7 +27,7 @@ module RubyJmeter
538
27
  end
539
28
 
540
29
  def to_xml
541
- doc.to_xml(:indent => 2)
30
+ doc.to_xml(indent: 2)
542
31
  end
543
32
 
544
33
  def to_doc
@@ -547,16 +36,9 @@ module RubyJmeter
547
36
 
548
37
  def run(params = {})
549
38
  file(params)
550
- logger.warn "Test executing locally ..."
551
- properties = params.has_key?(:properties) ? build_properties(params[:properties]) : "-q #{File.dirname(__FILE__)}/helpers/jmeter.properties"
552
-
553
- if params[:remote_hosts]
554
- remote_hosts = params[:remote_hosts]
555
- remote_hosts = remote_hosts.join(',') if remote_hosts.kind_of?(Array)
556
- remote_hosts = "-R #{remote_hosts}"
557
- end
39
+ logger.warn 'Test executing locally ...'
558
40
 
559
- cmd = "#{params[:path]}jmeter #{"-n" unless params[:gui] } -t #{params[:file]} -j #{params[:log] ? params[:log] : 'jmeter.log' } -l #{params[:jtl] ? params[:jtl] : 'jmeter.jtl' } #{properties} #{remote_hosts}"
41
+ cmd = "#{params[:path]}jmeter #{"-n" unless params[:gui] } -t #{params[:file]} -j #{params[:log] ? params[:log] : 'jmeter.log' } -l #{params[:jtl] ? params[:jtl] : 'jmeter.jtl' }"
560
42
  logger.debug cmd if params[:debug]
561
43
  Open3.popen2e("#{cmd}") do |stdin, stdout_err, wait_thr|
562
44
  while line = stdout_err.gets
@@ -569,65 +51,6 @@ module RubyJmeter
569
51
  logger.info "Local Results at: #{params[:jtl] ? params[:jtl] : 'jmeter.jtl'}"
570
52
  end
571
53
 
572
- def flood(token, params = {})
573
- if params[:region] == 'local'
574
- logger.info 'Starting test ...'
575
- params[:started] = Time.now
576
- run params
577
- params[:stopped] = Time.now
578
- logger.info 'Completed test ...'
579
- logger.debug 'Uploading results ...' if params[:debug]
580
- end
581
- RestClient.proxy = params[:proxy] if params[:proxy]
582
- begin
583
- file = Tempfile.new(['jmeter', '.jmx'])
584
- file.write(doc.to_xml(:indent => 2))
585
- file.rewind
586
-
587
- flood_files = {
588
- file: File.new("#{file.path}", 'rb')
589
- }
590
-
591
- if params[:files]
592
- flood_files.merge!(Hash[params[:files].map.with_index { |value, index| [index, File.new(value, 'rb')] }])
593
- params.delete(:files)
594
- end
595
-
596
- response = RestClient.post "#{params[:endpoint] ? params[:endpoint] : 'https://api.flood.io'}/floods?auth_token=#{token}",
597
- {
598
- :flood => {
599
- :tool => 'jmeter',
600
- :url => params[:url],
601
- :name => params[:name],
602
- :notes => params[:notes],
603
- :tag_list => params[:tag_list],
604
- :threads => params[:threads],
605
- :rampup => params[:rampup],
606
- :duration => params[:duration],
607
- :override_hosts => params[:override_hosts],
608
- :override_parameters => params[:override_parameters],
609
- # specials for API
610
- :started => params[:started],
611
- :stopped => params[:stopped]
612
- },
613
- :flood_files => flood_files,
614
- :results => (File.new("#{params[:jtl] ? params[:jtl] : 'jmeter.jtl'}", 'rb') if params[:region] == 'local'),
615
- :region => params[:region],
616
- :multipart => true,
617
- :content_type => 'application/octet-stream'
618
- }.merge(params)
619
- if response.code == 201
620
- logger.info "Flood results at: #{JSON.parse(response)["permalink"]}"
621
- else
622
- logger.fatal "Sorry there was an error: #{JSON.parse(response)["error"]}"
623
- end
624
- rescue => e
625
- logger.fatal "Sorry there was an error: #{JSON.parse(e.response)["error"]}"
626
- end
627
- end
628
-
629
- alias_method :grid, :flood
630
-
631
54
  private
632
55
 
633
56
  def hash_tree
@@ -635,61 +58,34 @@ module RubyJmeter
635
58
  end
636
59
 
637
60
  def attach_to_last(node)
638
- ht = hash_tree
61
+ ht = hash_tree
639
62
  last_node = @current_node
640
63
  last_node << node.doc.children << ht
641
64
  ht
642
65
  end
643
66
 
644
67
  def attach_node(node, &block)
645
- ht = attach_to_last(node)
646
- previous = @current_node
68
+ ht = attach_to_last(node)
69
+ previous = @current_node
647
70
  @current_node = ht
648
71
  instance_exec(&block) if block
649
72
  @current_node = previous
650
73
  end
651
74
 
652
75
  def file(params = {})
653
- params[:file] ||= 'jmeter.jmx'
654
- File.open(params[:file], 'w') { |file| file.write(doc.to_xml(:indent => 2)) }
76
+ params[:file] ||= 'ruby-jmeter.jmx'
77
+ File.open(params[:file], 'w') { |file| file.write(doc.to_xml(indent: 2)) }
655
78
  end
656
79
 
657
80
  def doc
658
81
  Nokogiri::XML(@root.to_s, &:noblanks)
659
82
  end
660
83
 
661
- def build_properties(properties)
662
- if properties.kind_of?(String)
663
- "-q #{properties}"
664
- elsif properties.kind_of?(Hash)
665
- properties.map{ |k,v| "-J#{k}=#{v}" }.join(" ")
666
- end
667
- end
668
-
669
84
  def logger
670
- @log ||= Logger.new(STDOUT)
85
+ @log ||= Logger.new(STDOUT)
671
86
  @log.level = Logger::DEBUG
672
87
  @log
673
88
  end
674
-
675
- def json_path_assertion(params)
676
- params[:EXPECTED_VALUE] = params[:value]
677
- params[:JSON_PATH] = params[:json]
678
- RubyJmeter::Plugins::JsonPathAssertion.new(params)
679
- end
680
-
681
- def assertion(params)
682
- RubyJmeter::ResponseAssertion.new(params).tap do |node|
683
- if params[:variable]
684
- params['Scope.variable'] = params[:variable]
685
- node.doc.xpath("//stringProp[@name='Assertion.scope']").first.content = 'variable'
686
- end
687
-
688
- if params[:scope] == 'main' || params['scope'] == 'main'
689
- node.doc.xpath("//stringProp[@name='Assertion.scope']").remove
690
- end
691
- end
692
- end
693
89
  end
694
90
  end
695
91