ruby-jmeter 2.1.7 → 2.11.0

Sign up to get free protection for your applications and to get access to all the features.
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