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,26 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def transaction_controller(params={}, &block)
4
+ node = JmeterRuby::TransactionController.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class TransactionController
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'TransactionController' : (params[:name] || 'TransactionController')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <TransactionController guiclass="TransactionControllerGui" testclass="TransactionController" testname="#{testname}" enabled="true">
17
+ <boolProp name="TransactionController.parent">true</boolProp>
18
+ <boolProp name="TransactionController.includeTimers">false</boolProp>
19
+ </TransactionController>)
20
+ EOS
21
+ update params
22
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,26 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def uniform_random_timer(params={}, &block)
4
+ node = JmeterRuby::UniformRandomTimer.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class UniformRandomTimer
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'UniformRandomTimer' : (params[:name] || 'UniformRandomTimer')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <UniformRandomTimer guiclass="UniformRandomTimerGui" testclass="UniformRandomTimer" testname="#{testname}" enabled="true">
17
+ <stringProp name="ConstantTimer.delay">0</stringProp>
18
+ <stringProp name="RandomTimer.range">100.0</stringProp>
19
+ </UniformRandomTimer>)
20
+ EOS
21
+ update params
22
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,33 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def user_defined_variables(params={}, &block)
4
+ node = JmeterRuby::UserDefinedVariables.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class UserDefinedVariables
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'UserDefinedVariables' : (params[:name] || 'UserDefinedVariables')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="#{testname}" enabled="true">
17
+ <collectionProp name="Arguments.arguments">
18
+ <elementProp name=" " elementType="Argument">
19
+ <stringProp name="Argument.name"> </stringProp>
20
+ <stringProp name="Argument.value"> </stringProp>
21
+ <stringProp name="Argument.metadata">=</stringProp>
22
+ <stringProp name="Argument.desc"> </stringProp>
23
+ </elementProp>
24
+ </collectionProp>
25
+ <stringProp name="TestPlan.comments"> </stringProp>
26
+ </Arguments>)
27
+ EOS
28
+ update params
29
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,30 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def user_parameters(params={}, &block)
4
+ node = JmeterRuby::UserParameters.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class UserParameters
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'UserParameters' : (params[:name] || 'UserParameters')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <UserParameters guiclass="UserParametersGui" testclass="UserParameters" testname="#{testname}" enabled="true">
17
+ <collectionProp name="UserParameters.names"/>
18
+ <collectionProp name="UserParameters.thread_values">
19
+ <collectionProp name="1"/>
20
+ <collectionProp name="1"/>
21
+ </collectionProp>
22
+ <boolProp name="UserParameters.per_iteration">false</boolProp>
23
+ </UserParameters>)
24
+ EOS
25
+ update params
26
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,55 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def view_results_in_table(params={}, &block)
4
+ node = JmeterRuby::ViewResultsInTable.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class ViewResultsInTable
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'ViewResultsInTable' : (params[:name] || 'ViewResultsInTable')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <ResultCollector guiclass="TableVisualizer" testclass="ResultCollector" testname="#{testname}" enabled="true">
17
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
18
+ <objProp>
19
+ <name>saveConfig</name>
20
+ <value class="SampleSaveConfiguration">
21
+ <time>true</time>
22
+ <latency>true</latency>
23
+ <timestamp>true</timestamp>
24
+ <success>true</success>
25
+ <label>true</label>
26
+ <code>true</code>
27
+ <message>false</message>
28
+ <threadName>true</threadName>
29
+ <dataType>false</dataType>
30
+ <encoding>false</encoding>
31
+ <assertions>false</assertions>
32
+ <subresults>false</subresults>
33
+ <responseData>false</responseData>
34
+ <samplerData>false</samplerData>
35
+ <xml>false</xml>
36
+ <fieldNames>false</fieldNames>
37
+ <responseHeaders>false</responseHeaders>
38
+ <requestHeaders>false</requestHeaders>
39
+ <responseDataOnError>false</responseDataOnError>
40
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
41
+ <assertionsResultsToSave>0</assertionsResultsToSave>
42
+ <bytes>true</bytes>
43
+ <threadCounts>true</threadCounts>
44
+ <sampleCount>true</sampleCount>
45
+ </value>
46
+ </objProp>
47
+ <stringProp name="filename"/>
48
+ </ResultCollector>)
49
+ EOS
50
+ update params
51
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,55 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def view_results_tree(params={}, &block)
4
+ node = JmeterRuby::ViewResultsTree.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class ViewResultsTree
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'ViewResultsTree' : (params[:name] || 'ViewResultsTree')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="#{testname}" enabled="true">
17
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
18
+ <objProp>
19
+ <name>saveConfig</name>
20
+ <value class="SampleSaveConfiguration">
21
+ <time>true</time>
22
+ <latency>true</latency>
23
+ <timestamp>true</timestamp>
24
+ <success>true</success>
25
+ <label>true</label>
26
+ <code>true</code>
27
+ <message>false</message>
28
+ <threadName>true</threadName>
29
+ <dataType>false</dataType>
30
+ <encoding>false</encoding>
31
+ <assertions>false</assertions>
32
+ <subresults>false</subresults>
33
+ <responseData>false</responseData>
34
+ <samplerData>false</samplerData>
35
+ <xml>false</xml>
36
+ <fieldNames>false</fieldNames>
37
+ <responseHeaders>false</responseHeaders>
38
+ <requestHeaders>false</requestHeaders>
39
+ <responseDataOnError>false</responseDataOnError>
40
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
41
+ <assertionsResultsToSave>0</assertionsResultsToSave>
42
+ <bytes>true</bytes>
43
+ <threadCounts>true</threadCounts>
44
+ <sampleCount>true</sampleCount>
45
+ </value>
46
+ </objProp>
47
+ <stringProp name="filename"/>
48
+ </ResultCollector>)
49
+ EOS
50
+ update params
51
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,25 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def while_controller(params={}, &block)
4
+ node = JmeterRuby::WhileController.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class WhileController
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'WhileController' : (params[:name] || 'WhileController')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <WhileController guiclass="WhileControllerGui" testclass="WhileController" testname="#{testname}" enabled="true">
17
+ <stringProp name="WhileController.condition"/>
18
+ </WhileController>)
19
+ EOS
20
+ update params
21
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,23 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def xml_assertion(params={}, &block)
4
+ node = JmeterRuby::XmlAssertion.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class XmlAssertion
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'XmlAssertion' : (params[:name] || 'XmlAssertion')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <XMLAssertion guiclass="XMLAssertionGui" testclass="XMLAssertion" testname="#{testname}" enabled="true"/>)
17
+ EOS
18
+ update params
19
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,25 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def xml_schema_assertion(params={}, &block)
4
+ node = JmeterRuby::XmlSchemaAssertion.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class XmlSchemaAssertion
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'XmlSchemaAssertion' : (params[:name] || 'XmlSchemaAssertion')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <XMLSchemaAssertion guiclass="XMLSchemaAssertionGUI" testclass="XMLSchemaAssertion" testname="#{testname}" enabled="true">
17
+ <stringProp name="xmlschema_assertion_filename"/>
18
+ </XMLSchemaAssertion>)
19
+ EOS
20
+ update params
21
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,31 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def xpath_assertion(params={}, &block)
4
+ node = JmeterRuby::XpathAssertion.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class XpathAssertion
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'XpathAssertion' : (params[:name] || 'XpathAssertion')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <XPathAssertion guiclass="XPathAssertionGui" testclass="XPathAssertion" testname="#{testname}" enabled="true">
17
+ <boolProp name="XPath.negate">false</boolProp>
18
+ <stringProp name="XPath.xpath">/</stringProp>
19
+ <boolProp name="XPath.validate">false</boolProp>
20
+ <boolProp name="XPath.whitespace">false</boolProp>
21
+ <boolProp name="XPath.tolerant">false</boolProp>
22
+ <boolProp name="XPath.namespace">false</boolProp>
23
+ <stringProp name="Assertion.scope">all</stringProp>
24
+ </XPathAssertion>)
25
+ EOS
26
+ update params
27
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,31 @@
1
+ module JmeterRuby
2
+ class DSL
3
+ def xpath_extractor(params={}, &block)
4
+ node = JmeterRuby::XpathExtractor.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class XpathExtractor
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ testname = params.kind_of?(Array) ? 'XpathExtractor' : (params[:name] || 'XpathExtractor')
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="#{testname}" enabled="true">
17
+ <stringProp name="XPathExtractor.default"/>
18
+ <stringProp name="XPathExtractor.refname"/>
19
+ <stringProp name="XPathExtractor.xpathQuery"/>
20
+ <boolProp name="XPathExtractor.validate">false</boolProp>
21
+ <boolProp name="XPathExtractor.tolerant">false</boolProp>
22
+ <boolProp name="XPathExtractor.namespace">false</boolProp>
23
+ <stringProp name="Sample.scope">all</stringProp>
24
+ </XPathExtractor>)
25
+ EOS
26
+ update params
27
+ update_at_xpath params if params.is_a?(Hash) && params[:update_at_xpath]
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,102 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ include Parser
4
+ attr_accessor :root
5
+
6
+ def initialize(params = {})
7
+ @root = Nokogiri::XML(<<-EOF.strip_heredoc)
8
+ <?xml version="1.0" encoding="UTF-8"?>
9
+ <jmeterTestPlan version="1.2" properties="3.1" jmeter="3.1" jmeter-ruby="3.0">
10
+ <hashTree>
11
+ </hashTree>
12
+ </jmeterTestPlan>
13
+ EOF
14
+ node = JmeterRuby::TestPlan.new(params)
15
+
16
+ @current_node = @root.at_xpath('//jmeterTestPlan/hashTree')
17
+ @current_node = attach_to_last(node)
18
+ end
19
+
20
+ def out(params = {})
21
+ puts doc.to_xml(indent: 2)
22
+ end
23
+
24
+ def jmx(params = {})
25
+ file(params)
26
+ logger.info "Test plan saved to: #{params[:file]}"
27
+ end
28
+
29
+ def to_xml
30
+ doc.to_xml(indent: 2)
31
+ end
32
+
33
+ def to_doc
34
+ doc.clone
35
+ end
36
+
37
+ def run(params = {})
38
+ file(params)
39
+ logger.warn 'Test executing locally ...'
40
+
41
+ cmd = "#{params[:path] ? File.join(params[:path], 'jmeter') : 'jmeter'} #{"-n" unless params[:gui] } -t #{params[:file]} -j #{params[:log] ? params[:log] : 'jmeter.log' } -l #{params[:jtl] ? params[:jtl] : 'jmeter.jtl' } #{build_properties(params[:properties]) if params[:properties]}"
42
+ logger.debug cmd if params[:debug]
43
+ Open3.popen2e("#{cmd}") do |stdin, stdout_err, wait_thr|
44
+ while line = stdout_err.gets
45
+ logger.debug line.chomp if params[:debug]
46
+ end
47
+
48
+ exit_status = wait_thr.value
49
+ abort "FAILED !!! #{cmd}" unless exit_status.success?
50
+ end
51
+ logger.info "Local Results at: #{params[:jtl] ? params[:jtl] : 'jmeter.jtl'}"
52
+ end
53
+
54
+ private
55
+
56
+ def hash_tree
57
+ Nokogiri::XML::Node.new("hashTree", @root)
58
+ end
59
+
60
+ def attach_to_last(node)
61
+ ht = hash_tree
62
+ last_node = @current_node
63
+ last_node << node.doc.children << ht
64
+ ht
65
+ end
66
+
67
+ def attach_node(node, &block)
68
+ ht = attach_to_last(node)
69
+ previous = @current_node
70
+ @current_node = ht
71
+ instance_exec(&block) if block
72
+ @current_node = previous
73
+ end
74
+
75
+ def file(params = {})
76
+ params[:file] ||= 'jmeter-ruby.jmx'
77
+ File.open(params[:file], 'w') { |file| file.write(doc.to_xml(indent: 2)) }
78
+ end
79
+
80
+ def doc
81
+ Nokogiri::XML(@root.to_s, &:noblanks)
82
+ end
83
+
84
+ def build_properties(properties)
85
+ if properties.kind_of?(String)
86
+ "-q #{properties}"
87
+ elsif properties.kind_of?(Hash)
88
+ properties.map{ |k,v| "-J#{k}=#{v}" }.join(" ")
89
+ end
90
+ end
91
+
92
+ def logger
93
+ @log ||= Logger.new(STDOUT)
94
+ @log.level = Logger::DEBUG
95
+ @log
96
+ end
97
+ end
98
+ end
99
+
100
+ def test(params = {}, &block)
101
+ JmeterRuby.dsl_eval(JmeterRuby::ExtendedDSL.new(params), &block)
102
+ end
@@ -0,0 +1,36 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def response_assertion(params, &block)
4
+ params[:test_type] = parse_test_type(params)
5
+ params['0'] = params.values.first
6
+
7
+ if params[:json]
8
+ params[:EXPECTED_VALUE] = params[:value]
9
+ params[:JSON_PATH] = params[:json]
10
+ node = JmeterRuby::Plugins::JsonPathAssertion.new(params)
11
+ end
12
+
13
+ node ||= JmeterRuby::ResponseAssertion.new(params).tap do |node|
14
+ if params[:variable]
15
+ params['Scope.variable'] = params[:variable]
16
+ node.doc.xpath("//stringProp[@name='Assertion.scope']").first.content = 'variable'
17
+
18
+ node.doc.children.first.add_child (
19
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
20
+ <stringProp name="Scope.variable">#{params[:variable]}</stringProp>
21
+ EOS
22
+ )
23
+ end
24
+
25
+ if params[:scope] == 'main'
26
+ node.doc.xpath("//stringProp[@name='Assertion.scope']").remove
27
+ end
28
+ end
29
+
30
+ attach_node(node, &block)
31
+ end
32
+
33
+ alias assert response_assertion
34
+ alias web_reg_find response_assertion
35
+ end
36
+ end
@@ -0,0 +1,13 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def http_header_manager(params, &block)
4
+ if params.is_a?(Hash)
5
+ params['Header.name'] = params[:name]
6
+ end
7
+
8
+ super
9
+ end
10
+
11
+ alias header http_header_manager
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def http_cache_manager(params = {}, &block)
4
+ params[:clearEachIteration] = true if params.keys.include? :clear_each_iteration
5
+ params[:useExpires] = true if params.keys.include? :use_expires
6
+
7
+ super
8
+ end
9
+
10
+ alias cache http_cache_manager
11
+ end
12
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JmeterRuby
4
+ class ExtendedDSL < DSL
5
+ def http_cookie_manager(params = {}, &block)
6
+ params[:clearEachIteration] = true if params.keys.include? :clear_each_iteration
7
+
8
+ node = JmeterRuby::HttpCookieManager.new(params)
9
+
10
+ params[:user_defined_cookies]&.each { |cookie| add_cookie_to_collection(cookie, node) }
11
+
12
+ attach_node(node, &block)
13
+ end
14
+
15
+ alias cookies http_cookie_manager
16
+
17
+ private
18
+
19
+ def add_cookie_to_collection(cookie, node)
20
+ raise 'Cookie name must be provided.' unless cookie[:name]
21
+ raise 'Cookie value must be provided.' unless cookie[:value]
22
+ node.doc.at_xpath('//collectionProp') <<
23
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
24
+ <elementProp name="#{cookie[:name]}" elementType="Cookie" testname="#{cookie[:name]}">
25
+ <stringProp name="Cookie.value">#{cookie[:value]}</stringProp>
26
+ <stringProp name="Cookie.domain">#{cookie[:domain]}</stringProp>
27
+ <stringProp name="Cookie.path">#{cookie[:path]}</stringProp>
28
+ <boolProp name="Cookie.secure">#{cookie[:secure] || false}</boolProp>
29
+ <longProp name="Cookie.expires">0</longProp>
30
+ <boolProp name="Cookie.path_specified">true</boolProp>
31
+ <boolProp name="Cookie.domain_specified">true</boolProp>
32
+ </elementProp>
33
+ EOS
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,39 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def http_request_defaults(params = {}, &block)
4
+ params[:image_parser] = true if params.keys.include? :download_resources
5
+ params[:concurrentDwn] = true if params.keys.include? :use_concurrent_pool
6
+ params[:concurrentPool] = params[:use_concurrent_pool] if params.keys.include? :use_concurrent_pool
7
+
8
+ node = JmeterRuby::HttpRequestDefaults.new(params).tap do |node|
9
+ node.doc.children.first.add_child (
10
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
11
+ <stringProp name="HTTPSampler.embedded_url_re">#{params[:urls_must_match]}</stringProp>
12
+ EOS
13
+ ) if params[:urls_must_match]
14
+
15
+ node.doc.children.first.add_child (
16
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
17
+ <boolProp name="HTTPSampler.md5">true</stringProp>
18
+ EOS
19
+ ) if params[:md5]
20
+
21
+ node.doc.children.first.add_child (
22
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
23
+ <stringProp name="HTTPSampler.proxyHost">#{params[:proxy_host]}</stringProp>
24
+ EOS
25
+ ) if params[:proxy_host]
26
+
27
+ node.doc.children.first.add_child (
28
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
29
+ <stringProp name="HTTPSampler.proxyPort">#{params[:proxy_port]}</stringProp>
30
+ EOS
31
+ ) if params[:proxy_port]
32
+ end
33
+
34
+ attach_node(node, &block)
35
+ end
36
+
37
+ alias defaults http_request_defaults
38
+ end
39
+ end
@@ -0,0 +1,13 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def user_defined_variables(params, &block)
4
+ if params.is_a?(Hash)
5
+ params['Argument.name'] = params[:name]
6
+ end
7
+
8
+ super
9
+ end
10
+
11
+ alias variables user_defined_variables
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def user_parameters(params, &block)
4
+ params['Argument.name'] = params[:name] if params.is_a?(Hash)
5
+
6
+ params[:names] = Nokogiri::XML::Builder.new do |b|
7
+ b.builder do
8
+ params[:names].each do |name|
9
+ b.stringProp name, name: name
10
+ end
11
+ end
12
+ end
13
+
14
+ params[:thread_values] = Nokogiri::XML::Builder.new do |b|
15
+ b.builder do
16
+ params[:thread_values].map do |user, values|
17
+ b.collectionProp name: user do
18
+ values.each_with_index.map do |value, index|
19
+ b.stringProp value, name: index
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ super
27
+ end
28
+
29
+ alias parameters user_parameters
30
+ end
31
+ end