Class: Gridinit::Jmeter::ExtendedDSL

Inherits:
DSL
  • Object
show all
Includes:
Parser
Defined in:
lib/gridinit-jmeter/dsl.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Parser

#fill_in, #parse_http_request, #parse_test_type, #parse_uri, #parse_url, #raw_body

Methods inherited from DSL

#access_log_sampler, #aggregate_graph, #aggregate_report, #ajp13_sampler, #assertion_results, #beanshell_assertion, #beanshell_listener, #beanshell_postprocessor, #beanshell_preprocessor, #beanshell_sampler, #beanshell_timer, #bsf_assertion, #bsf_listener, #bsf_postprocessor, #bsf_preprocessor, #bsf_sampler, #bsf_timer, #compare_assertion, #comparison_assertion_visualizer, #constant_throughput_timer, #constant_timer, #counter, #cssjquery_extractor, #csv_data_set_config, #debug_postprocessor, #debug_sampler, #distribution_graphalpha, #duration_assertion, #foreach_controller, #ftp_request, #ftp_request_defaults, #gaussian_random_timer, #generate_summary_results, #graph_results, #html_assertion, #html_link_parser, #html_parameter_mask, #http_authorization_manager, #http_request, #http_request_defaults, #http_url_rewriting_modifier, #if_controller, #include_controller, #java_request, #java_request_defaults, #jdbc_connection_configuration, #jdbc_postprocessor, #jdbc_preprocessor, #jdbc_request, #jms_pointtopoint, #jms_publisher, #jms_subscriber, #jsr223_assertion, #jsr223_listener, #jsr223_postprocessor, #jsr223_preprocessor, #jsr223_sampler, #jsr223_timer, #junit_request, #keystore_configuration, #ldap_extended_request, #ldap_extended_request_defaults, #ldap_request, #ldap_request_defaults, #login_config_element, #mail_reader_sampler, #mailer_visualizer, #md5hex_assertion, #module_controller, #monitor_results, #once_only_controller, #os_process_sampler, #poisson_random_timer, #random_controller, #random_order_controller, #random_variable, #recording_controller, #regex_user_parameters, #regular_expression_extractor, #response_time_graph, #result_status_action_handler, #runtime_controller, #save_responses_to_a_file, #simple_config_element, #simple_controller, #simple_data_writer, #smime_assertion, #smtp_sampler, #spline_visualizer, #summary_report, #switch_controller, #synchronizing_timer, #tcp_sampler, #tcp_sampler_config, #test_action, #test_plan, #uniform_random_timer, #user_parameters, #view_results_in_table, #view_results_tree, #while_controller, #xml_assertion, #xml_schema_assertion, #xpath_assertion, #xpath_extractor

Constructor Details

#initialize(params = {}) ⇒ ExtendedDSL

Returns a new instance of ExtendedDSL.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/gridinit-jmeter/dsl.rb', line 9

def initialize(params = {})
  @root = Nokogiri::XML(<<-EOF.strip_heredoc)
    <?xml version="1.0" encoding="UTF-8"?>
    <jmeterTestPlan version="1.2" properties="2.1">
    <hashTree>
    </hashTree>
    </jmeterTestPlan>
  EOF
  node = Gridinit::Jmeter::TestPlan.new(params)

  @current_node = @root.at_xpath("//jmeterTestPlan/hashTree")
  @current_node = attach_to_last(node)

  variables :name     => 'testguid',
            :value    => '${__P(testguid,${__time(,)})}',
            :comments => 'Gridinit testguid automatically generated by DSL'
end

Instance Attribute Details

#rootObject

Returns the value of attribute root.



7
8
9
# File 'lib/gridinit-jmeter/dsl.rb', line 7

def root
  @root
end

Instance Method Details

#console_status_logger(name = "jp@gc - Console Status Logger", params = {}, &block) ⇒ Object Also known as: console



294
295
296
297
# File 'lib/gridinit-jmeter/dsl.rb', line 294

def console_status_logger(name="jp@gc - Console Status Logger", params={}, &block)
  node = Gridinit::Jmeter::GCConsoleStatusLogger.new(name, params)
  attach_node(node, &block)
end

#delete(*args, &block) ⇒ Object



110
111
112
113
114
115
116
117
118
# File 'lib/gridinit-jmeter/dsl.rb', line 110

def delete(*args, &block)
  params = args.shift || {}
  params = { url: params }.merge(args.shift || {}) if params.class == String
  params[:method] ||= 'DELETE'
  params[:name] ||= params[:url]
  parse_http_request(params)
  node = Gridinit::Jmeter::HttpRequest.new(params)
  attach_node(node, &block)
end

#dummy_sampler(name = "jp@gc - Dummy Sampler", params = {}, &block) ⇒ Object Also known as: dummy



308
309
310
311
# File 'lib/gridinit-jmeter/dsl.rb', line 308

def dummy_sampler(name="jp@gc - Dummy Sampler", params={}, &block)
  node = Gridinit::Jmeter::GCDummySampler.new(name, params)
  attach_node(node, &block)
end

#exists(variable, &block) ⇒ Object



166
167
168
169
170
171
# File 'lib/gridinit-jmeter/dsl.rb', line 166

def exists(variable, &block)
  params ||= {}
  params[:condition] = "'${#{variable}}'.length > 0"
  node = Gridinit::Jmeter::IfController.new(params)
  attach_node(node, &block)
end

#extract(params, &block) ⇒ Object Also known as: web_reg_save_param



222
223
224
225
226
227
228
229
230
231
232
233
234
# File 'lib/gridinit-jmeter/dsl.rb', line 222

def extract(params, &block)
  node = if params[:regex]
    params[:refname] = params[:name]
    params[:regex] = params[:regex] #CGI.escapeHTML 
    params[:template] = params[:template] || "$1$"
    Gridinit::Jmeter::RegularExpressionExtractor.new(params)
  else
    params[:refname] = params[:name]
    params[:xpathQuery] = params[:xpath]
    Gridinit::Jmeter::XpathExtractor.new(params)
  end
  attach_node(node, &block)
end

#get(*args, &block) ⇒ Object Also known as: visit

HTTP Samplers



86
87
88
89
90
91
92
93
94
# File 'lib/gridinit-jmeter/dsl.rb', line 86

def get(*args, &block)
  params = args.shift || {}
  params = { url: params }.merge(args.shift || {}) if params.class == String
  params[:method] ||= 'GET'
  params[:name] ||= params[:url]
  parse_http_request(params)
  node = Gridinit::Jmeter::HttpRequest.new(params)
  attach_node(node, &block)
end

#grid(token, params = {}) ⇒ Object



352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
# File 'lib/gridinit-jmeter/dsl.rb', line 352

def grid(token, params={})
  if params[:region] == 'local'
    logger.info "Starting test ..."
    params[:started] = Time.now
    run params
    params[:completed] = Time.now
    logger.info "Completed test ..."
    logger.debug "Uploading results ..." if params[:debug]
  end
  RestClient.proxy = params[:proxy] if params[:proxy]
  begin
    file = Tempfile.new(['jmeter', '.jmx'])
    file.write(doc.to_xml(:indent => 2))
    file.rewind
    response = RestClient.post "http://#{params[:endpoint] ? params[:endpoint] : 'gridinit.com'}/api?token=#{token}&region=#{params[:region]}",
    {
      :name => 'attachment',
      :attachment => File.new("#{file.path}", 'rb'),
      :results => (File.new("#{params[:jtl] ? params[:jtl] : 'jmeter.jtl'}", 'rb') if params[:region] == 'local'),
      :multipart => true,
      :content_type => 'application/octet-stream',
      :started => params[:started],
      :completed => params[:completed]
    }
    logger.info "Grid Results at: #{JSON.parse(response)["results"]}" if response.code == 200
  rescue => e
    logger.fatal "There was an error: #{e.message}"
  end
end

#http_cache_manager(params = {}, &block) ⇒ Object Also known as: cache



46
47
48
49
# File 'lib/gridinit-jmeter/dsl.rb', line 46

def http_cache_manager(params={}, &block)
  params[:clearEachIteration] = true if params.keys.include? 'clear_each_iteration'
  super
end


39
40
41
42
# File 'lib/gridinit-jmeter/dsl.rb', line 39

def http_cookie_manager(params={}, &block)
  params[:clearEachIteration] = true if params.keys.include? 'clear_each_iteration'
  super
end

#http_header_manager(params, &block) ⇒ Object Also known as: header



58
59
60
61
# File 'lib/gridinit-jmeter/dsl.rb', line 58

def http_header_manager(params, &block)
  params['Header.name'] = params[:name]
  super
end

#jmx(params = {}) ⇒ Object



321
322
323
324
# File 'lib/gridinit-jmeter/dsl.rb', line 321

def jmx(params={})
  file(params)
  logger.info "Test plan saved to: #{params[:file]}"
end

#latencies_over_time(name = "jp@gc - Response Latencies Over Time", params = {}, &block) ⇒ Object



289
290
291
292
# File 'lib/gridinit-jmeter/dsl.rb', line 289

def latencies_over_time(name="jp@gc - Response Latencies Over Time", params={}, &block)
  node = Gridinit::Jmeter::GCLatenciesOverTime.new(name, params)
  attach_node(node, &block)
end

#loop_controller(params, &block) ⇒ Object Also known as: Loop



175
176
177
178
# File 'lib/gridinit-jmeter/dsl.rb', line 175

def loop_controller(params, &block)
  params[:loops] = params[:count] || 1
  super
end

#out(params = {}) ⇒ Object

API Methods



317
318
319
# File 'lib/gridinit-jmeter/dsl.rb', line 317

def out(params={})
  puts doc.to_xml(:indent => 2)
end

#post(*args, &block) ⇒ Object Also known as: submit



98
99
100
101
102
103
104
105
106
# File 'lib/gridinit-jmeter/dsl.rb', line 98

def post(*args, &block)
  params = args.shift || {}
  params = { url: params }.merge(args.shift || {}) if params.class == String
  params[:method] ||= 'POST'
  params[:name] ||= params[:url]
  parse_http_request(params)
  node = Gridinit::Jmeter::HttpRequest.new(params)
  attach_node(node, &block)
end

#put(*args, &block) ⇒ Object



120
121
122
123
124
125
126
127
128
# File 'lib/gridinit-jmeter/dsl.rb', line 120

def put(*args, &block)
  params = args.shift || {}
  params = { url: params }.merge(args.shift || {}) if params.class == String
  params[:method] ||= 'PUT'
  params[:name] ||= params[:url]
  parse_http_request(params)
  node = Gridinit::Jmeter::HttpRequest.new(params)
  attach_node(node, &block)
end

#random_timer(delay = 0, range = 0, &block) ⇒ Object Also known as: think_time



238
239
240
241
242
243
244
# File 'lib/gridinit-jmeter/dsl.rb', line 238

def random_timer(delay=0, range=0, &block)
  params={}
  params[:delay] = delay
  params[:range] = range
  node = Gridinit::Jmeter::GaussianRandomTimer.new(params)
  attach_node(node, &block)
end

#response_assertion(params = {}, &block) ⇒ Object Also known as: assert, web_reg_find



248
249
250
251
252
253
254
255
# File 'lib/gridinit-jmeter/dsl.rb', line 248

def response_assertion(params={}, &block)
  params[:test_type] = parse_test_type(params)
  params[:match] = params.values.first
  node = Gridinit::Jmeter::ResponseAssertion.new(params)
  node.doc.xpath("//stringProp[@name='Assertion.scope']").remove if
    params[:scope] == 'main' || params['scope'] == 'main'
  attach_node(node, &block)
end

#response_codes_per_second(name = "jp@gc - Response Codes per Second", params = {}, &block) ⇒ Object

JMeter Plugins



264
265
266
267
# File 'lib/gridinit-jmeter/dsl.rb', line 264

def response_codes_per_second(name="jp@gc - Response Codes per Second", params={}, &block)
  node = Gridinit::Jmeter::GCResponseCodesPerSecond.new(name, params)
  attach_node(node, &block)
end

#response_times_distribution(name = "jp@gc - Response Times Distribution", params = {}, &block) ⇒ Object



269
270
271
272
# File 'lib/gridinit-jmeter/dsl.rb', line 269

def response_times_distribution(name="jp@gc - Response Times Distribution", params={}, &block)
  node = Gridinit::Jmeter::GCResponseTimesDistribution.new(name, params)
  attach_node(node, &block)
end

#response_times_over_time(name = "jp@gc - Response Times Over Time", params = {}, &block) ⇒ Object



274
275
276
277
# File 'lib/gridinit-jmeter/dsl.rb', line 274

def response_times_over_time(name="jp@gc - Response Times Over Time", params={}, &block)
  node = Gridinit::Jmeter::GCResponseTimesOverTime.new(name, params)
  attach_node(node, &block)
end

#response_times_percentiles(name = "jp@gc - Response Times Percentiles", params = {}, &block) ⇒ Object



279
280
281
282
# File 'lib/gridinit-jmeter/dsl.rb', line 279

def response_times_percentiles(name="jp@gc - Response Times Percentiles", params={}, &block)
  node = Gridinit::Jmeter::GCResponseTimesPercentiles.new(name, params)
  attach_node(node, &block)
end

#run(params = {}) ⇒ Object



334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
# File 'lib/gridinit-jmeter/dsl.rb', line 334

def run(params={})
  file(params)
  logger.warn "Test executing locally ..."
  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' }"
  logger.debug cmd if params[:debug]
  Open3.popen2e("#{cmd} -q #{File.dirname(__FILE__)}/helpers/jmeter.properties") do |stdin, stdout_err, wait_thr|
    while line = stdout_err.gets
      logger.debug line.chomp if params[:debug]
    end

    exit_status = wait_thr.value
    unless exit_status.success?
      abort "FAILED !!! #{cmd}"
    end
  end
  logger.info "Local Results at: #{params[:jtl] ? params[:jtl] : 'jmeter.jtl'}"
end

#soapxmlrpc_request(params, &block) ⇒ Object Also known as: soap

Other Samplers



138
139
140
141
# File 'lib/gridinit-jmeter/dsl.rb', line 138

def soapxmlrpc_request(params, &block)
  params[:method] ||= 'POST'
  super
end

#thread_group(*args, &block) ⇒ Object Also known as: threads



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/gridinit-jmeter/dsl.rb', line 67

def thread_group(*args, &block)
  params = args.shift || {}
  params = { count: params }.merge(args.shift || {}) if params.class == Fixnum
  params[:num_threads]        = params[:count] || 1
  params[:ramp_time]          = params[:rampup] || (params[:num_threads]/2.0).ceil
  params[:start_time]         = params[:start_time] || Time.now.to_i * 1000
  params[:end_time]           = params[:end_time] || Time.now.to_i * 1000
  params[:duration]         ||= 60
  params[:continue_forever] ||= false
  params[:loops]              = -1 if params[:continue_forever]
  node = Gridinit::Jmeter::ThreadGroup.new(params)
  attach_node(node, &block)
end

#throughput_controller(params, &block) ⇒ Object Also known as: Throughput



182
183
184
185
186
187
188
189
190
# File 'lib/gridinit-jmeter/dsl.rb', line 182

def throughput_controller(params, &block)
  params[:style] = 1 if params[:percent]
  params[:maxThroughput] = params[:total] || params[:percent] || 1

  node = Gridinit::Jmeter::ThroughputController.new(params)
  node.doc.xpath(".//FloatProperty/value").first.content = params[:maxThroughput].to_f
 
  attach_node(node, &block)
end

#throughput_shaper(name = "jp@gc - Throughput Shaping Timer", steps = [], params = {}, &block) ⇒ Object Also known as: shaper



301
302
303
304
# File 'lib/gridinit-jmeter/dsl.rb', line 301

def throughput_shaper(name="jp@gc - Throughput Shaping Timer", steps=[], params={}, &block)
  node = Gridinit::Jmeter::GCThroughputShapingTimer.new(name, steps)
  attach_node(node, &block)
end

#to_docObject



330
331
332
# File 'lib/gridinit-jmeter/dsl.rb', line 330

def to_doc
  doc.clone
end

#to_xmlObject



326
327
328
# File 'lib/gridinit-jmeter/dsl.rb', line 326

def to_xml
  doc.to_xml(:indent => 2)
end

#transaction_controller(*args, &block) ⇒ Object Also known as: transaction

Controllers



155
156
157
158
159
160
161
162
# File 'lib/gridinit-jmeter/dsl.rb', line 155

def transaction_controller(*args, &block)
  params = args.shift || {}
  params = { name: params }.merge(args.shift || {}) if params.class == String
  params[:parent] ||= true
  params[:includeTimers] = params[:include_timers] || false
  node = Gridinit::Jmeter::TransactionController.new(params)
  attach_node(node, &block)
end

#transactions_per_second(name = "jp@gc - Transactions per Second", params = {}, &block) ⇒ Object



284
285
286
287
# File 'lib/gridinit-jmeter/dsl.rb', line 284

def transactions_per_second(name="jp@gc - Transactions per Second", params={}, &block)
  node = Gridinit::Jmeter::GCTransactionsPerSecond.new(name, params)
  attach_node(node, &block)
end

#user_defined_variables(params, &block) ⇒ Object Also known as: variables

Config Elements



30
31
32
33
# File 'lib/gridinit-jmeter/dsl.rb', line 30

def user_defined_variables(params, &block)
  params['Argument.name'] = params[:name]
  super
end

#with_user_agent(device) ⇒ Object



53
54
55
56
# File 'lib/gridinit-jmeter/dsl.rb', line 53

def with_user_agent(device)
  http_header_manager name: 'User-Agent', 
                      value: Gridinit::Jmeter::UserAgent.new(device).string
end

#with_xhrObject



130
131
132
133
# File 'lib/gridinit-jmeter/dsl.rb', line 130

def with_xhr
  http_header_manager name: 'X-Requested-With', 
                      value: 'XMLHttpRequest'
end