ruby-jmeter 2.13.10 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +1 -1
  5. data/Gemfile +2 -2
  6. data/LICENSE.txt +2 -2
  7. data/README.md +4 -5
  8. data/Rakefile +3 -3
  9. data/examples/{basic_os_process_sampler.rb → OS_process_sampler.rb} +1 -1
  10. data/examples/{basic_assertion_results.rb → assertion_results.rb} +1 -3
  11. data/examples/basic_auth.rb +1 -1
  12. data/examples/{basic_browser_headers.rb → browser_headers.rb} +1 -1
  13. data/examples/{basic_composite_graph.rb → composite_graph.rb} +1 -1
  14. data/examples/{basic_gc_dummy_sampler.rb → dummy_sampler.rb} +1 -3
  15. data/examples/{basic_duration_assertion.rb → duration_assertion.rb} +1 -1
  16. data/examples/etsy_login_browse.rb +1 -4
  17. data/examples/{basic_extract.rb → extract.rb} +1 -1
  18. data/examples/{basic_foreach.rb → foreach_controller.rb} +1 -4
  19. data/examples/{basic_header.rb → header_manager.rb} +2 -3
  20. data/examples/{basic_cache.rb → http_cache_manager.rb} +1 -1
  21. data/examples/{basic_cookies.rb → http_cookie_manager.rb} +1 -1
  22. data/examples/{basic_http_request_defaults.rb → http_request_defaults.rb} +3 -2
  23. data/examples/{basic_post.rb → http_request_post.rb} +1 -5
  24. data/examples/{basic_http_request_with_files.rb → http_request_with_files.rb} +1 -1
  25. data/examples/{basic_query_params.rb → http_request_with_query_params.rb} +1 -1
  26. data/examples/{basic_gc_results.rb → jmeter_plugins_graphs.rb} +1 -2
  27. data/examples/{basic_json_path_assertion.rb → json_path_assertions.rb} +1 -1
  28. data/examples/{basic_json_path_extractor.rb → json_path_extractor.rb} +1 -3
  29. data/examples/{basic_ldap_ext.rb → ldap_sampler.rb} +1 -1
  30. data/examples/{basic_loadosophia.rb → loadosophia.rb} +1 -1
  31. data/examples/{basic_loops.rb → loop_controller.rb} +2 -2
  32. data/examples/{basic_counter.rb → loops_with_counter.rb} +2 -2
  33. data/examples/{basic_perfmon.rb → perfmon.rb} +1 -1
  34. data/examples/real_page_objects.rb +1 -1
  35. data/examples/real_user_objects_github.rb +1 -1
  36. data/examples/regular_expression_extractor.rb +11 -0
  37. data/examples/{basic_assertion.rb → response_assertion.rb} +2 -1
  38. data/examples/{basic_response_time_percentiles_graph.rb → response_time_percentiles_graph.rb} +1 -2
  39. data/examples/{basic_simple_data_writer.rb → simple_data_writer_listener.rb} +1 -1
  40. data/examples/{basic_stepping_thread_group.rb → stepping_thread_group.rb} +1 -3
  41. data/examples/{basic_test_fragment.rb → test_fragment.rb} +1 -1
  42. data/examples/{basic_think_time.rb → think_time.rb} +2 -2
  43. data/examples/{basic_thread_groups.rb → thread_groups.rb} +1 -1
  44. data/examples/{basic_throughput_controller.rb → throughput_controller.rb} +1 -1
  45. data/examples/{basic_throughput_shaping_timer.rb → throughput_shaping_timer.rb} +1 -2
  46. data/examples/{basic_ultimate_thread_group.rb → ultimate_thread_group.rb} +1 -2
  47. data/examples/{basic_user_defined_variables.rb → user_defined_variables.rb} +1 -1
  48. data/examples/{basic_preprocessor_user_parameters.rb → user_parameters.rb} +7 -7
  49. data/lib/ruby-jmeter.rb +13 -8
  50. data/lib/ruby-jmeter/DSL.md +3 -1
  51. data/lib/ruby-jmeter/dsl.rb +11 -615
  52. data/lib/ruby-jmeter/dsl/foreach_controller.rb +0 -2
  53. data/lib/ruby-jmeter/dsl/html_parameter_mask.rb +3 -3
  54. data/lib/ruby-jmeter/dsl/http_request.rb +0 -2
  55. data/lib/ruby-jmeter/dsl/http_request_defaults.rb +0 -1
  56. data/lib/ruby-jmeter/dsl/jms_publisher.rb +2 -0
  57. data/lib/ruby-jmeter/dsl/regular_expression_extractor.rb +1 -3
  58. data/lib/ruby-jmeter/dsl/response_assertion.rb +0 -1
  59. data/lib/ruby-jmeter/dsl/test_fragment.rb +1 -1
  60. data/lib/ruby-jmeter/dsl/user_parameters.rb +3 -1
  61. data/lib/ruby-jmeter/extend/assertions/response_assertion.rb +36 -0
  62. data/lib/ruby-jmeter/extend/config_elements/header_manager.rb +13 -0
  63. data/lib/ruby-jmeter/extend/config_elements/http_cache_manager.rb +11 -0
  64. data/lib/ruby-jmeter/extend/config_elements/http_cookie_manager.rb +11 -0
  65. data/lib/ruby-jmeter/extend/config_elements/http_request_defaults.rb +28 -0
  66. data/lib/ruby-jmeter/extend/config_elements/user_defined_variables.rb +13 -0
  67. data/lib/ruby-jmeter/extend/config_elements/user_parameters.rb +31 -0
  68. data/lib/ruby-jmeter/extend/controllers/foreach_controller.rb +25 -0
  69. data/lib/ruby-jmeter/extend/controllers/loop_controller.rb +11 -0
  70. data/lib/ruby-jmeter/extend/controllers/module_controller.rb +23 -0
  71. data/lib/ruby-jmeter/extend/controllers/throughput_controller.rb +15 -0
  72. data/lib/ruby-jmeter/extend/controllers/transaction_controller.rb +14 -0
  73. data/lib/ruby-jmeter/extend/misc/aliases.rb +21 -0
  74. data/lib/ruby-jmeter/extend/misc/exists.rb +13 -0
  75. data/lib/ruby-jmeter/extend/misc/flood.rb +48 -0
  76. data/lib/ruby-jmeter/extend/misc/with_helpers.rb +27 -0
  77. data/lib/ruby-jmeter/extend/plugins/jmeter_plugins.rb +115 -0
  78. data/lib/ruby-jmeter/extend/processors/extract.rb +28 -0
  79. data/lib/ruby-jmeter/extend/processors/regular_expression_extractor.rb +25 -0
  80. data/lib/ruby-jmeter/extend/samplers/http_request.rb +47 -0
  81. data/lib/ruby-jmeter/extend/samplers/soapxmlrpc_request.rb +9 -0
  82. data/lib/ruby-jmeter/extend/threads/setup_thread_group.rb +18 -0
  83. data/lib/ruby-jmeter/extend/threads/thread_group.rb +19 -0
  84. data/lib/ruby-jmeter/extend/timers/constant_throughput_timer.rb +12 -0
  85. data/lib/ruby-jmeter/extend/timers/random_timer.rb +14 -0
  86. data/lib/ruby-jmeter/helpers/helper.rb +1 -2
  87. data/lib/ruby-jmeter/idl.xml +6 -4
  88. data/lib/ruby-jmeter/version.rb +1 -1
  89. data/ruby-jmeter.gemspec +7 -7
  90. data/spec/constant_throughput_timer_spec.rb +22 -0
  91. data/spec/header_manager_spec.rb +37 -0
  92. data/spec/http_cache_manager_spec.rb +17 -0
  93. data/spec/http_cookie_manager_spec.rb +17 -0
  94. data/spec/http_request_defaults_spec.rb +47 -0
  95. data/spec/http_request_spec.rb +305 -0
  96. data/spec/jmeter_plugins_spec.rb +155 -0
  97. data/spec/json_extractor_spec.rb +19 -0
  98. data/spec/json_path_assertion_spec.rb +28 -0
  99. data/spec/logic_controller_spec.rb +148 -0
  100. data/spec/loop_controller_spec.rb +19 -0
  101. data/spec/module_controller_spec.rb +56 -0
  102. data/spec/regular_expression_extractor_spec.rb +63 -0
  103. data/spec/response_assertion_spec.rb +69 -0
  104. data/spec/setup_thread_group_spec.rb +31 -0
  105. data/spec/thread_group_spec.rb +57 -0
  106. data/spec/throughput_controller_spec.rb +24 -0
  107. data/spec/transaction_controller_spec.rb +30 -0
  108. data/spec/user_defined_variables_spec.rb +22 -0
  109. data/spec/user_parameters_spec.rb +45 -0
  110. data/spec/with_helpers_spec.rb +57 -0
  111. data/spec/xpath_extractor_spec.rb +15 -0
  112. metadata +87 -59
  113. data/examples/basic_flood.rb +0 -12
  114. data/examples/basic_flood_real.rb +0 -7
  115. data/examples/basic_flood_with_csv.rb +0 -16
  116. data/examples/basic_google.rb +0 -8
  117. data/examples/basic_har.json +0 -4252
  118. data/examples/basic_har.rb +0 -34
  119. data/examples/basic_meta_fu.rb +0 -63
  120. data/examples/basic_response_assertion.rb +0 -13
  121. data/examples/basic_run.rb +0 -12
  122. data/examples/basic_testdata.rb +0 -60
  123. data/examples/demo.csv +0 -3
  124. data/examples/real_flood_test.rb +0 -14
  125. data/examples/real_flood_test_data.rb +0 -15
  126. data/examples/real_immi.gov.au_visa.rb +0 -78
  127. data/lib/ruby-jmeter/helpers/jmeter.properties +0 -28
  128. data/spec/dsl_spec.rb +0 -1157
  129. data/spec/stub.rb +0 -31
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'json extract' do
4
+ let(:doc) do
5
+ test do
6
+ extract json: '.test.path', name: 'my_json'
7
+ end.to_doc
8
+ end
9
+
10
+ let(:fragment) { doc.search("//com.atlantbh.jmeter.plugins.jsonutils.jsonpathextractor.JSONPathExtractor").first }
11
+
12
+ it 'should match on json path' do
13
+ expect(fragment.search(".//stringProp[@name='JSONPATH']").text).to eq '.test.path'
14
+ end
15
+
16
+ it 'should match on json var' do
17
+ expect(fragment.search(".//stringProp[@name='VAR']").text).to eq 'my_json'
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'assertions' do
4
+ describe 'json assertion' do
5
+ let(:doc) do
6
+ test do
7
+ visit '/' do
8
+ assert json: '.key', value: 'value'
9
+ end
10
+ end.to_doc
11
+ end
12
+
13
+ let(:fragment) { doc.search('//com.atlantbh.jmeter.plugins.jsonutils.jsonpathassertion.JSONPathAssertion').first }
14
+
15
+ it 'should match on expected value' do
16
+ expect(fragment.search(".//stringProp[@name='EXPECTED_VALUE']").text).to eq "value"
17
+ end
18
+
19
+ it 'should match on json path' do
20
+ expect(fragment.search(".//stringProp[@name='JSON_PATH']").text).to eq ".key"
21
+ end
22
+
23
+ it 'should have json validation by default' do
24
+ expect(fragment.search(".//boolProp[@name='JSONVALIDATION']").text).to eq "true"
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,148 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'disabled elements' do
4
+ let(:doc) do
5
+ test do
6
+ header name: 'Accept', value: '*', enabled: false
7
+ end.to_doc
8
+ end
9
+
10
+ let(:fragment) { doc.search('//HeaderManager') }
11
+
12
+ it 'should be disabled' do
13
+ expect(fragment.first.attributes['enabled'].value).to eq 'false'
14
+ end
15
+ end
16
+
17
+ describe 'If' do
18
+ let(:doc) do
19
+ test do
20
+ threads do
21
+ If condition: '2>1' do
22
+ visit url: "/"
23
+ end
24
+ end
25
+ end.to_doc
26
+ end
27
+
28
+ let(:fragment) { doc.search("//IfController").first }
29
+
30
+ it 'should match on If' do
31
+ expect(fragment.search(".//stringProp[@name='IfController.condition']").text).to eq '2>1'
32
+ end
33
+ end
34
+
35
+ describe 'exists' do
36
+ let(:doc) do
37
+ test do
38
+ threads do
39
+ exists 'apple' do
40
+ visit url: "/"
41
+ end
42
+ end
43
+ end.to_doc
44
+ end
45
+
46
+ let(:fragment) { doc.search("//IfController").first }
47
+
48
+ it 'should match on exists' do
49
+ expect(fragment.search(".//stringProp[@name='IfController.condition']").text).to eq '"${apple}" != "\${apple}"'
50
+ end
51
+ end
52
+
53
+ describe 'While' do
54
+ let(:doc) do
55
+ test do
56
+ threads do
57
+ While condition: 'true' do
58
+ visit url: "/"
59
+ end
60
+ end
61
+ end.to_doc
62
+ end
63
+
64
+ let(:fragment) { doc.search('//WhileController').first }
65
+
66
+ it 'should match on While' do
67
+ expect(fragment.search(".//stringProp[@name='WhileController.condition']").text).to eq 'true'
68
+ end
69
+ end
70
+
71
+ describe 'Counter' do
72
+ let(:doc) do
73
+ test do
74
+ threads do
75
+ visit url: "/" do
76
+ counter start: 1, per_user: true
77
+ end
78
+ end
79
+ end.to_doc
80
+ end
81
+
82
+ let(:fragment) { doc.search('//CounterConfig').first }
83
+
84
+ it 'should match on 5 Loops' do
85
+ expect(fragment.search(".//boolProp[@name='CounterConfig.per_user']").text).to eq 'true'
86
+ end
87
+ end
88
+
89
+ describe 'Switch' do
90
+ let(:doc) do
91
+ test do
92
+ threads do
93
+ Switch value: 'cat' do
94
+ visit url: "/"
95
+ end
96
+ end
97
+ end.to_doc
98
+ end
99
+
100
+ let(:fragment) { doc.search('//SwitchController').first }
101
+
102
+ it 'should match on Switch' do
103
+ expect(fragment.search(".//stringProp[@name='SwitchController.value']").text).to eq 'cat'
104
+ end
105
+ end
106
+
107
+ describe 'Nested controllers' do
108
+ let(:doc) do
109
+ test do
110
+ Simple name: 'node1.1' do
111
+ Simple name: 'node2.1'
112
+ Simple name: 'node2.2' do
113
+ Simple name: 'node3.1'
114
+ end
115
+ Simple name: 'node2.3'
116
+ end
117
+ Simple name: 'node1.2'
118
+ end.to_doc
119
+ end
120
+
121
+ let(:node1_1) { doc.search("//GenericController[@testname='node1.1']").first }
122
+ let(:node1_2) { doc.search("//GenericController[@testname='node1.2']").first }
123
+
124
+ let(:node2_1) { doc.search("//GenericController[@testname='node2.1']").first }
125
+ let(:node2_2) { doc.search("//GenericController[@testname='node2.2']").first }
126
+ let(:node2_3) { doc.search("//GenericController[@testname='node2.3']").first }
127
+
128
+ let(:node3_1) { doc.search("//GenericController[@testname='node3.1']").first }
129
+
130
+ it 'nodes should have hashTree as its parent' do
131
+ [node1_1, node1_2, node2_1, node2_2, node2_3, node3_1].each do |node|
132
+ expect(node.parent.name).to eq 'hashTree'
133
+ end
134
+ end
135
+
136
+ describe 'node3_1' do
137
+ it 'parent parent should be node2_2' do
138
+ expect(node3_1.parent).to eq node2_2.next
139
+ end
140
+ end
141
+
142
+ describe 'node1_2' do
143
+ it 'previous non hashTree sibling is node1_1' do
144
+ expect(node1_2.previous.previous).to eq node1_1
145
+ end
146
+ end
147
+ end
148
+
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'loop' do
4
+ let(:doc) do
5
+ test do
6
+ threads do
7
+ loops count: 5 do
8
+ visit url: "/"
9
+ end
10
+ end
11
+ end.to_doc
12
+ end
13
+
14
+ let(:fragment) { doc.search('//LoopController').first }
15
+
16
+ it 'should match on Loops' do
17
+ expect(fragment.search(".//stringProp[@name='LoopController.loops']").text).to eq '5'
18
+ end
19
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'module controllers' do
4
+ let(:doc) do
5
+ test name: 'tests' do
6
+ threads 1, name: 'threads' do
7
+ Simple name: 'controller_to_call'
8
+ end
9
+ threads 1 do
10
+ module_controller name: 'modules', node_path: [
11
+ 'WorkBench',
12
+ 'tests',
13
+ 'threads',
14
+ 'controller_to_call'
15
+ ]
16
+ end
17
+ end.to_doc
18
+ end
19
+
20
+ let(:simple_controller) { doc.search("//GenericController").first }
21
+ let(:test_module) { doc.search("//ModuleController").first }
22
+ let(:nodes) { test_module.search(".//stringProp") }
23
+
24
+ it 'should have a node path' do
25
+ expect(nodes.length).to eq 4
26
+ expect(nodes[0].text).to eq 'WorkBench'
27
+ expect(nodes[1].text).to eq 'tests'
28
+ expect(nodes[2].text).to eq 'threads'
29
+ expect(nodes[3].text).to eq 'controller_to_call'
30
+ end
31
+ end
32
+
33
+ describe 'module controllers with test fragment' do
34
+ let(:doc) do
35
+ test do
36
+ test_fragment name: 'some_test_fragment', enabled: 'false' do
37
+ get name: 'Home Page', url: 'http://google.com'
38
+ end
39
+
40
+ threads count: 1 do
41
+ module_controller test_fragment: 'WorkBench/TestPlan/some_test_fragment'
42
+ end
43
+ end.to_doc
44
+ end
45
+
46
+ let(:simple_controller) { doc.search("//GenericController").first }
47
+ let(:test_module) { doc.search("//ModuleController").first }
48
+ let(:nodes) { test_module.search(".//stringProp") }
49
+
50
+ it 'should have a node path specified by test fragment' do
51
+ expect(nodes.length).to eq 3
52
+ expect(nodes[0].text).to eq 'WorkBench'
53
+ expect(nodes[1].text).to eq 'TestPlan'
54
+ expect(nodes[2].text).to eq 'some_test_fragment'
55
+ end
56
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'regular_expression_extractor' do
4
+ describe 'standard scope' do
5
+ let(:doc) do
6
+ test do
7
+ regex pattern: 'pattern', name: 'my_variable', match_number: 1, default: '424242'
8
+ end.to_doc
9
+ end
10
+
11
+ let(:fragment) { doc.search('//RegexExtractor').first }
12
+
13
+ it 'matches on refname' do
14
+ expect(fragment.search(".//stringProp[@name='RegexExtractor.refname']").text).to eq 'my_variable'
15
+ end
16
+
17
+ it 'matches on regex' do
18
+ expect(fragment.search(".//stringProp[@name='RegexExtractor.regex']").text).to eq 'pattern'
19
+ end
20
+
21
+ it 'matches on template' do
22
+ expect(fragment.search(".//stringProp[@name='RegexExtractor.template']").text).to eq '$1$'
23
+ end
24
+
25
+ it 'matches on match_number' do
26
+ expect(fragment.search(".//stringProp[@name='RegexExtractor.match_number']").text).to eq '1'
27
+ end
28
+
29
+ it 'matches on default' do
30
+ expect(fragment.search(".//stringProp[@name='RegexExtractor.default']").text).to eq '424242'
31
+ end
32
+
33
+ it 'matches on scope' do
34
+ expect(fragment.search(".//stringProp[@name='Sample.scope']").text).to eq 'all'
35
+ end
36
+ end
37
+
38
+ describe 'variable scope' do
39
+ let(:doc) do
40
+ test do
41
+ regex pattern: 'pattern', name: 'my_variable', variable: 'test_variable'
42
+ end.to_doc
43
+ end
44
+
45
+ let(:fragment) { doc.search('//RegexExtractor').first }
46
+
47
+ it 'matches on refname' do
48
+ expect(fragment.search(".//stringProp[@name='RegexExtractor.refname']").text).to eq 'my_variable'
49
+ end
50
+
51
+ it 'matches on regex' do
52
+ expect(fragment.search(".//stringProp[@name='RegexExtractor.regex']").text).to eq 'pattern'
53
+ end
54
+
55
+ it 'matches on template' do
56
+ expect(fragment.search(".//stringProp[@name='RegexExtractor.template']").text).to eq '$1$'
57
+ end
58
+
59
+ it 'matches on scope' do
60
+ expect(fragment.search(".//stringProp[@name='Sample.scope']").text).to eq 'variable'
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'response assertion' do
4
+ describe 'standard scope' do
5
+ let(:doc) do
6
+ test do
7
+ assert contains: 'We test, tune and secure your site'
8
+ end.to_doc
9
+ end
10
+
11
+ let(:fragment) { doc.search('//ResponseAssertion').first }
12
+
13
+ it 'matches on refname' do
14
+ expect(fragment.search(".//stringProp[@name='0']").text).to eq 'We test, tune and secure your site'
15
+ end
16
+
17
+ it 'matches on test_type' do
18
+ expect(fragment.search(".//intProp[@name='Assertion.test_type']").text).to eq '2'
19
+ end
20
+
21
+ it 'matches on scope' do
22
+ expect(fragment.search(".//stringProp[@name='Assertion.scope']").text).to eq 'all'
23
+ end
24
+ end
25
+
26
+ describe 'custom scope' do
27
+ let(:doc) do
28
+ test do
29
+ assert 'not-contains' => 'Something in frames', scope: 'children'
30
+ end.to_doc
31
+ end
32
+
33
+ let(:fragment) { doc.search('//ResponseAssertion').first }
34
+
35
+ it 'matches on refname' do
36
+ expect(fragment.search(".//stringProp[@name='0']").text).to eq 'Something in frames'
37
+ end
38
+
39
+ it 'matches on test_type' do
40
+ expect(fragment.search(".//intProp[@name='Assertion.test_type']").text).to eq '6'
41
+ end
42
+
43
+ it 'matches on scope' do
44
+ expect(fragment.search(".//stringProp[@name='Assertion.scope']").text).to eq 'children'
45
+ end
46
+ end
47
+
48
+ describe 'variable scope' do
49
+ let(:doc) do
50
+ test do
51
+ assert 'substring' => 'Something in frames', scope: 'children', variable: 'test'
52
+ end.to_doc
53
+ end
54
+
55
+ let(:fragment) { doc.search('//ResponseAssertion').first }
56
+
57
+ it 'matches on refname' do
58
+ expect(fragment.search(".//stringProp[@name='0']").text).to eq 'Something in frames'
59
+ end
60
+
61
+ it 'matches on test_type' do
62
+ expect(fragment.search(".//intProp[@name='Assertion.test_type']").text).to eq '16'
63
+ end
64
+
65
+ it 'matches on scope' do
66
+ expect(fragment.search(".//stringProp[@name='Assertion.scope']").text).to eq 'variable'
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'setup thread groups' do
4
+ let(:doc) do
5
+ test do
6
+ setup_thread_group count: 101, continue_forever: true, duration: 69
7
+ end.to_doc
8
+ end
9
+
10
+ let(:fragment) { doc.search("//SetupThreadGroup").first }
11
+
12
+ it 'should match on num_threads' do
13
+ expect(fragment.search(".//stringProp[@name='ThreadGroup.num_threads']").text).to eq '101'
14
+ end
15
+
16
+ it 'should match on scheduler' do
17
+ expect(fragment.search(".//boolProp[@name='ThreadGroup.scheduler']").text).to eq 'true'
18
+ end
19
+
20
+ it 'should match on continue_forever' do
21
+ expect(fragment.search(".//boolProp[@name='LoopController.continue_forever']").text).to eq 'true'
22
+ end
23
+
24
+ it 'should match on loops' do
25
+ expect(fragment.search(".//stringProp[@name='LoopController.loops']").text).to eq '-1'
26
+ end
27
+
28
+ it 'should match on duration' do
29
+ expect(fragment.search(".//stringProp[@name='ThreadGroup.duration']").text).to eq '69'
30
+ end
31
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'thread groups' do
4
+ let(:doc) do
5
+ test do
6
+ threads count: 101, continue_forever: true, duration: 69
7
+ end.to_doc
8
+ end
9
+
10
+ let(:fragment) { doc.search("//ThreadGroup").first }
11
+
12
+ it 'should match on num_threads' do
13
+ expect(fragment.search(".//stringProp[@name='ThreadGroup.num_threads']").text).to eq '101'
14
+ end
15
+
16
+ it 'should match on scheduler' do
17
+ expect(fragment.search(".//boolProp[@name='ThreadGroup.scheduler']").text).to eq 'true'
18
+ end
19
+
20
+ it 'should match on continue_forever' do
21
+ expect(fragment.search(".//boolProp[@name='LoopController.continue_forever']").text).to eq 'true'
22
+ end
23
+
24
+ it 'should match on loops' do
25
+ expect(fragment.search(".//intProp[@name='LoopController.loops']").text).to eq '-1'
26
+ end
27
+
28
+ it 'should match on duration' do
29
+ expect(fragment.search(".//stringProp[@name='ThreadGroup.duration']").text).to eq '69'
30
+ end
31
+ end
32
+
33
+ describe 'thread groups old syntax' do
34
+ let(:doc) do
35
+ test do
36
+ threads 101, continue_forever: true, duration: 69
37
+ end.to_doc
38
+ end
39
+
40
+ let(:fragment) { doc.search("//ThreadGroup").first }
41
+
42
+ it 'should match on num_threads' do
43
+ expect(fragment.search(".//stringProp[@name='ThreadGroup.num_threads']").text).to eq '101'
44
+ end
45
+
46
+ it 'should match on continue_forever' do
47
+ expect(fragment.search(".//boolProp[@name='LoopController.continue_forever']").text).to eq 'true'
48
+ end
49
+
50
+ it 'should match on loops' do
51
+ expect(fragment.search(".//intProp[@name='LoopController.loops']").text).to eq '-1'
52
+ end
53
+
54
+ it 'should match on duration' do
55
+ expect(fragment.search(".//stringProp[@name='ThreadGroup.duration']").text).to eq '69'
56
+ end
57
+ end