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.
Files changed (266) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +22 -0
  3. data/.github/workflows/ci.yml +54 -0
  4. data/.gitignore +24 -0
  5. data/.rspec +1 -0
  6. data/.ruby-version +1 -0
  7. data/CHANGES.md +77 -0
  8. data/Gemfile +23 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +434 -0
  11. data/Rakefile +18 -0
  12. data/examples/OS_process_sampler.rb +24 -0
  13. data/examples/assertion_results.rb +18 -0
  14. data/examples/basic_auth.rb +11 -0
  15. data/examples/browser_headers.rb +7 -0
  16. data/examples/composite_graph.rb +29 -0
  17. data/examples/constant_throughput_timer.rb +11 -0
  18. data/examples/csv_data_set.rb +11 -0
  19. data/examples/dummy_sampler.rb +9 -0
  20. data/examples/duration_assertion.rb +10 -0
  21. data/examples/etsy_login_browse.rb +61 -0
  22. data/examples/extract.rb +12 -0
  23. data/examples/foreach_controller.rb +29 -0
  24. data/examples/header_manager.rb +29 -0
  25. data/examples/http_cache_manager.rb +11 -0
  26. data/examples/http_cookie_manager.rb +11 -0
  27. data/examples/http_request_defaults.rb +11 -0
  28. data/examples/http_request_post.rb +11 -0
  29. data/examples/http_request_with_files.rb +13 -0
  30. data/examples/http_request_with_query_params.rb +8 -0
  31. data/examples/jmeter_plugins_graphs.rb +22 -0
  32. data/examples/json_path_assertions.rb +11 -0
  33. data/examples/json_path_extractor.rb +10 -0
  34. data/examples/json_path_postprocessor.rb +10 -0
  35. data/examples/jsr223_assertion.rb +13 -0
  36. data/examples/ldap_sampler.rb +16 -0
  37. data/examples/loadosophia.rb +18 -0
  38. data/examples/loop_controller.rb +10 -0
  39. data/examples/loops_with_counter.rb +15 -0
  40. data/examples/once_only_controller.rb +15 -0
  41. data/examples/perfmon.rb +46 -0
  42. data/examples/real_custom_methods.rb +19 -0
  43. data/examples/real_page_objects.rb +41 -0
  44. data/examples/real_redis_data_set_with_setup.rb +123 -0
  45. data/examples/real_user_objects_github.rb +112 -0
  46. data/examples/regular_expression_extractor.rb +12 -0
  47. data/examples/response_assertion.rb +15 -0
  48. data/examples/response_time_percentiles_graph.rb +11 -0
  49. data/examples/rsync.rb +16 -0
  50. data/examples/sample_transaction.rb +18 -0
  51. data/examples/simple_data_writer_listener.rb +11 -0
  52. data/examples/stepping_thread_group.rb +30 -0
  53. data/examples/test_fragment.rb +14 -0
  54. data/examples/think_time.rb +15 -0
  55. data/examples/thread_groups.rb +7 -0
  56. data/examples/throughput_controller.rb +14 -0
  57. data/examples/throughput_shaping_timer.rb +20 -0
  58. data/examples/ultimate_thread_group.rb +39 -0
  59. data/examples/unicode.rb +8 -0
  60. data/examples/user_defined_variables.rb +10 -0
  61. data/examples/user_parameters.rb +28 -0
  62. data/examples/uuid_per_iteration.rb +15 -0
  63. data/jmeter-ruby.gemspec +28 -0
  64. data/lib/jmeter-ruby/DSL.md +235 -0
  65. data/lib/jmeter-ruby/dsl/access_log_sampler.rb +32 -0
  66. data/lib/jmeter-ruby/dsl/aggregate_graph.rb +55 -0
  67. data/lib/jmeter-ruby/dsl/aggregate_report.rb +55 -0
  68. data/lib/jmeter-ruby/dsl/ajp13_sampler.rb +41 -0
  69. data/lib/jmeter-ruby/dsl/assertion_results.rb +55 -0
  70. data/lib/jmeter-ruby/dsl/beanshell_assertion.rb +28 -0
  71. data/lib/jmeter-ruby/dsl/beanshell_listener.rb +28 -0
  72. data/lib/jmeter-ruby/dsl/beanshell_postprocessor.rb +28 -0
  73. data/lib/jmeter-ruby/dsl/beanshell_preprocessor.rb +28 -0
  74. data/lib/jmeter-ruby/dsl/beanshell_sampler.rb +28 -0
  75. data/lib/jmeter-ruby/dsl/beanshell_timer.rb +28 -0
  76. data/lib/jmeter-ruby/dsl/bsf_assertion.rb +28 -0
  77. data/lib/jmeter-ruby/dsl/bsf_listener.rb +28 -0
  78. data/lib/jmeter-ruby/dsl/bsf_postprocessor.rb +28 -0
  79. data/lib/jmeter-ruby/dsl/bsf_preprocessor.rb +28 -0
  80. data/lib/jmeter-ruby/dsl/bsf_sampler.rb +28 -0
  81. data/lib/jmeter-ruby/dsl/bsf_timer.rb +28 -0
  82. data/lib/jmeter-ruby/dsl/compare_assertion.rb +27 -0
  83. data/lib/jmeter-ruby/dsl/comparison_assertion_visualizer.rb +55 -0
  84. data/lib/jmeter-ruby/dsl/constant_throughput_timer.rb +26 -0
  85. data/lib/jmeter-ruby/dsl/constant_timer.rb +25 -0
  86. data/lib/jmeter-ruby/dsl/counter.rb +31 -0
  87. data/lib/jmeter-ruby/dsl/cssjquery_extractor.rb +31 -0
  88. data/lib/jmeter-ruby/dsl/csv_data_set_config.rb +33 -0
  89. data/lib/jmeter-ruby/dsl/debug_postprocessor.rb +28 -0
  90. data/lib/jmeter-ruby/dsl/debug_sampler.rb +27 -0
  91. data/lib/jmeter-ruby/dsl/distribution_graphalpha.rb +55 -0
  92. data/lib/jmeter-ruby/dsl/duration_assertion.rb +25 -0
  93. data/lib/jmeter-ruby/dsl/foreach_controller.rb +27 -0
  94. data/lib/jmeter-ruby/dsl/ftp_request.rb +34 -0
  95. data/lib/jmeter-ruby/dsl/ftp_request_defaults.rb +32 -0
  96. data/lib/jmeter-ruby/dsl/gaussian_random_timer.rb +26 -0
  97. data/lib/jmeter-ruby/dsl/generate_summary_results.rb +23 -0
  98. data/lib/jmeter-ruby/dsl/graph_results.rb +55 -0
  99. data/lib/jmeter-ruby/dsl/html_assertion.rb +30 -0
  100. data/lib/jmeter-ruby/dsl/html_link_parser.rb +23 -0
  101. data/lib/jmeter-ruby/dsl/html_parameter_mask.rb +32 -0
  102. data/lib/jmeter-ruby/dsl/http_authorization_manager.rb +33 -0
  103. data/lib/jmeter-ruby/dsl/http_cache_manager.rb +26 -0
  104. data/lib/jmeter-ruby/dsl/http_cookie_manager.rb +28 -0
  105. data/lib/jmeter-ruby/dsl/http_header_manager.rb +30 -0
  106. data/lib/jmeter-ruby/dsl/http_request.rb +41 -0
  107. data/lib/jmeter-ruby/dsl/http_request_defaults.rb +41 -0
  108. data/lib/jmeter-ruby/dsl/http_url_rewriting_modifier.rb +30 -0
  109. data/lib/jmeter-ruby/dsl/if_controller.rb +27 -0
  110. data/lib/jmeter-ruby/dsl/include_controller.rb +25 -0
  111. data/lib/jmeter-ruby/dsl/java_request.rb +69 -0
  112. data/lib/jmeter-ruby/dsl/java_request_defaults.rb +69 -0
  113. data/lib/jmeter-ruby/dsl/jdbc_connection_configuration.rb +37 -0
  114. data/lib/jmeter-ruby/dsl/jdbc_postprocessor.rb +33 -0
  115. data/lib/jmeter-ruby/dsl/jdbc_preprocessor.rb +33 -0
  116. data/lib/jmeter-ruby/dsl/jdbc_request.rb +33 -0
  117. data/lib/jmeter-ruby/dsl/jms_pointtopoint.rb +41 -0
  118. data/lib/jmeter-ruby/dsl/jms_publisher.rb +43 -0
  119. data/lib/jmeter-ruby/dsl/jms_subscriber.rb +35 -0
  120. data/lib/jmeter-ruby/dsl/json_path_postprocessor.rb +27 -0
  121. data/lib/jmeter-ruby/dsl/jsr223_assertion.rb +29 -0
  122. data/lib/jmeter-ruby/dsl/jsr223_listener.rb +29 -0
  123. data/lib/jmeter-ruby/dsl/jsr223_postprocessor.rb +29 -0
  124. data/lib/jmeter-ruby/dsl/jsr223_preprocessor.rb +29 -0
  125. data/lib/jmeter-ruby/dsl/jsr223_sampler.rb +29 -0
  126. data/lib/jmeter-ruby/dsl/jsr223_timer.rb +29 -0
  127. data/lib/jmeter-ruby/dsl/junit_request.rb +37 -0
  128. data/lib/jmeter-ruby/dsl/keystore_configuration.rb +28 -0
  129. data/lib/jmeter-ruby/dsl/ldap_extended_request.rb +42 -0
  130. data/lib/jmeter-ruby/dsl/ldap_extended_request_defaults.rb +42 -0
  131. data/lib/jmeter-ruby/dsl/ldap_request.rb +35 -0
  132. data/lib/jmeter-ruby/dsl/ldap_request_defaults.rb +39 -0
  133. data/lib/jmeter-ruby/dsl/login_config_element.rb +26 -0
  134. data/lib/jmeter-ruby/dsl/loop_controller.rb +26 -0
  135. data/lib/jmeter-ruby/dsl/mail_reader_sampler.rb +37 -0
  136. data/lib/jmeter-ruby/dsl/mailer_visualizer.rb +64 -0
  137. data/lib/jmeter-ruby/dsl/md5hex_assertion.rb +25 -0
  138. data/lib/jmeter-ruby/dsl/module_controller.rb +25 -0
  139. data/lib/jmeter-ruby/dsl/monitor_results.rb +55 -0
  140. data/lib/jmeter-ruby/dsl/once_only_controller.rb +23 -0
  141. data/lib/jmeter-ruby/dsl/os_process_sampler.rb +34 -0
  142. data/lib/jmeter-ruby/dsl/poisson_random_timer.rb +26 -0
  143. data/lib/jmeter-ruby/dsl/random_controller.rb +25 -0
  144. data/lib/jmeter-ruby/dsl/random_order_controller.rb +23 -0
  145. data/lib/jmeter-ruby/dsl/random_variable.rb +30 -0
  146. data/lib/jmeter-ruby/dsl/recording_controller.rb +23 -0
  147. data/lib/jmeter-ruby/dsl/regex_user_parameters.rb +27 -0
  148. data/lib/jmeter-ruby/dsl/regular_expression_extractor.rb +32 -0
  149. data/lib/jmeter-ruby/dsl/response_assertion.rb +31 -0
  150. data/lib/jmeter-ruby/dsl/response_time_graph.rb +55 -0
  151. data/lib/jmeter-ruby/dsl/result_status_action_handler.rb +25 -0
  152. data/lib/jmeter-ruby/dsl/runtime_controller.rb +25 -0
  153. data/lib/jmeter-ruby/dsl/save_responses_to_a_file.rb +29 -0
  154. data/lib/jmeter-ruby/dsl/setup_thread_group.rb +36 -0
  155. data/lib/jmeter-ruby/dsl/simple_config_element.rb +23 -0
  156. data/lib/jmeter-ruby/dsl/simple_controller.rb +23 -0
  157. data/lib/jmeter-ruby/dsl/simple_data_writer.rb +55 -0
  158. data/lib/jmeter-ruby/dsl/smime_assertion.rb +35 -0
  159. data/lib/jmeter-ruby/dsl/smtp_sampler.rb +51 -0
  160. data/lib/jmeter-ruby/dsl/soapxmlrpc_request.rb +33 -0
  161. data/lib/jmeter-ruby/dsl/spline_visualizer.rb +55 -0
  162. data/lib/jmeter-ruby/dsl/summary_report.rb +55 -0
  163. data/lib/jmeter-ruby/dsl/switch_controller.rb +25 -0
  164. data/lib/jmeter-ruby/dsl/synchronizing_timer.rb +26 -0
  165. data/lib/jmeter-ruby/dsl/tcp_sampler.rb +33 -0
  166. data/lib/jmeter-ruby/dsl/tcp_sampler_config.rb +31 -0
  167. data/lib/jmeter-ruby/dsl/test_action.rb +27 -0
  168. data/lib/jmeter-ruby/dsl/test_fragment.rb +23 -0
  169. data/lib/jmeter-ruby/dsl/test_plan.rb +31 -0
  170. data/lib/jmeter-ruby/dsl/thread_group.rb +37 -0
  171. data/lib/jmeter-ruby/dsl/throughput_controller.rb +32 -0
  172. data/lib/jmeter-ruby/dsl/transaction_controller.rb +26 -0
  173. data/lib/jmeter-ruby/dsl/uniform_random_timer.rb +26 -0
  174. data/lib/jmeter-ruby/dsl/user_defined_variables.rb +33 -0
  175. data/lib/jmeter-ruby/dsl/user_parameters.rb +30 -0
  176. data/lib/jmeter-ruby/dsl/view_results_in_table.rb +55 -0
  177. data/lib/jmeter-ruby/dsl/view_results_tree.rb +55 -0
  178. data/lib/jmeter-ruby/dsl/while_controller.rb +25 -0
  179. data/lib/jmeter-ruby/dsl/xml_assertion.rb +23 -0
  180. data/lib/jmeter-ruby/dsl/xml_schema_assertion.rb +25 -0
  181. data/lib/jmeter-ruby/dsl/xpath_assertion.rb +31 -0
  182. data/lib/jmeter-ruby/dsl/xpath_extractor.rb +31 -0
  183. data/lib/jmeter-ruby/dsl.rb +102 -0
  184. data/lib/jmeter-ruby/extend/assertions/response_assertion.rb +36 -0
  185. data/lib/jmeter-ruby/extend/config_elements/header_manager.rb +13 -0
  186. data/lib/jmeter-ruby/extend/config_elements/http_cache_manager.rb +12 -0
  187. data/lib/jmeter-ruby/extend/config_elements/http_cookie_manager.rb +36 -0
  188. data/lib/jmeter-ruby/extend/config_elements/http_request_defaults.rb +39 -0
  189. data/lib/jmeter-ruby/extend/config_elements/user_defined_variables.rb +13 -0
  190. data/lib/jmeter-ruby/extend/config_elements/user_parameters.rb +31 -0
  191. data/lib/jmeter-ruby/extend/controllers/foreach_controller.rb +27 -0
  192. data/lib/jmeter-ruby/extend/controllers/loop_controller.rb +11 -0
  193. data/lib/jmeter-ruby/extend/controllers/module_controller.rb +23 -0
  194. data/lib/jmeter-ruby/extend/controllers/throughput_controller.rb +15 -0
  195. data/lib/jmeter-ruby/extend/controllers/transaction_controller.rb +14 -0
  196. data/lib/jmeter-ruby/extend/misc/aliases.rb +21 -0
  197. data/lib/jmeter-ruby/extend/misc/exists.rb +13 -0
  198. data/lib/jmeter-ruby/extend/misc/rsync.rb +24 -0
  199. data/lib/jmeter-ruby/extend/misc/uuid.rb +12 -0
  200. data/lib/jmeter-ruby/extend/misc/with_helpers.rb +27 -0
  201. data/lib/jmeter-ruby/extend/plugins/jmeter_plugins.rb +120 -0
  202. data/lib/jmeter-ruby/extend/processors/extract.rb +28 -0
  203. data/lib/jmeter-ruby/extend/processors/regular_expression_extractor.rb +25 -0
  204. data/lib/jmeter-ruby/extend/samplers/http_request.rb +58 -0
  205. data/lib/jmeter-ruby/extend/samplers/jms_pointtopoint.rb +26 -0
  206. data/lib/jmeter-ruby/extend/samplers/soapxmlrpc_request.rb +9 -0
  207. data/lib/jmeter-ruby/extend/threads/setup_thread_group.rb +18 -0
  208. data/lib/jmeter-ruby/extend/threads/thread_group.rb +19 -0
  209. data/lib/jmeter-ruby/extend/timers/constant_throughput_timer.rb +11 -0
  210. data/lib/jmeter-ruby/extend/timers/random_timer.rb +14 -0
  211. data/lib/jmeter-ruby/helpers/fallback_content_proxy.rb +54 -0
  212. data/lib/jmeter-ruby/helpers/helper.rb +75 -0
  213. data/lib/jmeter-ruby/helpers/logger-colors.rb +48 -0
  214. data/lib/jmeter-ruby/helpers/parser.rb +135 -0
  215. data/lib/jmeter-ruby/helpers/strip-heredoc.rb +5 -0
  216. data/lib/jmeter-ruby/helpers/user-agents.rb +27 -0
  217. data/lib/jmeter-ruby/idl.rb +70 -0
  218. data/lib/jmeter-ruby/idl.xml +1488 -0
  219. data/lib/jmeter-ruby/plugins/active_threads_over_time.rb +57 -0
  220. data/lib/jmeter-ruby/plugins/composite_graph.rb +71 -0
  221. data/lib/jmeter-ruby/plugins/console_status_logger.rb +15 -0
  222. data/lib/jmeter-ruby/plugins/dummy_sampler.rb +26 -0
  223. data/lib/jmeter-ruby/plugins/jmx_collector.rb +73 -0
  224. data/lib/jmeter-ruby/plugins/json_path_assertion.rb +19 -0
  225. data/lib/jmeter-ruby/plugins/json_path_extractor.rb +20 -0
  226. data/lib/jmeter-ruby/plugins/latencies_over_time.rb +49 -0
  227. data/lib/jmeter-ruby/plugins/loadosophia_uploader.rb +63 -0
  228. data/lib/jmeter-ruby/plugins/perfmon_collector.rb +80 -0
  229. data/lib/jmeter-ruby/plugins/redis_data_set.rb +39 -0
  230. data/lib/jmeter-ruby/plugins/response_codes_per_second.rb +49 -0
  231. data/lib/jmeter-ruby/plugins/response_times_distribution.rb +49 -0
  232. data/lib/jmeter-ruby/plugins/response_times_over_time.rb +50 -0
  233. data/lib/jmeter-ruby/plugins/response_times_percentiles.rb +51 -0
  234. data/lib/jmeter-ruby/plugins/stepping_thread_group.rb +30 -0
  235. data/lib/jmeter-ruby/plugins/transactions_per_second.rb +50 -0
  236. data/lib/jmeter-ruby/plugins/ultimate_thread_group.rb +23 -0
  237. data/lib/jmeter-ruby/plugins/variable_throughput_timer.rb +27 -0
  238. data/lib/jmeter-ruby/version.rb +12 -0
  239. data/lib/jmeter-ruby.rb +27 -0
  240. data/mise.toml +2 -0
  241. data/script/release +162 -0
  242. data/spec/constant_throughput_timer_spec.rb +20 -0
  243. data/spec/csv_data_set_config_spec.rb +33 -0
  244. data/spec/header_manager_spec.rb +37 -0
  245. data/spec/http_cache_manager_spec.rb +29 -0
  246. data/spec/http_cookie_manager_spec.rb +169 -0
  247. data/spec/http_request_defaults_spec.rb +57 -0
  248. data/spec/http_request_spec.rb +305 -0
  249. data/spec/jmeter_plugins_spec.rb +245 -0
  250. data/spec/json_extractor_spec.rb +19 -0
  251. data/spec/json_path_assertion_spec.rb +28 -0
  252. data/spec/logic_controller_spec.rb +148 -0
  253. data/spec/loop_controller_spec.rb +19 -0
  254. data/spec/module_controller_spec.rb +56 -0
  255. data/spec/regular_expression_extractor_spec.rb +63 -0
  256. data/spec/response_assertion_spec.rb +69 -0
  257. data/spec/setup_thread_group_spec.rb +31 -0
  258. data/spec/spec_helper.rb +19 -0
  259. data/spec/thread_group_spec.rb +57 -0
  260. data/spec/throughput_controller_spec.rb +24 -0
  261. data/spec/transaction_controller_spec.rb +30 -0
  262. data/spec/user_defined_variables_spec.rb +22 -0
  263. data/spec/user_parameters_spec.rb +45 -0
  264. data/spec/with_helpers_spec.rb +57 -0
  265. data/spec/xpath_extractor_spec.rb +15 -0
  266. 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
@@ -0,0 +1,12 @@
1
+ module JmeterRuby
2
+ module VERSION
3
+ MAJOR = 3
4
+ MINOR = 0
5
+ PATCH = 0
6
+ PRE = nil
7
+
8
+ STRING = [MAJOR, MINOR, PATCH, PRE].compact.join(".")
9
+ end
10
+ end
11
+
12
+ puts JmeterRuby::VERSION::STRING if __FILE__ == $PROGRAM_NAME
@@ -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
@@ -0,0 +1,2 @@
1
+ [tools]
2
+ ruby = "3.4.2"
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