Class: JmeterPerf::ExtendedDSL

Inherits:
DSL
  • Object
show all
Includes:
Helpers::Parser
Defined in:
lib/jmeter_perf.rb,
lib/jmeter_perf/extend/misc/uuid.rb,
lib/jmeter_perf/extend/misc/rsync.rb,
lib/jmeter_perf/extend/misc/exists.rb,
lib/jmeter_perf/extend/misc/with_helpers.rb,
lib/jmeter_perf/extend/processors/extract.rb,
lib/jmeter_perf/extend/timers/random_timer.rb,
lib/jmeter_perf/extend/threads/thread_group.rb,
lib/jmeter_perf/extend/samplers/http_request.rb,
lib/jmeter_perf/extend/plugins/jmeter_plugins.rb,
lib/jmeter_perf/extend/samplers/jms_pointtopoint.rb,
lib/jmeter_perf/extend/controllers/loop_controller.rb,
lib/jmeter_perf/extend/samplers/soapxmlrpc_request.rb,
lib/jmeter_perf/extend/assertions/response_assertion.rb,
lib/jmeter_perf/extend/controllers/module_controller.rb,
lib/jmeter_perf/extend/config_elements/header_manager.rb,
lib/jmeter_perf/extend/controllers/foreach_controller.rb,
lib/jmeter_perf/extend/config_elements/user_parameters.rb,
lib/jmeter_perf/extend/timers/constant_throughput_timer.rb,
lib/jmeter_perf/extend/controllers/throughput_controller.rb,
lib/jmeter_perf/extend/config_elements/http_cache_manager.rb,
lib/jmeter_perf/extend/controllers/transaction_controller.rb,
lib/jmeter_perf/extend/config_elements/http_cookie_manager.rb,
lib/jmeter_perf/extend/config_elements/http_request_defaults.rb,
lib/jmeter_perf/extend/config_elements/user_defined_variables.rb,
lib/jmeter_perf/extend/processors/regular_expression_extractor.rb

Overview

DSL class for defining JMeter test plans. Provides methods to generate, save, and run JMeter tests.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from DSL

#access_log_sampler, #aggregate_graph, #aggregate_report, #ajp13_sampler, #assertion_results, #bean_shell_assertion, #bean_shell_listener, #bean_shell_postprocessor, #bean_shell_preprocessor, #bean_shell_sampler, #bean_shell_timer, #bsf_assertion, #bsf_listener, #bsf_postprocessor, #bsf_preprocessor, #bsf_sampler, #bsf_timer, #compare_assertion, #comparison_assertion_visualizer, #constant_timer, #counter, #css_jquery_extractor, #csv_data_set_config, #debug_postprocessor, #debug_sampler, #distribution_graphalpha, #duration_assertion, #for_each_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_url_rewriting_modifier, #if_controller, #include_controller, #j_unit_request, #java_request, #java_request_defaults, #jdbc_connection_configuration, #jdbc_postprocessor, #jdbc_preprocessor, #jdbc_request, #jms_pointto_point, #jms_publisher, #jms_subscriber, #json_path_postprocessor, #jsr223_assertion, #jsr223_listener, #jsr223_postprocessor, #jsr223_preprocessor, #jsr223_sampler, #jsr223_timer, #keystore_configuration, #ldap_extended_request, #ldap_extended_request_defaults, #ldap_request, #ldap_request_defaults, #login_config_element, #mail_reader_sampler, #mailer_visualizer, #md5_hex_assertion, #monitor_results, #once_only_controller, #os_process_sampler, #poisson_random_timer, #random_controller, #random_order_controller, #random_variable, #recording_controller, #reg_ex_user_parameters, #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, #soap_xml_rpc_request, #spline_visualizer, #summary_report, #switch_controller, #synchronizing_timer, #tcp_sampler, #tcp_sampler_config, #test_action, #test_fragment, #test_plan, #uniform_random_timer, #view_results_in_table, #view_results_tree, #while_controller, #x_path_assertion, #x_path_extractor, #xml_assertion, #xml_schema_assertion

Constructor Details

#initialize(params = {}) ⇒ ExtendedDSL

Initializes an ExtendedDSL object with the provided parameters.

Parameters:

  • params (Hash) (defaults to: {})

    Parameters for the test plan (default: ‘{}`).



60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/jmeter_perf.rb', line 60

def initialize(params = {})
  @root = Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
    <<-EOF
      <?xml version="1.0" encoding="UTF-8"?>
      <jmeterTestPlan version="1.2" properties="3.1" jmeter="3.1" jmeterperf="#{JmeterPerf::VERSION}">
      <hashTree>
      </hashTree>
      </jmeterTestPlan>
    EOF
  ))
  node = JmeterPerf::DSL::TestPlan.new(params)
  @current_node = @root.at_xpath("//jmeterTestPlan/hashTree")
  @current_node = attach_to_last(node)
end

Instance Attribute Details

#rootObject

Returns the value of attribute root.



56
57
58
# File 'lib/jmeter_perf.rb', line 56

def root
  @root
end

Instance Method Details

#active_threads_over_time(params = {}) ⇒ Object Also known as: active_threads



93
94
95
96
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 93

def active_threads_over_time(params = {}, &)
  node = JmeterPerf::Plugins::ActiveThreadsOverTime.new(params)
  attach_node(node, &)
end

#composite_graph(params = {}) ⇒ Object Also known as: composite



86
87
88
89
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 86

def composite_graph(params = {}, &)
  node = JmeterPerf::Plugins::CompositeGraph.new(params)
  attach_node(node, &)
end

#console_status_logger(params = {}) ⇒ Object Also known as: console



33
34
35
36
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 33

def console_status_logger(params = {}, &)
  node = JmeterPerf::Plugins::ConsoleStatusLogger.new(params)
  attach_node(node, &)
end

#constant_throughput_timer(params) ⇒ Object



3
4
5
6
7
8
9
# File 'lib/jmeter_perf/extend/timers/constant_throughput_timer.rb', line 3

def constant_throughput_timer(params, &)
  params[:value] ||= params[:throughput] || 0.0

  node = JmeterPerf::DSL::ConstantThroughputTimer.new(params)
  node.doc.xpath('//stringProp[@name="throughput"]').first.content = params[:value]
  attach_node(node, &)
end

#dummy_sampler(params = {}) ⇒ Object Also known as: dummy



47
48
49
50
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 47

def dummy_sampler(params = {}, &)
  node = JmeterPerf::Plugins::DummySampler.new(params)
  attach_node(node, &)
end

#exists(variable) ⇒ Object



3
4
5
6
7
8
9
10
11
# File 'lib/jmeter_perf/extend/misc/exists.rb', line 3

def exists(variable, &)
  params ||= {}
  params[:condition] = "\"${#{variable}}\" != \"\\${#{variable}}\""
  params[:useExpression] = false
  params[:name] = "if ${#{variable}}"
  node = JmeterPerf::DSL::IfController.new(params)

  attach_node(node, &)
end

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



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/jmeter_perf/extend/processors/extract.rb', line 3

def extract(params, &)
  node = if params[:regex]
    params[:refname] = params[:name]
    params[:template] = params[:template] || "$1$"
    JmeterPerf::RegularExpressionExtractor.new(params)
  elsif params[:xpath]
    params[:refname] = params[:name]
    params[:xpathQuery] = params[:xpath]
    JmeterPerf::XpathExtractor.new(params)
  elsif params[:json]
    params[:VAR] = params[:name]
    params[:JSONPATH] = params[:json]
    JmeterPerf::Plugins::JsonPathExtractor.new(params)
  elsif params[:css]
    params[:refname] = params[:name]
    params[:expr] = params[:css]
    JmeterPerf::CssjqueryExtractor.new(params)
  end

  attach_node(node, &)
end

#foreach_controller(params = {}) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/jmeter_perf/extend/controllers/foreach_controller.rb', line 3

def foreach_controller(params = {}, &)
  node = JmeterPerf::ForeachController.new(params).tap do |node|
    if params[:start_index]
      params[:startIndex] = params[:start_index]
      node.doc.children.first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
            <stringProp name="ForeachController.startIndex"/>
          EOS
        )).children
      )
    end

    if params[:end_index]
      params[:endIndex] = params[:end_index]
      node.doc.children.first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
            <stringProp name="ForeachController.endIndex"/>
          EOS
        )).children
      )
    end
  end

  attach_node(node, &)
end

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



3
4
5
6
7
8
# File 'lib/jmeter_perf/extend/config_elements/http_cache_manager.rb', line 3

def http_cache_manager(params = {}, &block)
  params[:clearEachIteration] = true if params.key? :clear_each_iteration
  params[:useExpires] = true if params.key? :use_expires

  super
end


5
6
7
8
9
10
11
12
13
# File 'lib/jmeter_perf/extend/config_elements/http_cookie_manager.rb', line 5

def http_cookie_manager(params = {}, &)
  params[:clearEachIteration] = true if params.key? :clear_each_iteration

  node = JmeterPerf::DSL::HTTPCookieManager.new(params)

  params[:user_defined_cookies]&.each { |cookie| add_cookie_to_collection(cookie, node) }

  attach_node(node, &)
end

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



3
4
5
6
7
8
9
# File 'lib/jmeter_perf/extend/config_elements/header_manager.rb', line 3

def http_header_manager(params, &block)
  if params.is_a?(Hash)
    params["Header.name"] = params[:name]
  end

  super
end

#http_request(*args) ⇒ Object Also known as: request, get, visit, post, submit, delete, patch, put, head



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/jmeter_perf/extend/samplers/http_request.rb', line 3

def http_request(*args, &)
  params = args.shift || {}
  params = {url: params}.merge(args.shift || {}) if params.is_a?(String)

  params[:method] ||= case __callee__.to_s
  when "visit"
    "GET"
  when "submit"
    "POST"
  else
    __callee__.to_s.upcase
  end

  params[:name] ||= params[:url]

  parse_http_request(params)

  if params[:sample]
    transaction name: params[:name], parent: true do
      loops count: params[:sample].to_i do
        params.delete(:sample)
        attach_node(http_request_node(params), &block)
      end
    end
  else
    attach_node(http_request_node(params), &)
  end
end

#http_request_defaults(params = {}) ⇒ Object Also known as: defaults



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/jmeter_perf/extend/config_elements/http_request_defaults.rb', line 3

def http_request_defaults(params = {}, &)
  params[:image_parser] = true if params.key? :download_resources
  params[:concurrentDwn] = true if params.key? :use_concurrent_pool
  params[:concurrentPool] = params[:use_concurrent_pool] if params.key? :use_concurrent_pool

  node = JmeterPerf::DSL::HTTPRequestDefaults.new(params).tap do |node|
    if params[:urls_must_match]
      node.doc.children.first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
          <stringProp name="HTTPSampler.embedded_url_re">#{params[:urls_must_match]}</stringProp>
          EOS
        )).children
      )
    end

    if params[:md5]
      node.doc.children.first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
            <boolProp name="HTTPSampler.md5">true</stringProp>
          EOS
        )).children
      )
    end

    if params[:proxy_host]
      node.doc.children.first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
            <stringProp name="HTTPSampler.proxyHost">#{params[:proxy_host]}</stringProp>
          EOS
        )).children
      )
    end

    if params[:proxy_port]
      node.doc.children.first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
            <stringProp name="HTTPSampler.proxyPort">#{params[:proxy_port]}</stringProp>
          EOS
        )).children
      )
    end
  end

  attach_node(node, &)
end

#http_request_node(params) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/jmeter_perf/extend/samplers/http_request.rb', line 32

def http_request_node(params)
  JmeterPerf::DSL::HTTPRequest.new(params).tap do |node|
    if params[:implementation]
      node.doc.children.first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
            <stringProp name="HTTPSampler.implementation">#{params[:implementation]}</stringProp>
          EOS
        )).children
      )
    end

    if params[:comments]
      node.doc.children.first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
            <stringProp name="TestPlan.comments">#{params[:comments]}</stringProp>
          EOS
        )).children
      )
    end
  end
end

#jms_pointtopoint(params, &block) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/jmeter_perf/extend/samplers/jms_pointtopoint.rb', line 3

def jms_pointtopoint(params, &block)
  JmeterPerf::JmsPointtopoint.new(params).tap do |node|
    params[:jndi_properties]&.each do |property_name, property_value|
      node.doc.xpath("//collectionProp").first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
            <elementProp name="#{property_name}" elementType="Argument">
              <stringProp name="Argument.name">#{property_name}</stringProp>
              <stringProp name="Argument.value">#{property_value}</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
          EOS
        )).children
      )
    end

    attach_node(node, &block)
  end
end

#jmx(out_jmx: "jmeter_perf.jmx") ⇒ Object

Saves the test plan as a JMX file.

Parameters:

  • out_jmx (String) (defaults to: "jmeter_perf.jmx")

    The path for the output JMX file (default: ‘“jmeter_perf.jmx”`).



78
79
80
81
# File 'lib/jmeter_perf.rb', line 78

def jmx(out_jmx: "jmeter_perf.jmx")
  File.write(out_jmx, doc.to_xml(indent: 2))
  logger.info "JMX saved to: #{out_jmx}"
end

#jmx_collector(params = {}) ⇒ Object



119
120
121
122
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 119

def jmx_collector(params = {}, &)
  node = JmeterPerf::Plugins::JMXCollector.new(params)
  attach_node(node, &)
end

#latencies_over_time(params = {}) ⇒ Object



28
29
30
31
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 28

def latencies_over_time(params = {}, &)
  node = JmeterPerf::Plugins::LatenciesOverTime.new(params)
  attach_node(node, &)
end

#loadosophia_uploader(params = {}) ⇒ Object Also known as: loadosophia



107
108
109
110
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 107

def loadosophia_uploader(params = {}, &)
  node = JmeterPerf::Plugins::LoadosophiaUploader.new(params)
  attach_node(node, &)
end

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



3
4
5
6
7
# File 'lib/jmeter_perf/extend/controllers/loop_controller.rb', line 3

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

  super
end

#module_controller(params) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/jmeter_perf/extend/controllers/module_controller.rb', line 3

def module_controller(params, &)
  node = JmeterPerf::DSL::ModuleController.new(params)

  if params[:test_fragment]
    params[:test_fragment].is_a?(String) &&
      params[:test_fragment].split("/")
  elsif params[:node_path]
    params[:node_path]
  else
    []
  end.each_with_index do |node_name, index|
    node.doc.at_xpath("//collectionProp") << Nokogiri::XML(
      JmeterPerf::Helpers::String.strip_heredoc(
        <<-EOS
          <stringProp name="node_#{index}">#{node_name}</stringProp>
        EOS
      )
    ).children
  end

  attach_node(node, &)
end

#perfmon_collector(params = {}) ⇒ Object Also known as: perfmon



100
101
102
103
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 100

def perfmon_collector(params = {}, &)
  node = JmeterPerf::Plugins::PerfmonCollector.new(params)
  attach_node(node, &)
end

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



3
4
5
6
7
8
9
10
# File 'lib/jmeter_perf/extend/timers/random_timer.rb', line 3

def random_timer(delay = 0, range = 0, &)
  params = {}
  params[:delay] = delay
  params[:range] = range
  node = JmeterPerf::GaussianRandomTimer.new(params)

  attach_node(node, &)
end

#redis_data_set(params = {}) ⇒ Object



114
115
116
117
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 114

def redis_data_set(params = {}, &)
  node = JmeterPerf::Plugins::RedisDataSet.new(params)
  attach_node(node, &)
end

#regular_expression_extractor(params) ⇒ Object Also known as: regex



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/jmeter_perf/extend/processors/regular_expression_extractor.rb', line 3

def regular_expression_extractor(params, &)
  params[:refname] = params[:name]
  params[:regex] = params[:pattern]
  params[:template] = params[:template] || "$1$"

  node = JmeterPerf::DSL::RegularExpressionExtractor.new(params).tap do |node|
    if params[:variable]
      node.doc.xpath("//stringProp[@name='Sample.scope']").first.content = "variable"

      node.doc.children.first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
            <stringProp name="Scope.variable">#{params[:variable]}</stringProp>
          EOS
        )).children
      )
    end
  end

  attach_node(node, &)
end

#response_assertion(params) ⇒ Object Also known as: assert, web_reg_find



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/jmeter_perf/extend/assertions/response_assertion.rb', line 3

def response_assertion(params, &)
  params[:test_type] = parse_test_type(params)
  params["0"] = params.values.first

  if params[:json]
    params[:EXPECTED_VALUE] = params[:value]
    params[:JSON_PATH] = params[:json]
    node = JmeterPerf::Plugins::JsonPathAssertion.new(params)
  end

  node ||= JmeterPerf::DSL::ResponseAssertion.new(params).tap do |node|
    if params[:variable]
      params["Scope.variable"] = params[:variable]
      node.doc.xpath("//stringProp[@name='Assertion.scope']").first.content = "variable"

      node.doc.children.first.add_child(
        Nokogiri::XML(JmeterPerf::Helpers::String.strip_heredoc(
          <<-EOS
          <stringProp name="Scope.variable">#{params[:variable]}</stringProp>
          EOS
        )).children
      )
    end

    if params[:scope] == "main"
      node.doc.xpath("//stringProp[@name='Assertion.scope']").remove
    end
  end

  attach_node(node, &)
end

#response_codes_per_second(params = {}) ⇒ Object



3
4
5
6
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 3

def response_codes_per_second(params = {}, &)
  node = JmeterPerf::Plugins::ResponseCodesPerSecond.new(params)
  attach_node(node, &)
end

#response_times_distribution(params = {}) ⇒ Object



8
9
10
11
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 8

def response_times_distribution(params = {}, &)
  node = JmeterPerf::Plugins::ResponseTimesDistribution.new(params)
  attach_node(node, &)
end

#response_times_over_time(params = {}) ⇒ Object



13
14
15
16
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 13

def response_times_over_time(params = {}, &)
  node = JmeterPerf::Plugins::ResponseTimesOverTime.new(params)
  attach_node(node, &)
end

#response_times_percentiles(params = {}) ⇒ Object



18
19
20
21
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 18

def response_times_percentiles(params = {}, &)
  node = JmeterPerf::Plugins::ResponseTimesPercentiles.new(params)
  attach_node(node, &)
end

#rsync(params = {}) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/jmeter_perf/extend/misc/rsync.rb', line 3

def rsync(params = {})
  logger.warn "Test file upload via rsync ..."

  file(params)

  cmd = "#{params[:rsync_bin_path]} #{params[:rsync_params]} #{params[:file]} #{params[:remote_user]}@#{params[:remote_host]}:#{params[:remote_path]}"

  logger.debug cmd if params[:debug]

  Open3.popen2e(cmd) do |stdin, stdout_err, wait_thr|
    while (line = stdout_err.gets)
      logger.debug line.chomp if params[:debug]
    end

    exit_status = wait_thr.value
    abort "Sorry there was an error: #{cmd}" unless exit_status.success?
  end

  logger.info "Upload complete at: #{params[:remote_host]}:#{params[:remote_path]}"
end

#run(name: "jmeter_perf", jmeter_path: "jmeter", out_jmx: "jmeter_perf.jmx", out_jtl: "jmeter.jtl", out_jmeter_log: "jmeter.log", out_cmd_log: "jmeter-cmd.log", jtl_read_timeout: 3) ⇒ JmeterPerf::Report::Summary

Runs the test plan with the specified configuration.

Parameters:

  • name (String) (defaults to: "jmeter_perf")

    The name of the test run (default: ‘“jmeter_perf”`).

  • jmeter_path (String) (defaults to: "jmeter")

    Path to the JMeter executable (default: ‘“jmeter”`).

  • out_jmx (String) (defaults to: "jmeter_perf.jmx")

    The filename for the output JMX file (default: ‘“jmeter_perf.jmx”`).

  • out_jtl (String) (defaults to: "jmeter.jtl")

    The filename for the output JTL file (default: ‘“jmeter.jtl”`).

  • out_jmeter_log (String) (defaults to: "jmeter.log")

    The filename for the JMeter log file (default: ‘“jmeter.log”`).

  • out_cmd_log (String) (defaults to: "jmeter-cmd.log")

    The filename for the command log file (default: ‘“jmeter-cmd.log”`).

  • jtl_read_timeout (Integer) (defaults to: 3)

    The maximum number of seconds to wait for a line read (default: ‘3`).

Returns:

Raises:

  • (RuntimeError)

    If the test execution fails.



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/jmeter_perf.rb', line 94

def run(
  name: "jmeter_perf",
  jmeter_path: "jmeter",
  out_jmx: "jmeter_perf.jmx",
  out_jtl: "jmeter.jtl",
  out_jmeter_log: "jmeter.log",
  out_cmd_log: "jmeter-cmd.log",
  jtl_read_timeout: 3
)
  summary = nil
  jmx(out_jmx:)
  logger.warn "Executing #{out_jmx} test plan locally ..."

  cmd = <<~CMD.strip
    #{jmeter_path} -n -t #{out_jmx} -j #{out_jmeter_log} -l #{out_jtl}
  CMD

  summary = JmeterPerf::Report::Summary.new(file_path: out_jtl, name:, jtl_read_timeout:)
  summary.stream_jtl_async

  File.open(out_cmd_log, "w") do |f|
    pid = Process.spawn(cmd, out: f, err: [:child, :out])
    Process.waitpid(pid)
  end

  summary.finish!         # Notify jtl collection that JTL cmd finished and waits

  unless $?.exitstatus.zero?
    logger.error("Failed to run #{cmd}. See #{out_cmd_log} and #{out_jmeter_log} for details.")
    raise "Exit status: #{$?.exitstatus}"
  end

  summary.summarize_data!
  logger.info "[Test Plan Execution Completed Successfully] JTL saved to: #{out_jtl}\n"
  summary
ensure
  summary&.finish!
end

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



3
4
5
6
7
# File 'lib/jmeter_perf/extend/samplers/soapxmlrpc_request.rb', line 3

def soapxmlrpc_request(params, &block)
  params[:method] ||= "POST"

  super
end

#stepping_thread_group(params = {}) ⇒ Object Also known as: step



54
55
56
57
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 54

def stepping_thread_group(params = {}, &)
  node = JmeterPerf::Plugins::SteppingThreadGroup.new(params)
  attach_node(node, &)
end

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



3
4
5
6
7
8
9
10
11
12
13
14
15
# File 'lib/jmeter_perf/extend/threads/thread_group.rb', line 3

def thread_group(*args, &)
  params = args.shift || {}
  params = {count: params}.merge(args.shift || {}) if params.is_a?(Integer)
  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 = JmeterPerf::DSL::ThreadGroup.new(params)
  attach_node(node, &)
end

#throughput_controller(params = {}) ⇒ Object Also known as: throughput



3
4
5
6
7
8
9
10
11
# File 'lib/jmeter_perf/extend/controllers/throughput_controller.rb', line 3

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

  node = JmeterPerf::ThroughputController.new(params)
  node.doc.xpath(".//FloatProperty/value").first.content = params[:maxThroughput].to_f

  attach_node(node, &)
end

#throughput_shaper(params = {}) ⇒ Object Also known as: shaper



40
41
42
43
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 40

def throughput_shaper(params = {}, &)
  node = JmeterPerf::Plugins::ThroughputShapingTimer.new(params)
  attach_node(node, &)
end

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



3
4
5
6
7
8
9
10
# File 'lib/jmeter_perf/extend/controllers/transaction_controller.rb', line 3

def transaction_controller(*args, &)
  params = args.shift || {}
  params = {name: params}.merge(args.shift || {}) if params.is_a?(String)
  params[:parent] = params[:parent] || false
  params[:includeTimers] = params[:include_timers] || false
  node = JmeterPerf::DSL::TransactionController.new(params)
  attach_node(node, &)
end

#transactions_per_second(params = {}) ⇒ Object



23
24
25
26
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 23

def transactions_per_second(params = {}, &)
  node = JmeterPerf::Plugins::TransactionsPerSecond.new(params)
  attach_node(node, &)
end

#ultimate_thread_group(params = {}) ⇒ Object Also known as: ultimate



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/jmeter_perf/extend/plugins/jmeter_plugins.rb', line 61

def ultimate_thread_group(params = {}, &)
  node = JmeterPerf::Plugins::UltimateThreadGroup.new(params)

  (params.is_a?(Array) ? params : params[:threads]).each_with_index do |group, index|
    node.doc.at_xpath("//collectionProp").<<
    Nokogiri::XML(
      JmeterPerf::Helpers::String.strip_heredoc(
        <<-EOS
          <collectionProp name="index">
            <stringProp name="#{group[:start_threads]}">#{group[:start_threads]}</stringProp>
            <stringProp name="#{group[:initial_delay]}">#{group[:initial_delay]}</stringProp>
            <stringProp name="#{group[:start_time]}">#{group[:start_time]}</stringProp>
            <stringProp name="#{group[:hold_time]}">#{group[:hold_time]}</stringProp>
            <stringProp name="#{group[:stop_time]}">#{group[:stop_time]}</stringProp>
          </collectionProp>
        EOS
      )
    ).children
  end

  attach_node(node, &)
end

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



3
4
5
6
7
8
9
# File 'lib/jmeter_perf/extend/config_elements/user_defined_variables.rb', line 3

def user_defined_variables(params, &block)
  if params.is_a?(Hash)
    params["Argument.name"] = params[:name]
  end

  super
end

#user_parameters(params, &block) ⇒ Object Also known as: parameters



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/jmeter_perf/extend/config_elements/user_parameters.rb', line 3

def user_parameters(params, &block)
  params["Argument.name"] = params[:name] if params.is_a?(Hash)

  params[:names] = Nokogiri::XML::Builder.new do |b|
    b.builder do
      params[:names].each do |name|
        b.stringProp name, name: name
      end
    end
  end

  params[:thread_values] = Nokogiri::XML::Builder.new do |b|
    b.builder do
      params[:thread_values].map do |user, values|
        b.collectionProp name: user do
          values.each_with_index.map do |value, index|
            b.stringProp value, name: index
          end
        end
      end
    end
  end

  super
end

#uuid_per_iteration(params = {}, &block) ⇒ Object



3
4
5
6
7
8
9
10
# File 'lib/jmeter_perf/extend/misc/uuid.rb', line 3

def uuid_per_iteration(params = {}, &block)
  params[:name] ||= "__UUID"
  params[:variable] ||= "UUID"

  dummy_sampler name: params[:name], response_data: "${__UUID}" do
    regex pattern: "(.*)", name: params[:variable], match_number: 1
  end
end

#with_browser(device) ⇒ Object



7
8
9
10
11
12
13
# File 'lib/jmeter_perf/extend/misc/with_helpers.rb', line 7

def with_browser(device)
  http_header_manager name: "User-Agent", value: JmeterPerf::Helpers::UserAgent.string(device)
  http_header_manager [
    {name: "Accept-Encoding", value: "gzip,deflate,sdch"},
    {name: "Accept", value: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"}
  ]
end

#with_gzipObject



19
20
21
# File 'lib/jmeter_perf/extend/misc/with_helpers.rb', line 19

def with_gzip
  http_header_manager name: "Accept-Encoding", value: "gzip, deflate"
end

#with_jsonObject



23
24
25
# File 'lib/jmeter_perf/extend/misc/with_helpers.rb', line 23

def with_json
  http_header_manager name: "Accept", value: "text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8, application/json"
end

#with_user_agent(device) ⇒ Object



3
4
5
# File 'lib/jmeter_perf/extend/misc/with_helpers.rb', line 3

def with_user_agent(device)
  http_header_manager name: "User-Agent", value: JmeterPerf::Helpers::UserAgent.string(device)
end

#with_xhrObject



15
16
17
# File 'lib/jmeter_perf/extend/misc/with_helpers.rb', line 15

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