ruby-jmeter 2.1.7 → 2.11.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.
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 1.9.3-p448
1
+ 1.9.3-p484
data/README.md CHANGED
@@ -1,8 +1,11 @@
1
1
  # RubyJmeter
2
2
 
3
+ [![Build Status](https://travis-ci.org/flood-io/ruby-jmeter.png)](https://travis-ci.org/flood-io/ruby-jmeter)
4
+ [![Code Climate](https://codeclimate.com/github/flood-io/ruby-jmeter.png)](https://codeclimate.com/github/flood-io/ruby-jmeter)
5
+
3
6
  Tired of using the JMeter GUI or looking at hairy XML files?
4
7
 
5
- This gem lets you write test plans for JMeter in your favourite text editor, and optionally run them on [flood.io](http://flood.io).
8
+ This gem lets you write test plans for JMeter in your favourite text editor, and optionally run them on [flood.io](http://flood.io).
6
9
 
7
10
  ## Installation
8
11
 
@@ -32,7 +35,7 @@ test do
32
35
  end.jmx
33
36
  ```
34
37
 
35
- So in this example, we just created a test plan, with 10 threads, each of which visited the search page at Google.
38
+ So in this example, we just created a test plan, with 10 threads, each of which visited the search page at Google.
36
39
 
37
40
  ### Generating a JMeter Test Plan (JMX)
38
41
  Note also how we called the `jmx` method of the test. Calling this method will write the contents of the JMeter test plan to file like this.
@@ -89,9 +92,9 @@ test do
89
92
  visit name: 'Google Search', url: 'http://google.com'
90
93
  end
91
94
  end.run(
92
- path: '/usr/share/jmeter/bin/',
93
- file: 'jmeter.jmx',
94
- log: 'jmeter.log',
95
+ path: '/usr/share/jmeter/bin/',
96
+ file: 'jmeter.jmx',
97
+ log: 'jmeter.log',
95
98
  jtl: 'results.jtl')
96
99
  ```
97
100
 
@@ -102,16 +105,16 @@ You can also execute JMeter test plans on flood.io using our API. To do so, you
102
105
  To execute the test on flood.io, call the `grid` method on the test and pass it the API token like this.
103
106
 
104
107
  ```ruby
105
- test do
108
+ test do
106
109
  threads count: 10 do
107
110
  visit name: 'Google Search', url: 'http://google.com'
108
- end
111
+ end
109
112
  end.grid('OxtZ-4v-v0koSz5Y0enEQQ')
110
113
  ```
111
114
 
112
115
  This will then provide you with a link to the live test results on flood.io like this.
113
116
 
114
- ```
117
+ ```
115
118
  Results at: http://prod.flood.io/shared?testguid=73608030311611e2962f123141011033&run_id=339&tags=jmeter&domain=altentee.com&cluster=54.251.48.129&status=running&view=
116
119
  ```
117
120
 
@@ -148,7 +151,7 @@ threads count: 100
148
151
  threads count: 100, continue_forever: true
149
152
  threads count: 100, loops: 10
150
153
  threads count: 100, rampup: 30, duration: 60
151
- threads count: 100, scheduler: true,
154
+ threads count: 100, scheduler: true,
152
155
  start_time: Time.now.to_i * 1000,
153
156
  end_time: (Time.now.to_i * 1000) + (3600 * 1000)
154
157
  ```
@@ -222,15 +225,15 @@ You can use the `visit` method to navigate to pages:
222
225
  ```ruby
223
226
  visit name: 'Google Search', url: 'http://google.com'
224
227
  visit name: 'Google Search', url: 'http://google.com'
225
- visit name: 'Google Search', url: 'http://google.com',
226
- method: 'POST',
228
+ visit name: 'Google Search', url: 'http://google.com',
229
+ method: 'POST',
227
230
  'DO_MULTIPART_POST': 'true'
228
231
  visit name: 'Google Search', url: 'http://google.com',
229
232
  use_keepalive: 'false'
230
- visit name: 'Google Search', url: 'http://google.com',
233
+ visit name: 'Google Search', url: 'http://google.com',
231
234
  connect_timeout: '1000',
232
235
  response_timeout: '60000'
233
- visit name: 'View Login', url: '/login',
236
+ visit name: 'View Login', url: '/login',
234
237
  protocol: "https",
235
238
  port: 443
236
239
  ```
@@ -287,10 +290,10 @@ visit name: "Altentee", url: "http://altentee.com" do
287
290
  extract regex: "content='(.+?)' name='csrf-token'", name: 'csrf-token'
288
291
  extract regex: 'value="(.+?)" name="JESSIONSID"', name: 'JSESSIONID'
289
292
  web_reg_save_param regex: 'value="(.+?)" name="VIEWSTATE"', name: 'VIEWSTATE'
290
- extract name: 'username', regex: 'value="(.+?)", name="username"',
293
+ extract name: 'username', regex: 'value="(.+?)", name="username"',
291
294
  default: 'Tim Koopmans',
292
295
  match_number: 1
293
- extract name: 'shopping_item', regex: 'id="(.+?)" name="book"',
296
+ extract name: 'shopping_item', regex: 'id="(.+?)" name="book"',
294
297
  match_number: 0 # random
295
298
  end
296
299
  ```
@@ -306,7 +309,7 @@ end
306
309
  ```
307
310
 
308
311
 
309
- This method takes 3 parameters: the matching rule, the test string, and an optional parameters hash. This is based on the [Response Assertion](http://jmeter.apache.org/usermanual/component_reference.html#Response_Assertion).
312
+ This method takes 3 parameters: the matching rule, the test string, and an optional parameters hash. This is based on the [Response Assertion](http://jmeter.apache.org/usermanual/component_reference.html#Response_Assertion).
310
313
 
311
314
  ```ruby
312
315
  visit "Altentee", "http://altentee.com" do
@@ -0,0 +1,63 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'ruby-jmeter'
3
+
4
+ class Test
5
+ def initialize options = {}
6
+ @users = options[:users]
7
+ @ramp = options[:ramp]
8
+ @duration = options[:duration]
9
+ @region = options[:region] || 'ap-southeast-2'
10
+ @name = options[:name]
11
+ end
12
+
13
+ def flood domain
14
+ @domain = domain
15
+ test_plan.grid ENV['FLOOD_IO_KEY'], region: @region, name: @name
16
+ end
17
+
18
+ def jmeter domain
19
+ @domain = domain
20
+ test_plan.run path: '/usr/share/jmeter/bin/', gui:true
21
+ end
22
+
23
+ def test_plan
24
+ test do
25
+ grab_dsl self
26
+ defaults domain: @domain,
27
+ protocol: 'http',
28
+ image_parser: true,
29
+ concurrentDwn: true,
30
+ concurrentPool: 4
31
+
32
+ cookies
33
+
34
+ plan
35
+ end
36
+ end
37
+
38
+ def plan
39
+ threads @users, {ramp_time: @ramp, duration: @duration, scheduler: true, continue_forever: true} do
40
+ random_timer 5000, 10000
41
+
42
+ transaction '01_GET_home_page' do
43
+ visit '/'
44
+ end
45
+ end
46
+ end
47
+
48
+ def grab_dsl dsl
49
+ @dsl = dsl
50
+ end
51
+
52
+ def method_missing method, *args, &block
53
+ @dsl.__send__ method, *args, &block
54
+ end
55
+ end
56
+
57
+ test = Test.new users:10, ramp: 30, duration: 30, name: 'Test Number 1'
58
+
59
+ # test locally with JMeter
60
+ test.jmeter 'google.com'
61
+
62
+ # test distributed with flood
63
+ # test.flood 'google.com'
@@ -0,0 +1,21 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'ruby-jmeter'
3
+
4
+ test do
5
+ # user parameters with multiple values
6
+ visit name: 'Home Page', url: 'http://google.com/' do
7
+ user_parameters names: ['name1', 'name2'],
8
+ thread_values: {
9
+ user_1: [
10
+ 'value1',
11
+ 'value2'
12
+ ],
13
+
14
+ user_2: [
15
+ 'value1',
16
+ 'value2'
17
+ ]
18
+ }
19
+ end
20
+ # end.run(path: '/usr/share/jmeter/bin/', gui: true)
21
+ end.out
@@ -156,10 +156,10 @@ module RubyJmeter
156
156
  params[:url] = params[:key] if URI.parse(URI::encode(params[:key])).scheme
157
157
 
158
158
  params[:url] = if params[:host]
159
- "http://#{params[:host]}:8080/#{params[:command]}/#{params[:key]}?type=text"
159
+ "http://#{params[:host]}/data/#{params[:command]}/#{params[:key]}?type=text"
160
160
  end
161
161
 
162
- params[:url] = 'http://54.252.206.143:8080/' if params[:stub]
162
+ params[:url] = 'http://54.252.206.143/data/' if params[:stub]
163
163
 
164
164
  get name: '__testdata', url: params[:url] do
165
165
  extract name: params[:name],
@@ -252,6 +252,34 @@ module RubyJmeter
252
252
  ##
253
253
  # Other Elements
254
254
 
255
+ def user_parameters(params, &block)
256
+ if params.is_a?(Hash)
257
+ params['Argument.name'] = params[:name]
258
+ end
259
+
260
+ params[:names] = Nokogiri::XML::Builder.new do |b|
261
+ b.builder do
262
+ params[:names].each do |name|
263
+ b.stringProp name, name: name
264
+ end
265
+ end
266
+ end
267
+
268
+ params[:thread_values] = Nokogiri::XML::Builder.new do |b|
269
+ b.builder do
270
+ params[:thread_values].map do |user, values|
271
+ b.collectionProp name: user do
272
+ values.each_with_index.map do |value, index|
273
+ b.stringProp value, name: index
274
+ end
275
+ end
276
+ end
277
+ end
278
+ end
279
+
280
+ super
281
+ end
282
+
255
283
  alias_method :bsh_pre, :beanshell_preprocessor
256
284
 
257
285
  alias_method :bsh_post, :beanshell_postprocessor
@@ -284,7 +312,7 @@ module RubyJmeter
284
312
 
285
313
  def response_assertion(params={}, &block)
286
314
  params[:test_type] = parse_test_type(params)
287
- params[:match] = params.values.first
315
+ params["0"] = params.values.first
288
316
  node = RubyJmeter::ResponseAssertion.new(params)
289
317
  node.doc.xpath("//stringProp[@name='Assertion.scope']").remove if
290
318
  params[:scope] == 'main' || params['scope'] == 'main'
@@ -405,7 +433,7 @@ module RubyJmeter
405
433
  response = RestClient.post "#{params[:endpoint] ? params[:endpoint] : 'https://api.flood.io'}/floods?auth_token=#{token}",
406
434
  {
407
435
  :flood => {
408
- :tool => 'jmeter-2.9',
436
+ :tool => 'jmeter-2.11',
409
437
  :url => params[:url],
410
438
  :name => params[:name],
411
439
  :notes => params[:notes],
@@ -14,7 +14,7 @@ module RubyJmeter
14
14
  testname = params.kind_of?(Array) ? 'ConstantThroughputTimer' : (params[:name] || 'ConstantThroughputTimer')
15
15
  @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
16
  <ConstantThroughputTimer guiclass="TestBeanGUI" testclass="ConstantThroughputTimer" testname="#{testname}" enabled="true">
17
- <stringProp name="calcMode">this thread only</stringProp>
17
+ <intProp name="calcMode">0</intProp>
18
18
  <doubleProp>
19
19
  <name>throughput</name>
20
20
  <value>0.0</value>
@@ -19,7 +19,7 @@ module RubyJmeter
19
19
  <stringProp name="filename"/>
20
20
  <boolProp name="quotedData">false</boolProp>
21
21
  <boolProp name="recycle">true</boolProp>
22
- <stringProp name="shareMode">All threads</stringProp>
22
+ <stringProp name="shareMode">shareMode.all</stringProp>
23
23
  <boolProp name="stopThread">false</boolProp>
24
24
  <stringProp name="variableNames"/>
25
25
  </CSVDataSet>)
@@ -29,9 +29,9 @@ module RubyJmeter
29
29
  <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
30
30
  <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
31
31
  <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
32
+ <stringProp name="HTTPSampler.implementation"/>
32
33
  <boolProp name="HTTPSampler.monitor">false</boolProp>
33
34
  <stringProp name="HTTPSampler.embedded_url_re"/>
34
- <stringProp name="HTTPSampler.implementation"/>
35
35
  </HTTPSamplerProxy>)
36
36
  EOS
37
37
  update params
@@ -24,17 +24,11 @@ module RubyJmeter
24
24
  <stringProp name="HTTPSampler.protocol"/>
25
25
  <stringProp name="HTTPSampler.contentEncoding"/>
26
26
  <stringProp name="HTTPSampler.path">/</stringProp>
27
- <stringProp name="HTTPSampler.method">GET</stringProp>
28
- <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
29
- <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
30
- <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
31
- <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
32
- <boolProp name="HTTPSampler.monitor">false</boolProp>
33
- <boolProp name="HTTPSampler.image_parser">false</boolProp>
34
- <stringProp name="HTTPSampler.embedded_url_re"/>
35
- <boolProp name="HTTPSampler.concurrentDwn">false</boolProp>
36
- <stringProp name="HTTPSampler.concurrentPool">4</stringProp>
37
27
  <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp>
28
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
29
+ <boolProp name="HTTPSampler.concurrentDwn">true</boolProp>
30
+ <stringProp name="HTTPSampler.concurrentPool">4</stringProp>
31
+ <stringProp name="HTTPSampler.embedded_url_re"> </stringProp>
38
32
  </ConfigTestElement>)
39
33
  EOS
40
34
  update params
@@ -16,7 +16,7 @@ module RubyJmeter
16
16
  <IfController guiclass="IfControllerPanel" testclass="IfController" testname="#{testname}" enabled="true">
17
17
  <stringProp name="IfController.condition"/>
18
18
  <boolProp name="IfController.evaluateAll">false</boolProp>
19
- <boolProp name="IfController.useExpression">false</boolProp>
19
+ <boolProp name="IfController.useExpression">true</boolProp>
20
20
  </IfController>)
21
21
  EOS
22
22
  update params
@@ -21,6 +21,7 @@ module RubyJmeter
21
21
  <stringProp name="queryType">Select Statement</stringProp>
22
22
  <stringProp name="resultVariable"/>
23
23
  <stringProp name="variableNames"/>
24
+ <stringProp name="queryTimeout"/>
24
25
  </JDBCPostProcessor>)
25
26
  EOS
26
27
  update params
@@ -21,6 +21,7 @@ module RubyJmeter
21
21
  <stringProp name="queryType">Select Statement</stringProp>
22
22
  <stringProp name="resultVariable"/>
23
23
  <stringProp name="variableNames"/>
24
+ <stringProp name="queryTimeout"/>
24
25
  </JDBCPreProcessor>)
25
26
  EOS
26
27
  update params
@@ -21,6 +21,7 @@ module RubyJmeter
21
21
  <stringProp name="queryType">Select Statement</stringProp>
22
22
  <stringProp name="resultVariable"/>
23
23
  <stringProp name="variableNames"/>
24
+ <stringProp name="queryTimeout"/>
24
25
  </JDBCSampler>)
25
26
  EOS
26
27
  update params
@@ -27,8 +27,14 @@ module RubyJmeter
27
27
  <elementProp name="JMSSampler.jndiProperties" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="#{testname}" enabled="true">
28
28
  <collectionProp name="Arguments.arguments"/>
29
29
  </elementProp>
30
- <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="#{testname}" enabled="true">
31
- <collectionProp name="Arguments.arguments"/>
30
+ <elementProp name="arguments" elementType="JMSProperties">
31
+ <collectionProp name="JMSProperties.properties">
32
+ <elementProp name="" elementType="JMSProperty">
33
+ <stringProp name="JMSProperty.name"> </stringProp>
34
+ <stringProp name="JMSProperty.value"/>
35
+ <stringProp name="JMSProperty.type">java.lang.String</stringProp>
36
+ </elementProp>
37
+ </collectionProp>
32
38
  </elementProp>
33
39
  </JMSSampler>)
34
40
  EOS
@@ -28,8 +28,14 @@ module RubyJmeter
28
28
  <stringProp name="jms.config_msg_type">jms_text_message</stringProp>
29
29
  <stringProp name="jms.iterations">1</stringProp>
30
30
  <boolProp name="jms.authenticate">false</boolProp>
31
- <elementProp name="jms.jmsProperties" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="#{testname}" enabled="true">
32
- <collectionProp name="Arguments.arguments"/>
31
+ <elementProp name="jms.jmsProperties" elementType="JMSProperties">
32
+ <collectionProp name="JMSProperties.properties">
33
+ <elementProp name="" elementType="JMSProperty">
34
+ <stringProp name="JMSProperty.name"> </stringProp>
35
+ <stringProp name="JMSProperty.value"/>
36
+ <stringProp name="JMSProperty.type">java.lang.String</stringProp>
37
+ </elementProp>
38
+ </collectionProp>
33
39
  </elementProp>
34
40
  </PublisherSampler>)
35
41
  EOS
@@ -17,6 +17,7 @@ module RubyJmeter
17
17
  <stringProp name="endIndex"/>
18
18
  <stringProp name="preload">True</stringProp>
19
19
  <stringProp name="startIndex"/>
20
+ <stringProp name="clientCertAliasVarName"/>
20
21
  </KeystoreConfig>)
21
22
  EOS
22
23
  update params
@@ -17,18 +17,17 @@ module RubyJmeter
17
17
  <stringProp name="servername"/>
18
18
  <stringProp name="port"/>
19
19
  <stringProp name="rootdn"/>
20
- <boolProp name="user_defined">false</boolProp>
20
+ <boolProp name="user_defined">true</boolProp>
21
21
  <stringProp name="test">add</stringProp>
22
22
  <stringProp name="base_entry_dn"/>
23
23
  <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="#{testname}" enabled="true">
24
24
  <collectionProp name="Arguments.arguments">
25
- <elementProp name="testguid" elementType="Argument">
26
- <stringProp name="Argument.name"/>
27
- <stringProp name="Argument.value"/>
25
+ <elementProp name=" " elementType="Argument">
26
+ <stringProp name="Argument.name"> </stringProp>
27
+ <stringProp name="Argument.value"> </stringProp>
28
28
  <stringProp name="Argument.metadata">=</stringProp>
29
29
  </elementProp>
30
30
  </collectionProp>
31
- <stringProp name="TestPlan.comments"/>
32
31
  </elementProp>
33
32
  </ConfigTestElement>)
34
33
  EOS
@@ -15,7 +15,7 @@ module RubyJmeter
15
15
  @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
16
  <LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="#{testname}" enabled="true">
17
17
  <boolProp name="LoopController.continue_forever">true</boolProp>
18
- <intProp name="LoopController.loops">1</intProp>
18
+ <stringProp name="LoopController.loops">1</stringProp>
19
19
  </LoopController>)
20
20
  EOS
21
21
  update params
@@ -15,11 +15,11 @@ module RubyJmeter
15
15
  @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
16
  <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="#{testname}" enabled="true">
17
17
  <collectionProp name="Asserion.test_strings">
18
- <stringProp name="match"/>
18
+ <stringProp name="0"/>
19
19
  </collectionProp>
20
20
  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
21
21
  <boolProp name="Assertion.assume_success">false</boolProp>
22
- <intProp name="Assertion.test_type">2</intProp>
22
+ <intProp name="Assertion.test_type">16</intProp>
23
23
  <stringProp name="Assertion.scope">all</stringProp>
24
24
  </ResponseAssertion>)
25
25
  EOS
@@ -17,7 +17,7 @@ module RubyJmeter
17
17
  <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
18
18
  <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="#{testname}" enabled="true">
19
19
  <boolProp name="LoopController.continue_forever">false</boolProp>
20
- <intProp name="LoopController.loops">1</intProp>
20
+ <intProp name="LoopController.loops">-1</intProp>
21
21
  </elementProp>
22
22
  <stringProp name="ThreadGroup.num_threads">1</stringProp>
23
23
  <stringProp name="ThreadGroup.ramp_time">1</stringProp>
@@ -15,13 +15,14 @@ module RubyJmeter
15
15
  @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
16
  <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="#{testname}" enabled="true">
17
17
  <collectionProp name="Arguments.arguments">
18
- <elementProp name="testguid" elementType="Argument">
19
- <stringProp name="Argument.name"/>
20
- <stringProp name="Argument.value"/>
18
+ <elementProp name=" " elementType="Argument">
19
+ <stringProp name="Argument.name"> </stringProp>
20
+ <stringProp name="Argument.value"> </stringProp>
21
21
  <stringProp name="Argument.metadata">=</stringProp>
22
+ <stringProp name="Argument.desc"> </stringProp>
22
23
  </elementProp>
23
24
  </collectionProp>
24
- <stringProp name="TestPlan.comments"/>
25
+ <stringProp name="TestPlan.comments"> </stringProp>
25
26
  </Arguments>)
26
27
  EOS
27
28
  update params
@@ -15,8 +15,7 @@ module RubyJmeter
15
15
  @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
16
  <UserParameters guiclass="UserParametersGui" testclass="UserParameters" testname="#{testname}" enabled="true">
17
17
  <collectionProp name="UserParameters.names"/>
18
- <collectionProp name="UserParameters.thread_values">
19
- <collectionProp name="1"/>
18
+ <collectionProp name="UserParameters.thread_values"/>
20
19
  </collectionProp>
21
20
  <boolProp name="UserParameters.per_iteration">false</boolProp>
22
21
  </UserParameters>)
@@ -22,7 +22,12 @@ module RubyJmeter
22
22
  else
23
23
  params.each do |name, value|
24
24
  node = @doc.children.xpath("//*[contains(@name,\"#{name.to_s}\")]")
25
- node.first.content = value unless node.empty?
25
+ if value.class == Nokogiri::XML::Builder
26
+ node.first << value.doc.at_xpath('//builder').children
27
+ else
28
+ node.first.content = value unless node.empty?
29
+ end
30
+
26
31
  end
27
32
  end
28
33
  end
@@ -37,10 +42,11 @@ module RubyJmeter
37
42
  elements = @doc.at_xpath("//collectionProp/elementProp")
38
43
  params.each_with_index do |param, index|
39
44
  param.each do |name, value|
45
+ next unless elements && elements.element_children
40
46
  element = elements.element_children.xpath("//*[contains(@name,\"#{name}\")]")
41
47
  element.last.content = value
42
48
  end
43
- if index != params.size - 1
49
+ if index != params.size - 1 && elements
44
50
  @doc.at_xpath("//collectionProp") << elements.dup
45
51
  end
46
52
  end
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <jmeterTestPlan version="1.2" properties="2.4" jmeter="2.9 r1437961">
2
+ <jmeterTestPlan version="1.2" properties="2.6" jmeter="2.11 r1554548">
3
3
  <hashTree>
4
4
  <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
5
5
  <stringProp name="TestPlan.comments"></stringProp>
@@ -27,7 +27,7 @@
27
27
  <stringProp name="filename"></stringProp>
28
28
  <boolProp name="quotedData">false</boolProp>
29
29
  <boolProp name="recycle">true</boolProp>
30
- <stringProp name="shareMode">All threads</stringProp>
30
+ <stringProp name="shareMode">shareMode.all</stringProp>
31
31
  <boolProp name="stopThread">false</boolProp>
32
32
  <stringProp name="variableNames"></stringProp>
33
33
  </CSVDataSet>
@@ -86,17 +86,11 @@
86
86
  <stringProp name="HTTPSampler.protocol"></stringProp>
87
87
  <stringProp name="HTTPSampler.contentEncoding"></stringProp>
88
88
  <stringProp name="HTTPSampler.path">/</stringProp>
89
- <stringProp name="HTTPSampler.method">GET</stringProp>
90
- <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
91
- <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
92
- <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
93
- <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
94
- <boolProp name="HTTPSampler.monitor">false</boolProp>
95
- <boolProp name="HTTPSampler.image_parser">false</boolProp>
96
- <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
97
- <boolProp name="HTTPSampler.concurrentDwn">false</boolProp>
98
- <stringProp name="HTTPSampler.concurrentPool">4</stringProp>
99
89
  <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp>
90
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
91
+ <boolProp name="HTTPSampler.concurrentDwn">true</boolProp>
92
+ <stringProp name="HTTPSampler.concurrentPool">4</stringProp>
93
+ <stringProp name="HTTPSampler.embedded_url_re"> </stringProp>
100
94
  </ConfigTestElement>
101
95
  <hashTree/>
102
96
  <JavaConfig guiclass="JavaConfigGui" testclass="JavaConfig" testname="Java Request Defaults" enabled="true">
@@ -167,6 +161,7 @@
167
161
  <stringProp name="endIndex"></stringProp>
168
162
  <stringProp name="preload">True</stringProp>
169
163
  <stringProp name="startIndex"></stringProp>
164
+ <stringProp name="clientCertAliasVarName"></stringProp>
170
165
  </KeystoreConfig>
171
166
  <hashTree/>
172
167
  <ConfigTestElement guiclass="LdapExtConfigGui" testclass="ConfigTestElement" testname="LDAP Extended Request Defaults" enabled="true">
@@ -194,18 +189,17 @@
194
189
  <stringProp name="servername"></stringProp>
195
190
  <stringProp name="port"></stringProp>
196
191
  <stringProp name="rootdn"></stringProp>
197
- <boolProp name="user_defined">false</boolProp>
192
+ <boolProp name="user_defined">true</boolProp>
198
193
  <stringProp name="test">add</stringProp>
199
194
  <stringProp name="base_entry_dn"></stringProp>
200
195
  <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
201
196
  <collectionProp name="Arguments.arguments">
202
- <elementProp name="testguid" elementType="Argument">
203
- <stringProp name="Argument.name"></stringProp>
204
- <stringProp name="Argument.value"></stringProp>
197
+ <elementProp name=" " elementType="Argument">
198
+ <stringProp name="Argument.name"> </stringProp>
199
+ <stringProp name="Argument.value"> </stringProp>
205
200
  <stringProp name="Argument.metadata">=</stringProp>
206
201
  </elementProp>
207
202
  </collectionProp>
208
- <stringProp name="TestPlan.comments"></stringProp>
209
203
  </elementProp>
210
204
  </ConfigTestElement>
211
205
  <hashTree/>
@@ -237,20 +231,21 @@
237
231
  <hashTree/>
238
232
  <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
239
233
  <collectionProp name="Arguments.arguments">
240
- <elementProp name="testguid" elementType="Argument">
241
- <stringProp name="Argument.name"></stringProp>
242
- <stringProp name="Argument.value"></stringProp>
234
+ <elementProp name=" " elementType="Argument">
235
+ <stringProp name="Argument.name"> </stringProp>
236
+ <stringProp name="Argument.value"> </stringProp>
243
237
  <stringProp name="Argument.metadata">=</stringProp>
238
+ <stringProp name="Argument.desc"> </stringProp>
244
239
  </elementProp>
245
240
  </collectionProp>
246
- <stringProp name="TestPlan.comments"></stringProp>
241
+ <stringProp name="TestPlan.comments"> </stringProp>
247
242
  </Arguments>
248
243
  <hashTree/>
249
244
  <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
250
245
  <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
251
246
  <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
252
247
  <boolProp name="LoopController.continue_forever">false</boolProp>
253
- <intProp name="LoopController.loops">1</intProp>
248
+ <intProp name="LoopController.loops">-1</intProp>
254
249
  </elementProp>
255
250
  <stringProp name="ThreadGroup.num_threads">1</stringProp>
256
251
  <stringProp name="ThreadGroup.ramp_time">1</stringProp>
@@ -271,7 +266,7 @@
271
266
  <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If Controller" enabled="true">
272
267
  <stringProp name="IfController.condition"></stringProp>
273
268
  <boolProp name="IfController.evaluateAll">false</boolProp>
274
- <boolProp name="IfController.useExpression">false</boolProp>
269
+ <boolProp name="IfController.useExpression">true</boolProp>
275
270
  </IfController>
276
271
  <hashTree/>
277
272
  <IncludeController guiclass="IncludeControllerGui" testclass="IncludeController" testname="Include Controller" enabled="true">
@@ -280,7 +275,7 @@
280
275
  <hashTree/>
281
276
  <LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
282
277
  <boolProp name="LoopController.continue_forever">true</boolProp>
283
- <intProp name="LoopController.loops">1</intProp>
278
+ <stringProp name="LoopController.loops">1</stringProp>
284
279
  </LoopController>
285
280
  <hashTree/>
286
281
  <ModuleController guiclass="ModuleControllerGui" testclass="ModuleController" testname="Module Controller" enabled="true"/>
@@ -340,7 +335,7 @@
340
335
  </BSFTimer>
341
336
  <hashTree/>
342
337
  <ConstantThroughputTimer guiclass="TestBeanGUI" testclass="ConstantThroughputTimer" testname="Constant Throughput Timer" enabled="true">
343
- <stringProp name="calcMode">this thread only</stringProp>
338
+ <intProp name="calcMode">0</intProp>
344
339
  <doubleProp>
345
340
  <name>throughput</name>
346
341
  <value>0.0</value>
@@ -422,6 +417,7 @@
422
417
  <stringProp name="queryType">Select Statement</stringProp>
423
418
  <stringProp name="resultVariable"></stringProp>
424
419
  <stringProp name="variableNames"></stringProp>
420
+ <stringProp name="queryTimeout"></stringProp>
425
421
  </JDBCPreProcessor>
426
422
  <hashTree/>
427
423
  <JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="JSR223 PreProcessor" enabled="true">
@@ -442,6 +438,7 @@
442
438
  <collectionProp name="UserParameters.names"/>
443
439
  <collectionProp name="UserParameters.thread_values">
444
440
  <collectionProp name="1"/>
441
+ <collectionProp name="1"/>
445
442
  </collectionProp>
446
443
  <boolProp name="UserParameters.per_iteration">false</boolProp>
447
444
  </UserParameters>
@@ -528,7 +525,6 @@
528
525
  <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
529
526
  <boolProp name="HTTPSampler.monitor">false</boolProp>
530
527
  <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
531
- <stringProp name="HTTPSampler.implementation"></stringProp>
532
528
  </HTTPSamplerProxy>
533
529
  <hashTree/>
534
530
  <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Java Request" enabled="true">
@@ -587,6 +583,7 @@
587
583
  <stringProp name="queryType">Select Statement</stringProp>
588
584
  <stringProp name="resultVariable"></stringProp>
589
585
  <stringProp name="variableNames"></stringProp>
586
+ <stringProp name="queryTimeout"></stringProp>
590
587
  </JDBCSampler>
591
588
  <hashTree/>
592
589
  <JMSSampler guiclass="JMSSamplerGui" testclass="JMSSampler" testname="JMS Point-to-Point" enabled="true">
@@ -603,8 +600,14 @@
603
600
  <elementProp name="JMSSampler.jndiProperties" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
604
601
  <collectionProp name="Arguments.arguments"/>
605
602
  </elementProp>
606
- <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
607
- <collectionProp name="Arguments.arguments"/>
603
+ <elementProp name="arguments" elementType="JMSProperties">
604
+ <collectionProp name="JMSProperties.properties">
605
+ <elementProp name="" elementType="JMSProperty">
606
+ <stringProp name="JMSProperty.name"> </stringProp>
607
+ <stringProp name="JMSProperty.value"></stringProp>
608
+ <stringProp name="JMSProperty.type">java.lang.String</stringProp>
609
+ </elementProp>
610
+ </collectionProp>
608
611
  </elementProp>
609
612
  </JMSSampler>
610
613
  <hashTree/>
@@ -623,8 +626,14 @@
623
626
  <stringProp name="jms.config_msg_type">jms_text_message</stringProp>
624
627
  <stringProp name="jms.iterations">1</stringProp>
625
628
  <boolProp name="jms.authenticate">false</boolProp>
626
- <elementProp name="jms.jmsProperties" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
627
- <collectionProp name="Arguments.arguments"/>
629
+ <elementProp name="jms.jmsProperties" elementType="JMSProperties">
630
+ <collectionProp name="JMSProperties.properties">
631
+ <elementProp name="" elementType="JMSProperty">
632
+ <stringProp name="JMSProperty.name"> </stringProp>
633
+ <stringProp name="JMSProperty.value"></stringProp>
634
+ <stringProp name="JMSProperty.type">java.lang.String</stringProp>
635
+ </elementProp>
636
+ </collectionProp>
628
637
  </elementProp>
629
638
  </PublisherSampler>
630
639
  <hashTree/>
@@ -828,6 +837,7 @@
828
837
  <stringProp name="queryType">Select Statement</stringProp>
829
838
  <stringProp name="resultVariable"></stringProp>
830
839
  <stringProp name="variableNames"></stringProp>
840
+ <stringProp name="queryTimeout"></stringProp>
831
841
  </JDBCPostProcessor>
832
842
  <hashTree/>
833
843
  <JSR223PostProcessor guiclass="TestBeanGUI" testclass="JSR223PostProcessor" testname="JSR223 PostProcessor" enabled="true">
@@ -920,12 +930,12 @@
920
930
  <hashTree/>
921
931
  <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
922
932
  <collectionProp name="Asserion.test_strings">
923
- <stringProp name="match"></stringProp>
924
- </collectionProp>
925
- <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
926
- <boolProp name="Assertion.assume_success">false</boolProp>
927
- <intProp name="Assertion.test_type">2</intProp>
928
- <stringProp name="Assertion.scope">all</stringProp>
933
+ <stringProp name="0"></stringProp>
934
+ </collectionProp>
935
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
936
+ <boolProp name="Assertion.assume_success">false</boolProp>
937
+ <intProp name="Assertion.test_type">16</intProp>
938
+ <stringProp name="Assertion.scope">all</stringProp>
929
939
  </ResponseAssertion>
930
940
  <hashTree/>
931
941
  <SMIMEAssertion guiclass="SMIMEAssertionGui" testclass="SMIMEAssertion" testname="SMIME Assertion" enabled="true">
@@ -1,3 +1,3 @@
1
1
  module RubyJmeter
2
- VERSION = "2.1.7"
2
+ VERSION = "2.11.0"
3
3
  end
data/spec/dsl_spec.rb CHANGED
@@ -65,7 +65,7 @@ describe "DSL" do
65
65
  end.to_doc
66
66
  end
67
67
 
68
- let(:fragment) { doc.search("//ConfigTestElement").first }
68
+ let(:config_fragment) { doc.search("//ConfigTestElement").first }
69
69
  let(:sampler_fragment) { doc.search("//HTTPSamplerProxy").first }
70
70
 
71
71
  it 'should match on implementation' do
@@ -73,13 +73,13 @@ describe "DSL" do
73
73
  end
74
74
 
75
75
  it 'should match on defaults' do
76
- fragment.search(".//stringProp[@name='HTTPSampler.domain']").text.should == 'example.com'
77
- fragment.search(".//stringProp[@name='HTTPSampler.protocol']").text.should == 'https'
78
- fragment.search(".//stringProp[@name='HTTPSampler.implementation']").text.should == 'HttpClient3.1'
79
- fragment.search(".//boolProp[@name='HTTPSampler.image_parser']").text.should == 'true'
80
- fragment.search(".//boolProp[@name='HTTPSampler.concurrentDwn']").text.should == 'true'
81
- fragment.search(".//stringProp[@name='HTTPSampler.concurrentPool']").text.should == '5'
82
- fragment.search(".//stringProp[@name='HTTPSampler.embedded_url_re']").text.should == 'http.+?example.com'
76
+ config_fragment.search(".//stringProp[@name='HTTPSampler.domain']").text.should == 'example.com'
77
+ config_fragment.search(".//stringProp[@name='HTTPSampler.protocol']").text.should == 'https'
78
+ config_fragment.search(".//stringProp[@name='HTTPSampler.implementation']").text.should == 'HttpClient3.1'
79
+ config_fragment.search(".//boolProp[@name='HTTPSampler.image_parser']").text.should == 'true'
80
+ config_fragment.search(".//boolProp[@name='HTTPSampler.concurrentDwn']").text.should == 'true'
81
+ config_fragment.search(".//stringProp[@name='HTTPSampler.concurrentPool']").text.should == '5'
82
+ config_fragment.search(".//stringProp[@name='HTTPSampler.embedded_url_re']").text.should == 'http.+?example.com'
83
83
  end
84
84
  end
85
85
 
@@ -295,6 +295,29 @@ describe "DSL" do
295
295
  end
296
296
 
297
297
 
298
+ describe 'get_with_parameterized_domain' do
299
+ let(:doc) do
300
+ test do
301
+ threads do
302
+ transaction name: "TC_01", parent: true, include_timers: true do
303
+ visit url: "/home?location=melbourne", domain: "${custom_domain}"
304
+ end
305
+ end
306
+ end.to_doc
307
+ end
308
+
309
+ let(:fragment) { doc.search("//HTTPSamplerProxy").first }
310
+
311
+ it 'should match on path' do
312
+ fragment.search(".//stringProp[@name='HTTPSampler.path']").text.should == '/home'
313
+ end
314
+
315
+ it 'should match on domain' do
316
+ fragment.search(".//stringProp[@name='HTTPSampler.domain']").text.should == '${custom_domain}'
317
+ end
318
+ end
319
+
320
+
298
321
  describe 'https' do
299
322
  let(:doc) do
300
323
  test do
@@ -314,6 +337,45 @@ describe "DSL" do
314
337
  end
315
338
 
316
339
 
340
+ describe 'user_parameters' do
341
+ let(:doc) do
342
+ test do
343
+ threads do
344
+ transaction name: "TC_02", parent: true, include_timers: true do
345
+ visit url: "/" do
346
+ user_parameters names: ['name1', 'name2'],
347
+ thread_values: {
348
+ user_1: [
349
+ 'value1',
350
+ 'value2'
351
+ ],
352
+
353
+ user_2: [
354
+ 'value1',
355
+ 'value2'
356
+ ]
357
+ }
358
+ end
359
+ end
360
+ end
361
+ end.to_doc
362
+ end
363
+
364
+ let(:names) { doc.search("//collectionProp[@name='UserParameters.names']").first }
365
+ let(:thread_values) { doc.search("//collectionProp[@name='UserParameters.thread_values']").first }
366
+
367
+ it 'should match on names' do
368
+ names.search(".//stringProp[@name='name1']").text.should == 'name1'
369
+ names.search(".//stringProp[@name='name2']").text.should == 'name2'
370
+ end
371
+
372
+ it 'should match on thread values' do
373
+ thread_values.search(".//stringProp[@name='0']").first.text.should == 'value1'
374
+ thread_values.search(".//stringProp[@name='1']").first.text.should == 'value2'
375
+ end
376
+ end
377
+
378
+
317
379
  describe 'xhr' do
318
380
  let(:doc) do
319
381
  test do
@@ -446,7 +508,7 @@ describe "DSL" do
446
508
  let(:fragment) { doc.search("//LoopController").first }
447
509
 
448
510
  it 'should match on Loops' do
449
- fragment.search(".//intProp[@name='LoopController.loops']").text.should == '5'
511
+ fragment.search(".//stringProp[@name='LoopController.loops']").text.should == '5'
450
512
  end
451
513
  end
452
514
 
@@ -547,7 +609,7 @@ describe "DSL" do
547
609
  let(:fragment) { doc.search("//ResponseAssertion").first }
548
610
 
549
611
  it 'should match on match' do
550
- fragment.search(".//stringProp[@name='match']").text.should == 'Welcome'
612
+ fragment.search(".//stringProp[@name='0']").text.should == 'Welcome'
551
613
  end
552
614
 
553
615
  it 'should match on scope' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-jmeter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.7
4
+ version: 2.11.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-09 00:00:00.000000000 Z
12
+ date: 2014-01-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -77,7 +77,9 @@ files:
77
77
  - examples/basic_header.rb
78
78
  - examples/basic_http_request_defaults.rb
79
79
  - examples/basic_ldap_ext.rb
80
+ - examples/basic_meta_fu.rb
80
81
  - examples/basic_post.rb
82
+ - examples/basic_preprocessor_user_parameters.rb
81
83
  - examples/basic_query_params.rb
82
84
  - examples/basic_run.rb
83
85
  - examples/basic_simple_data_writer.rb