jmeter-ruby 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.
- checksums.yaml +7 -0
- data/.gitattributes +22 -0
- data/.github/workflows/ci.yml +54 -0
- data/.gitignore +24 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -0
- data/CHANGES.md +77 -0
- data/Gemfile +23 -0
- data/LICENSE.txt +21 -0
- data/README.md +434 -0
- data/Rakefile +18 -0
- data/examples/OS_process_sampler.rb +24 -0
- data/examples/assertion_results.rb +18 -0
- data/examples/basic_auth.rb +11 -0
- data/examples/browser_headers.rb +7 -0
- data/examples/composite_graph.rb +29 -0
- data/examples/constant_throughput_timer.rb +11 -0
- data/examples/csv_data_set.rb +11 -0
- data/examples/dummy_sampler.rb +9 -0
- data/examples/duration_assertion.rb +10 -0
- data/examples/etsy_login_browse.rb +61 -0
- data/examples/extract.rb +12 -0
- data/examples/foreach_controller.rb +29 -0
- data/examples/header_manager.rb +29 -0
- data/examples/http_cache_manager.rb +11 -0
- data/examples/http_cookie_manager.rb +11 -0
- data/examples/http_request_defaults.rb +11 -0
- data/examples/http_request_post.rb +11 -0
- data/examples/http_request_with_files.rb +13 -0
- data/examples/http_request_with_query_params.rb +8 -0
- data/examples/jmeter_plugins_graphs.rb +22 -0
- data/examples/json_path_assertions.rb +11 -0
- data/examples/json_path_extractor.rb +10 -0
- data/examples/json_path_postprocessor.rb +10 -0
- data/examples/jsr223_assertion.rb +13 -0
- data/examples/ldap_sampler.rb +16 -0
- data/examples/loadosophia.rb +18 -0
- data/examples/loop_controller.rb +10 -0
- data/examples/loops_with_counter.rb +15 -0
- data/examples/once_only_controller.rb +15 -0
- data/examples/perfmon.rb +46 -0
- data/examples/real_custom_methods.rb +19 -0
- data/examples/real_page_objects.rb +41 -0
- data/examples/real_redis_data_set_with_setup.rb +123 -0
- data/examples/real_user_objects_github.rb +112 -0
- data/examples/regular_expression_extractor.rb +12 -0
- data/examples/response_assertion.rb +15 -0
- data/examples/response_time_percentiles_graph.rb +11 -0
- data/examples/rsync.rb +16 -0
- data/examples/sample_transaction.rb +18 -0
- data/examples/simple_data_writer_listener.rb +11 -0
- data/examples/stepping_thread_group.rb +30 -0
- data/examples/test_fragment.rb +14 -0
- data/examples/think_time.rb +15 -0
- data/examples/thread_groups.rb +7 -0
- data/examples/throughput_controller.rb +14 -0
- data/examples/throughput_shaping_timer.rb +20 -0
- data/examples/ultimate_thread_group.rb +39 -0
- data/examples/unicode.rb +8 -0
- data/examples/user_defined_variables.rb +10 -0
- data/examples/user_parameters.rb +28 -0
- data/examples/uuid_per_iteration.rb +15 -0
- data/jmeter-ruby.gemspec +28 -0
- data/lib/jmeter-ruby/DSL.md +235 -0
- data/lib/jmeter-ruby/dsl/access_log_sampler.rb +32 -0
- data/lib/jmeter-ruby/dsl/aggregate_graph.rb +55 -0
- data/lib/jmeter-ruby/dsl/aggregate_report.rb +55 -0
- data/lib/jmeter-ruby/dsl/ajp13_sampler.rb +41 -0
- data/lib/jmeter-ruby/dsl/assertion_results.rb +55 -0
- data/lib/jmeter-ruby/dsl/beanshell_assertion.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_listener.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_postprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_preprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_sampler.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_timer.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_assertion.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_listener.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_postprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_preprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_sampler.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_timer.rb +28 -0
- data/lib/jmeter-ruby/dsl/compare_assertion.rb +27 -0
- data/lib/jmeter-ruby/dsl/comparison_assertion_visualizer.rb +55 -0
- data/lib/jmeter-ruby/dsl/constant_throughput_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/constant_timer.rb +25 -0
- data/lib/jmeter-ruby/dsl/counter.rb +31 -0
- data/lib/jmeter-ruby/dsl/cssjquery_extractor.rb +31 -0
- data/lib/jmeter-ruby/dsl/csv_data_set_config.rb +33 -0
- data/lib/jmeter-ruby/dsl/debug_postprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/debug_sampler.rb +27 -0
- data/lib/jmeter-ruby/dsl/distribution_graphalpha.rb +55 -0
- data/lib/jmeter-ruby/dsl/duration_assertion.rb +25 -0
- data/lib/jmeter-ruby/dsl/foreach_controller.rb +27 -0
- data/lib/jmeter-ruby/dsl/ftp_request.rb +34 -0
- data/lib/jmeter-ruby/dsl/ftp_request_defaults.rb +32 -0
- data/lib/jmeter-ruby/dsl/gaussian_random_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/generate_summary_results.rb +23 -0
- data/lib/jmeter-ruby/dsl/graph_results.rb +55 -0
- data/lib/jmeter-ruby/dsl/html_assertion.rb +30 -0
- data/lib/jmeter-ruby/dsl/html_link_parser.rb +23 -0
- data/lib/jmeter-ruby/dsl/html_parameter_mask.rb +32 -0
- data/lib/jmeter-ruby/dsl/http_authorization_manager.rb +33 -0
- data/lib/jmeter-ruby/dsl/http_cache_manager.rb +26 -0
- data/lib/jmeter-ruby/dsl/http_cookie_manager.rb +28 -0
- data/lib/jmeter-ruby/dsl/http_header_manager.rb +30 -0
- data/lib/jmeter-ruby/dsl/http_request.rb +41 -0
- data/lib/jmeter-ruby/dsl/http_request_defaults.rb +41 -0
- data/lib/jmeter-ruby/dsl/http_url_rewriting_modifier.rb +30 -0
- data/lib/jmeter-ruby/dsl/if_controller.rb +27 -0
- data/lib/jmeter-ruby/dsl/include_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/java_request.rb +69 -0
- data/lib/jmeter-ruby/dsl/java_request_defaults.rb +69 -0
- data/lib/jmeter-ruby/dsl/jdbc_connection_configuration.rb +37 -0
- data/lib/jmeter-ruby/dsl/jdbc_postprocessor.rb +33 -0
- data/lib/jmeter-ruby/dsl/jdbc_preprocessor.rb +33 -0
- data/lib/jmeter-ruby/dsl/jdbc_request.rb +33 -0
- data/lib/jmeter-ruby/dsl/jms_pointtopoint.rb +41 -0
- data/lib/jmeter-ruby/dsl/jms_publisher.rb +43 -0
- data/lib/jmeter-ruby/dsl/jms_subscriber.rb +35 -0
- data/lib/jmeter-ruby/dsl/json_path_postprocessor.rb +27 -0
- data/lib/jmeter-ruby/dsl/jsr223_assertion.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_listener.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_postprocessor.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_preprocessor.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_sampler.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_timer.rb +29 -0
- data/lib/jmeter-ruby/dsl/junit_request.rb +37 -0
- data/lib/jmeter-ruby/dsl/keystore_configuration.rb +28 -0
- data/lib/jmeter-ruby/dsl/ldap_extended_request.rb +42 -0
- data/lib/jmeter-ruby/dsl/ldap_extended_request_defaults.rb +42 -0
- data/lib/jmeter-ruby/dsl/ldap_request.rb +35 -0
- data/lib/jmeter-ruby/dsl/ldap_request_defaults.rb +39 -0
- data/lib/jmeter-ruby/dsl/login_config_element.rb +26 -0
- data/lib/jmeter-ruby/dsl/loop_controller.rb +26 -0
- data/lib/jmeter-ruby/dsl/mail_reader_sampler.rb +37 -0
- data/lib/jmeter-ruby/dsl/mailer_visualizer.rb +64 -0
- data/lib/jmeter-ruby/dsl/md5hex_assertion.rb +25 -0
- data/lib/jmeter-ruby/dsl/module_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/monitor_results.rb +55 -0
- data/lib/jmeter-ruby/dsl/once_only_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/os_process_sampler.rb +34 -0
- data/lib/jmeter-ruby/dsl/poisson_random_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/random_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/random_order_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/random_variable.rb +30 -0
- data/lib/jmeter-ruby/dsl/recording_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/regex_user_parameters.rb +27 -0
- data/lib/jmeter-ruby/dsl/regular_expression_extractor.rb +32 -0
- data/lib/jmeter-ruby/dsl/response_assertion.rb +31 -0
- data/lib/jmeter-ruby/dsl/response_time_graph.rb +55 -0
- data/lib/jmeter-ruby/dsl/result_status_action_handler.rb +25 -0
- data/lib/jmeter-ruby/dsl/runtime_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/save_responses_to_a_file.rb +29 -0
- data/lib/jmeter-ruby/dsl/setup_thread_group.rb +36 -0
- data/lib/jmeter-ruby/dsl/simple_config_element.rb +23 -0
- data/lib/jmeter-ruby/dsl/simple_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/simple_data_writer.rb +55 -0
- data/lib/jmeter-ruby/dsl/smime_assertion.rb +35 -0
- data/lib/jmeter-ruby/dsl/smtp_sampler.rb +51 -0
- data/lib/jmeter-ruby/dsl/soapxmlrpc_request.rb +33 -0
- data/lib/jmeter-ruby/dsl/spline_visualizer.rb +55 -0
- data/lib/jmeter-ruby/dsl/summary_report.rb +55 -0
- data/lib/jmeter-ruby/dsl/switch_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/synchronizing_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/tcp_sampler.rb +33 -0
- data/lib/jmeter-ruby/dsl/tcp_sampler_config.rb +31 -0
- data/lib/jmeter-ruby/dsl/test_action.rb +27 -0
- data/lib/jmeter-ruby/dsl/test_fragment.rb +23 -0
- data/lib/jmeter-ruby/dsl/test_plan.rb +31 -0
- data/lib/jmeter-ruby/dsl/thread_group.rb +37 -0
- data/lib/jmeter-ruby/dsl/throughput_controller.rb +32 -0
- data/lib/jmeter-ruby/dsl/transaction_controller.rb +26 -0
- data/lib/jmeter-ruby/dsl/uniform_random_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/user_defined_variables.rb +33 -0
- data/lib/jmeter-ruby/dsl/user_parameters.rb +30 -0
- data/lib/jmeter-ruby/dsl/view_results_in_table.rb +55 -0
- data/lib/jmeter-ruby/dsl/view_results_tree.rb +55 -0
- data/lib/jmeter-ruby/dsl/while_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/xml_assertion.rb +23 -0
- data/lib/jmeter-ruby/dsl/xml_schema_assertion.rb +25 -0
- data/lib/jmeter-ruby/dsl/xpath_assertion.rb +31 -0
- data/lib/jmeter-ruby/dsl/xpath_extractor.rb +31 -0
- data/lib/jmeter-ruby/dsl.rb +102 -0
- data/lib/jmeter-ruby/extend/assertions/response_assertion.rb +36 -0
- data/lib/jmeter-ruby/extend/config_elements/header_manager.rb +13 -0
- data/lib/jmeter-ruby/extend/config_elements/http_cache_manager.rb +12 -0
- data/lib/jmeter-ruby/extend/config_elements/http_cookie_manager.rb +36 -0
- data/lib/jmeter-ruby/extend/config_elements/http_request_defaults.rb +39 -0
- data/lib/jmeter-ruby/extend/config_elements/user_defined_variables.rb +13 -0
- data/lib/jmeter-ruby/extend/config_elements/user_parameters.rb +31 -0
- data/lib/jmeter-ruby/extend/controllers/foreach_controller.rb +27 -0
- data/lib/jmeter-ruby/extend/controllers/loop_controller.rb +11 -0
- data/lib/jmeter-ruby/extend/controllers/module_controller.rb +23 -0
- data/lib/jmeter-ruby/extend/controllers/throughput_controller.rb +15 -0
- data/lib/jmeter-ruby/extend/controllers/transaction_controller.rb +14 -0
- data/lib/jmeter-ruby/extend/misc/aliases.rb +21 -0
- data/lib/jmeter-ruby/extend/misc/exists.rb +13 -0
- data/lib/jmeter-ruby/extend/misc/rsync.rb +24 -0
- data/lib/jmeter-ruby/extend/misc/uuid.rb +12 -0
- data/lib/jmeter-ruby/extend/misc/with_helpers.rb +27 -0
- data/lib/jmeter-ruby/extend/plugins/jmeter_plugins.rb +120 -0
- data/lib/jmeter-ruby/extend/processors/extract.rb +28 -0
- data/lib/jmeter-ruby/extend/processors/regular_expression_extractor.rb +25 -0
- data/lib/jmeter-ruby/extend/samplers/http_request.rb +58 -0
- data/lib/jmeter-ruby/extend/samplers/jms_pointtopoint.rb +26 -0
- data/lib/jmeter-ruby/extend/samplers/soapxmlrpc_request.rb +9 -0
- data/lib/jmeter-ruby/extend/threads/setup_thread_group.rb +18 -0
- data/lib/jmeter-ruby/extend/threads/thread_group.rb +19 -0
- data/lib/jmeter-ruby/extend/timers/constant_throughput_timer.rb +11 -0
- data/lib/jmeter-ruby/extend/timers/random_timer.rb +14 -0
- data/lib/jmeter-ruby/helpers/fallback_content_proxy.rb +54 -0
- data/lib/jmeter-ruby/helpers/helper.rb +75 -0
- data/lib/jmeter-ruby/helpers/logger-colors.rb +48 -0
- data/lib/jmeter-ruby/helpers/parser.rb +135 -0
- data/lib/jmeter-ruby/helpers/strip-heredoc.rb +5 -0
- data/lib/jmeter-ruby/helpers/user-agents.rb +27 -0
- data/lib/jmeter-ruby/idl.rb +70 -0
- data/lib/jmeter-ruby/idl.xml +1488 -0
- data/lib/jmeter-ruby/plugins/active_threads_over_time.rb +57 -0
- data/lib/jmeter-ruby/plugins/composite_graph.rb +71 -0
- data/lib/jmeter-ruby/plugins/console_status_logger.rb +15 -0
- data/lib/jmeter-ruby/plugins/dummy_sampler.rb +26 -0
- data/lib/jmeter-ruby/plugins/jmx_collector.rb +73 -0
- data/lib/jmeter-ruby/plugins/json_path_assertion.rb +19 -0
- data/lib/jmeter-ruby/plugins/json_path_extractor.rb +20 -0
- data/lib/jmeter-ruby/plugins/latencies_over_time.rb +49 -0
- data/lib/jmeter-ruby/plugins/loadosophia_uploader.rb +63 -0
- data/lib/jmeter-ruby/plugins/perfmon_collector.rb +80 -0
- data/lib/jmeter-ruby/plugins/redis_data_set.rb +39 -0
- data/lib/jmeter-ruby/plugins/response_codes_per_second.rb +49 -0
- data/lib/jmeter-ruby/plugins/response_times_distribution.rb +49 -0
- data/lib/jmeter-ruby/plugins/response_times_over_time.rb +50 -0
- data/lib/jmeter-ruby/plugins/response_times_percentiles.rb +51 -0
- data/lib/jmeter-ruby/plugins/stepping_thread_group.rb +30 -0
- data/lib/jmeter-ruby/plugins/transactions_per_second.rb +50 -0
- data/lib/jmeter-ruby/plugins/ultimate_thread_group.rb +23 -0
- data/lib/jmeter-ruby/plugins/variable_throughput_timer.rb +27 -0
- data/lib/jmeter-ruby/version.rb +12 -0
- data/lib/jmeter-ruby.rb +27 -0
- data/mise.toml +2 -0
- data/script/release +162 -0
- data/spec/constant_throughput_timer_spec.rb +20 -0
- data/spec/csv_data_set_config_spec.rb +33 -0
- data/spec/header_manager_spec.rb +37 -0
- data/spec/http_cache_manager_spec.rb +29 -0
- data/spec/http_cookie_manager_spec.rb +169 -0
- data/spec/http_request_defaults_spec.rb +57 -0
- data/spec/http_request_spec.rb +305 -0
- data/spec/jmeter_plugins_spec.rb +245 -0
- data/spec/json_extractor_spec.rb +19 -0
- data/spec/json_path_assertion_spec.rb +28 -0
- data/spec/logic_controller_spec.rb +148 -0
- data/spec/loop_controller_spec.rb +19 -0
- data/spec/module_controller_spec.rb +56 -0
- data/spec/regular_expression_extractor_spec.rb +63 -0
- data/spec/response_assertion_spec.rb +69 -0
- data/spec/setup_thread_group_spec.rb +31 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/thread_group_spec.rb +57 -0
- data/spec/throughput_controller_spec.rb +24 -0
- data/spec/transaction_controller_spec.rb +30 -0
- data/spec/user_defined_variables_spec.rb +22 -0
- data/spec/user_parameters_spec.rb +45 -0
- data/spec/with_helpers_spec.rb +57 -0
- data/spec/xpath_extractor_spec.rb +15 -0
- metadata +360 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
module Plugins
|
3
|
+
class ResponseTimesOverTime
|
4
|
+
attr_accessor :doc
|
5
|
+
include Helper
|
6
|
+
def initialize(params={})
|
7
|
+
testname = params.kind_of?(Array) ? 'ResponseTimesOverTime' : (params[:name] || 'ResponseTimesOverTime')
|
8
|
+
@doc = Nokogiri::XML(<<-EOF.strip_heredoc)
|
9
|
+
<kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.ResponseTimesOverTimeGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{testname}" enabled="#{enabled(params)}">
|
10
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
11
|
+
<objProp>
|
12
|
+
<name>saveConfig</name>
|
13
|
+
<value class="SampleSaveConfiguration">
|
14
|
+
<time>true</time>
|
15
|
+
<latency>true</latency>
|
16
|
+
<timestamp>true</timestamp>
|
17
|
+
<success>true</success>
|
18
|
+
<label>true</label>
|
19
|
+
<code>true</code>
|
20
|
+
<message>true</message>
|
21
|
+
<threadName>true</threadName>
|
22
|
+
<dataType>true</dataType>
|
23
|
+
<encoding>false</encoding>
|
24
|
+
<assertions>true</assertions>
|
25
|
+
<subresults>true</subresults>
|
26
|
+
<responseData>false</responseData>
|
27
|
+
<samplerData>false</samplerData>
|
28
|
+
<xml>true</xml>
|
29
|
+
<fieldNames>false</fieldNames>
|
30
|
+
<responseHeaders>false</responseHeaders>
|
31
|
+
<requestHeaders>false</requestHeaders>
|
32
|
+
<responseDataOnError>false</responseDataOnError>
|
33
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
34
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
35
|
+
<bytes>true</bytes>
|
36
|
+
</value>
|
37
|
+
</objProp>
|
38
|
+
<stringProp name="filename"></stringProp>
|
39
|
+
<longProp name="interval_grouping">500</longProp>
|
40
|
+
<boolProp name="graph_aggregated">false</boolProp>
|
41
|
+
<stringProp name="include_sample_labels"></stringProp>
|
42
|
+
<stringProp name="exclude_sample_labels"></stringProp>
|
43
|
+
</kg.apc.jmeter.vizualizers.CorrectedResultCollector>
|
44
|
+
EOF
|
45
|
+
update params
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
module Plugins
|
3
|
+
class ResponseTimesPercentiles
|
4
|
+
attr_accessor :doc
|
5
|
+
include Helper
|
6
|
+
def initialize(params={})
|
7
|
+
testname = params.kind_of?(Array) ? 'ResponseTimesPercentiles' : (params[:name] || 'ResponseTimesPercentiles')
|
8
|
+
@doc = Nokogiri::XML(<<-EOF.strip_heredoc)
|
9
|
+
<kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.ResponseTimesPercentilesGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{testname}" enabled="#{enabled(params)}">
|
10
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
11
|
+
<objProp>
|
12
|
+
<name>saveConfig</name>
|
13
|
+
<value class="SampleSaveConfiguration">
|
14
|
+
<time>true</time>
|
15
|
+
<latency>true</latency>
|
16
|
+
<timestamp>true</timestamp>
|
17
|
+
<success>true</success>
|
18
|
+
<label>true</label>
|
19
|
+
<code>true</code>
|
20
|
+
<message>true</message>
|
21
|
+
<threadName>true</threadName>
|
22
|
+
<dataType>true</dataType>
|
23
|
+
<encoding>false</encoding>
|
24
|
+
<assertions>true</assertions>
|
25
|
+
<subresults>true</subresults>
|
26
|
+
<responseData>false</responseData>
|
27
|
+
<samplerData>false</samplerData>
|
28
|
+
<xml>true</xml>
|
29
|
+
<fieldNames>false</fieldNames>
|
30
|
+
<responseHeaders>false</responseHeaders>
|
31
|
+
<requestHeaders>false</requestHeaders>
|
32
|
+
<responseDataOnError>false</responseDataOnError>
|
33
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
34
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
35
|
+
<bytes>true</bytes>
|
36
|
+
</value>
|
37
|
+
</objProp>
|
38
|
+
<stringProp name="filename"></stringProp>
|
39
|
+
<longProp name="interval_grouping">500</longProp>
|
40
|
+
<boolProp name="graph_aggregated">false</boolProp>
|
41
|
+
<stringProp name="include_sample_labels"></stringProp>
|
42
|
+
<stringProp name="exclude_sample_labels"></stringProp>
|
43
|
+
</kg.apc.jmeter.vizualizers.CorrectedResultCollector>
|
44
|
+
EOF
|
45
|
+
update params
|
46
|
+
update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
module Plugins
|
3
|
+
class SteppingThreadGroup
|
4
|
+
attr_accessor :doc
|
5
|
+
include Helper
|
6
|
+
def initialize(params={})
|
7
|
+
testname = params.kind_of?(Array) ? 'SteppingThreadGroup' : (params[:name] || 'SteppingThreadGroup')
|
8
|
+
@doc = Nokogiri::XML(<<-EOF.strip_heredoc)
|
9
|
+
<kg.apc.jmeter.threads.SteppingThreadGroup guiclass="kg.apc.jmeter.threads.SteppingThreadGroupGui" testclass="kg.apc.jmeter.threads.SteppingThreadGroup" testname="#{testname}" enabled="true">
|
10
|
+
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
11
|
+
<stringProp name="ThreadGroup.num_threads">#{params[:total_threads]}</stringProp>
|
12
|
+
<stringProp name="Threads initial delay">#{params[:initial_delay]}</stringProp>
|
13
|
+
<stringProp name="Start users count">#{params[:start_threads]}</stringProp>
|
14
|
+
<stringProp name="Start users count burst">#{params[:add_threads]}</stringProp>
|
15
|
+
<stringProp name="Start users period">#{params[:start_every]}</stringProp>
|
16
|
+
<stringProp name="Stop users count">#{params[:stop_threads]}</stringProp>
|
17
|
+
<stringProp name="Stop users period">#{params[:stop_every]}</stringProp>
|
18
|
+
<stringProp name="flighttime">#{params[:flight_time]}</stringProp>
|
19
|
+
<stringProp name="rampUp">#{params[:rampup]}</stringProp>
|
20
|
+
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
|
21
|
+
<boolProp name="LoopController.continue_forever">false</boolProp>
|
22
|
+
<intProp name="LoopController.loops">-1</intProp>
|
23
|
+
</elementProp>
|
24
|
+
</kg.apc.jmeter.threads.SteppingThreadGroup>
|
25
|
+
EOF
|
26
|
+
update params
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
module Plugins
|
3
|
+
class TransactionsPerSecond
|
4
|
+
attr_accessor :doc
|
5
|
+
include Helper
|
6
|
+
def initialize(params={})
|
7
|
+
testname = params.kind_of?(Array) ? 'TransactionsPerSecond' : (params[:name] || 'TransactionsPerSecond')
|
8
|
+
@doc = Nokogiri::XML(<<-EOF.strip_heredoc)
|
9
|
+
<kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.TransactionsPerSecondGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{testname}" enabled="#{enabled(params)}">
|
10
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
11
|
+
<objProp>
|
12
|
+
<name>saveConfig</name>
|
13
|
+
<value class="SampleSaveConfiguration">
|
14
|
+
<time>true</time>
|
15
|
+
<latency>true</latency>
|
16
|
+
<timestamp>true</timestamp>
|
17
|
+
<success>true</success>
|
18
|
+
<label>true</label>
|
19
|
+
<code>true</code>
|
20
|
+
<message>true</message>
|
21
|
+
<threadName>true</threadName>
|
22
|
+
<dataType>true</dataType>
|
23
|
+
<encoding>false</encoding>
|
24
|
+
<assertions>true</assertions>
|
25
|
+
<subresults>true</subresults>
|
26
|
+
<responseData>false</responseData>
|
27
|
+
<samplerData>false</samplerData>
|
28
|
+
<xml>true</xml>
|
29
|
+
<fieldNames>false</fieldNames>
|
30
|
+
<responseHeaders>false</responseHeaders>
|
31
|
+
<requestHeaders>false</requestHeaders>
|
32
|
+
<responseDataOnError>false</responseDataOnError>
|
33
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
34
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
35
|
+
<bytes>true</bytes>
|
36
|
+
</value>
|
37
|
+
</objProp>
|
38
|
+
<stringProp name="filename"></stringProp>
|
39
|
+
<longProp name="interval_grouping">1000</longProp>
|
40
|
+
<boolProp name="graph_aggregated">false</boolProp>
|
41
|
+
<stringProp name="include_sample_labels"></stringProp>
|
42
|
+
<stringProp name="exclude_sample_labels"></stringProp>
|
43
|
+
</kg.apc.jmeter.vizualizers.CorrectedResultCollector>
|
44
|
+
EOF
|
45
|
+
update params
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
module Plugins
|
3
|
+
class UltimateThreadGroup
|
4
|
+
attr_accessor :doc
|
5
|
+
include Helper
|
6
|
+
def initialize(params={})
|
7
|
+
testname = params.kind_of?(Array) ? 'UltimateThreadGroup' : (params[:name] || 'UltimateThreadGroup')
|
8
|
+
@doc = Nokogiri::XML(<<-EOF.strip_heredoc)
|
9
|
+
<kg.apc.jmeter.threads.UltimateThreadGroup guiclass="kg.apc.jmeter.threads.UltimateThreadGroupGui" testclass="kg.apc.jmeter.threads.UltimateThreadGroup" testname="#{testname}" enabled="true">
|
10
|
+
<collectionProp name="ultimatethreadgroupdata">
|
11
|
+
</collectionProp>
|
12
|
+
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
|
13
|
+
<boolProp name="LoopController.continue_forever">false</boolProp>
|
14
|
+
<intProp name="LoopController.loops">-1</intProp>
|
15
|
+
</elementProp>
|
16
|
+
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
17
|
+
</kg.apc.jmeter.threads.UltimateThreadGroup>
|
18
|
+
EOF
|
19
|
+
update params
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
module Plugins
|
3
|
+
class ThroughputShapingTimer
|
4
|
+
attr_accessor :doc
|
5
|
+
include Helper
|
6
|
+
def initialize(params={})
|
7
|
+
testname = params.kind_of?(Array) ? 'ThroughputShapingTimer' : (params[:name] || 'ThroughputShapingTimer')
|
8
|
+
@doc = Nokogiri::XML(<<-EOF.strip_heredoc)
|
9
|
+
<kg.apc.jmeter.timers.VariableThroughputTimer guiclass="kg.apc.jmeter.timers.VariableThroughputTimerGui" testclass="kg.apc.jmeter.timers.VariableThroughputTimer" testname="#{testname}" enabled="true">
|
10
|
+
<collectionProp name="load_profile"/>
|
11
|
+
</kg.apc.jmeter.timers.VariableThroughputTimer>
|
12
|
+
EOF
|
13
|
+
(params.kind_of?(Array) ? params : params[:steps]).each_with_index do |step, index|
|
14
|
+
@doc.at_xpath('//collectionProp') <<
|
15
|
+
Nokogiri::XML(<<-EOF.strip_heredoc).children
|
16
|
+
<collectionProp name="step_#{index}">
|
17
|
+
<stringProp name="start_rps_#{index}">#{step[:start_rps]}</stringProp>
|
18
|
+
<stringProp name="end_rps_#{index}">#{step[:end_rps]}</stringProp>
|
19
|
+
<stringProp name="duration_sec_#{index}">#{step[:duration]}</stringProp>
|
20
|
+
</collectionProp>
|
21
|
+
EOF
|
22
|
+
end
|
23
|
+
update params
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/jmeter-ruby.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'rest_client'
|
3
|
+
require 'json'
|
4
|
+
require 'cgi'
|
5
|
+
require 'open3'
|
6
|
+
|
7
|
+
require 'jmeter-ruby/version'
|
8
|
+
|
9
|
+
lib = File.dirname(File.absolute_path(__FILE__))
|
10
|
+
|
11
|
+
Dir.glob(lib + '/jmeter-ruby/helpers/**/*.rb').each do |file|
|
12
|
+
require file
|
13
|
+
end
|
14
|
+
|
15
|
+
Dir.glob(lib + '/jmeter-ruby/dsl/**/*.rb').each do |file|
|
16
|
+
require file
|
17
|
+
end
|
18
|
+
|
19
|
+
Dir.glob(lib + '/jmeter-ruby/extend/**/*.rb').each do |file|
|
20
|
+
require file
|
21
|
+
end
|
22
|
+
|
23
|
+
Dir.glob(lib + '/jmeter-ruby/plugins/**/*.rb').each do |file|
|
24
|
+
require file
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'jmeter-ruby/dsl'
|
data/mise.toml
ADDED
data/script/release
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
fetch() {
|
4
|
+
git fetch --all
|
5
|
+
}
|
6
|
+
|
7
|
+
branch_name() {
|
8
|
+
git symbolic-ref --short HEAD
|
9
|
+
}
|
10
|
+
|
11
|
+
local_history_is_clean() {
|
12
|
+
history=$(git rev-list --count --right-only @{u}...HEAD)
|
13
|
+
[ "$history" == "0" ]
|
14
|
+
}
|
15
|
+
|
16
|
+
remote_history_is_clean() {
|
17
|
+
history=$(git rev-list --count --left-only @{u}...HEAD)
|
18
|
+
[ "$history" == "0" ]
|
19
|
+
}
|
20
|
+
|
21
|
+
tag_exists_on_remote() {
|
22
|
+
git rev-parse --quiet --verify refs/tags/$1.$2.$3 > /dev/null
|
23
|
+
}
|
24
|
+
|
25
|
+
working_tree_is_clean() {
|
26
|
+
status=$(git status --porcelain)
|
27
|
+
[ "$status" == "" ]
|
28
|
+
}
|
29
|
+
|
30
|
+
create_release_branch() {
|
31
|
+
git switch -c release-$1-$2-$3
|
32
|
+
}
|
33
|
+
|
34
|
+
update_readme() {
|
35
|
+
sed -i '' "/## main/ {a\
|
36
|
+
\\
|
37
|
+
\\
|
38
|
+
## $1.$2.$3
|
39
|
+
}" docs/CHANGELOG.md
|
40
|
+
}
|
41
|
+
|
42
|
+
update_ruby_version() {
|
43
|
+
# Update version file
|
44
|
+
sed -E -i '' \
|
45
|
+
-e "s/MAJOR = [0-9]+/MAJOR = $1/g" \
|
46
|
+
-e "s/MINOR = [0-9]+/MINOR = $2/g" \
|
47
|
+
-e "s/PATCH = [0-9]+/PATCH = $3/g" \
|
48
|
+
lib/jmeter-ruby/version.rb
|
49
|
+
|
50
|
+
# Update deprecation horizon version
|
51
|
+
major=$1
|
52
|
+
sed -E -i '' \
|
53
|
+
-e "s/DEPRECATION_HORIZON = [0-9]+/DEPRECATION_HORIZON = $((major + 1))/g" \
|
54
|
+
lib/jmeter-ruby/deprecation.rb
|
55
|
+
}
|
56
|
+
|
57
|
+
update_gemfiles() {
|
58
|
+
# Update Gemfile.lock
|
59
|
+
bundle
|
60
|
+
}
|
61
|
+
|
62
|
+
add_changed_files() {
|
63
|
+
git add \
|
64
|
+
Gemfile.lock \
|
65
|
+
lib/jmeter-ruby/version.rb
|
66
|
+
}
|
67
|
+
|
68
|
+
commit() {
|
69
|
+
git commit -m "release $1.$2.$3"
|
70
|
+
}
|
71
|
+
|
72
|
+
push() {
|
73
|
+
git push origin release-$1-$2-$3
|
74
|
+
|
75
|
+
echo "####################################################"
|
76
|
+
echo "Now, open a PR with this branch and merge it to main"
|
77
|
+
echo "Then, run script/publish on main to release the gem"
|
78
|
+
echo "Finally, create a GitHub release https://github.com/reeganviljoen/jmeter-ruby/releases/new with the changes from docs/CHANGELOG"
|
79
|
+
echo "####################################################"
|
80
|
+
}
|
81
|
+
|
82
|
+
main() {
|
83
|
+
version=$(ruby ./lib/jmeter-ruby/version.rb)
|
84
|
+
version=(${version//./ })
|
85
|
+
major=${version[0]}
|
86
|
+
minor=${version[1]}
|
87
|
+
patch=${version[2]}
|
88
|
+
|
89
|
+
echo "==================="
|
90
|
+
echo "Prerequisite Checks"
|
91
|
+
echo "==================="
|
92
|
+
|
93
|
+
if ! working_tree_is_clean; then
|
94
|
+
echo "Error: unclean working tree"
|
95
|
+
exit 1
|
96
|
+
fi
|
97
|
+
|
98
|
+
if [ "$(branch_name)" != "main" ]; then
|
99
|
+
echo "Error: can only make a release on the main branch"
|
100
|
+
exit 1
|
101
|
+
fi
|
102
|
+
|
103
|
+
fetch
|
104
|
+
|
105
|
+
if ! remote_history_is_clean; then
|
106
|
+
echo "Error: changes exist on origin not pulled into this branch. Please pull"
|
107
|
+
exit 1
|
108
|
+
fi
|
109
|
+
|
110
|
+
if ! local_history_is_clean; then
|
111
|
+
echo "Error: changes exist that haven't been pushed to origin. Please pull"
|
112
|
+
exit 1
|
113
|
+
fi
|
114
|
+
|
115
|
+
echo "Type the number of an option to bump, or pick Manual to enter a version number"
|
116
|
+
select bump in Major Minor Patch Manual
|
117
|
+
do
|
118
|
+
if [ "$bump" == "Major" ]; then
|
119
|
+
major=$((major + 1))
|
120
|
+
minor=0
|
121
|
+
patch=0
|
122
|
+
elif [ "$bump" == "Minor" ]; then
|
123
|
+
minor=$((minor + 1))
|
124
|
+
patch=0
|
125
|
+
elif [ "$bump" == "Patch" ]; then
|
126
|
+
patch=$((patch + 1))
|
127
|
+
else
|
128
|
+
read -p "What version? (Currently $major.$minor.$patch): " new_version
|
129
|
+
if [ "$new_version" == "$major.$minor.$patch" ]; then
|
130
|
+
echo "Error: Can't be the same version"
|
131
|
+
exit 1
|
132
|
+
fi
|
133
|
+
|
134
|
+
new_version=(${new_version//./ })
|
135
|
+
|
136
|
+
major=${new_version[0]}
|
137
|
+
minor=${new_version[1]}
|
138
|
+
patch=${new_version[2]}
|
139
|
+
fi
|
140
|
+
|
141
|
+
if tag_exists_on_remote $major $minor $patch; then
|
142
|
+
echo "Error: tag exists on remote"
|
143
|
+
exit 1
|
144
|
+
fi
|
145
|
+
|
146
|
+
echo "==============================="
|
147
|
+
echo "Creating release for $major.$minor.$patch"
|
148
|
+
echo "==============================="
|
149
|
+
|
150
|
+
create_release_branch $major $minor $patch
|
151
|
+
update_readme $major $minor $patch
|
152
|
+
update_ruby_version $major $minor $patch
|
153
|
+
update_gemfiles $major $minor $patch
|
154
|
+
echo "version: $major.$minor.$patch" > docs/_data/library.yml
|
155
|
+
add_changed_files $major $minor $patch
|
156
|
+
commit $major $minor $patch
|
157
|
+
push $major $minor $patch
|
158
|
+
exit 0
|
159
|
+
done
|
160
|
+
}
|
161
|
+
|
162
|
+
main
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'constant_throughput_timer' do
|
4
|
+
let(:doc) do
|
5
|
+
test do
|
6
|
+
threads do
|
7
|
+
constant_throughput_timer value: 60.0
|
8
|
+
constant_throughput_timer throughput: 70.0
|
9
|
+
end
|
10
|
+
end.to_doc
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should match on throughput using value' do
|
14
|
+
expect(doc.search('//ConstantThroughputTimer[1]/stringProp[@name="throughput"]').first.content).to eq '60.0'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should match on throughput using throughput' do
|
18
|
+
expect(doc.search('//ConstantThroughputTimer[2]/stringProp[@name="throughput"]').first.content).to eq '70.0'
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'csv_data_set_config' do
|
4
|
+
describe 'the options should be respected' do
|
5
|
+
let(:doc) do
|
6
|
+
test do
|
7
|
+
csv_data_set_config delimiter: '|',
|
8
|
+
filename: 'test.csv',
|
9
|
+
ignoreFirstLine: true,
|
10
|
+
variableNames: 'test1,test2'
|
11
|
+
end.to_doc
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:csv_data_set) { doc.search("//CSVDataSet") }
|
15
|
+
|
16
|
+
it 'should match on variableNames' do
|
17
|
+
expect(csv_data_set.search(".//stringProp[@name='variableNames']").first.text).to eq 'test1,test2'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should match on delimiter' do
|
21
|
+
expect(csv_data_set.search(".//stringProp[@name='delimiter']").first.text).to eq '|'
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should match on filename' do
|
25
|
+
expect(csv_data_set.search(".//stringProp[@name='filename']").first.text).to eq 'test.csv'
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should match on ignoreFirstLine' do
|
29
|
+
expect(csv_data_set.search(".//boolProp[@name='ignoreFirstLine']").first.text).to eq 'true'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'header manager' do
|
4
|
+
let(:doc) do
|
5
|
+
test do
|
6
|
+
header name: 'Accept', value: '*'
|
7
|
+
end.to_doc
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:fragment) { doc.search('//HeaderManager').first }
|
11
|
+
|
12
|
+
it 'should match on accept' do
|
13
|
+
expect(fragment.search(".//stringProp[@name='Header.name']").text).to eq 'Accept'
|
14
|
+
expect(fragment.search(".//stringProp[@name='Header.value']").text).to eq '*'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'header manager multiple values' do
|
19
|
+
let(:doc) do
|
20
|
+
test do
|
21
|
+
header [ { name: 'Accept', value: '1' }, { name: 'Accept', value: '2' }]
|
22
|
+
end.to_doc
|
23
|
+
end
|
24
|
+
|
25
|
+
let(:fragment) { doc.search('//HeaderManager') }
|
26
|
+
|
27
|
+
|
28
|
+
it 'should match on accept for fragment_first' do
|
29
|
+
expect(fragment.search(".//stringProp[@name='Header.name']").first.text).to eq 'Accept'
|
30
|
+
expect(fragment.search(".//stringProp[@name='Header.value']").first.text).to eq '1'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should match on accept for fragment_last' do
|
34
|
+
expect(fragment.search(".//stringProp[@name='Header.name']").last.text).to eq 'Accept'
|
35
|
+
expect(fragment.search(".//stringProp[@name='Header.value']").last.text).to eq '2'
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'http_cache_manager' do
|
4
|
+
describe 'the clear_each_iteration option should be respected' do
|
5
|
+
let(:doc) do
|
6
|
+
test do
|
7
|
+
cache clear_each_iteration: true
|
8
|
+
end.to_doc
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:cache_fragment) { doc.search("//CacheManager") }
|
12
|
+
|
13
|
+
it 'should match on clearEachIteration' do
|
14
|
+
expect(cache_fragment.search(".//boolProp[@name='clearEachIteration']").first.text).to eq 'true'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'the use_expires option should be respected' do
|
19
|
+
let(:doc) do
|
20
|
+
test do
|
21
|
+
cache use_expires: true
|
22
|
+
end.to_doc
|
23
|
+
end
|
24
|
+
let(:cache_fragment) { doc.search("//CacheManager") }
|
25
|
+
it 'should match on useExpires' do
|
26
|
+
expect(cache_fragment.search(".//boolProp[@name='useExpires']").first.text).to eq 'true'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|