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 +1 -1
- data/README.md +19 -16
- data/examples/basic_meta_fu.rb +63 -0
- data/examples/basic_preprocessor_user_parameters.rb +21 -0
- data/lib/ruby-jmeter/dsl.rb +32 -4
- data/lib/ruby-jmeter/dsl/constant_throughput_timer.rb +1 -1
- data/lib/ruby-jmeter/dsl/csv_data_set_config.rb +1 -1
- data/lib/ruby-jmeter/dsl/http_request.rb +1 -1
- data/lib/ruby-jmeter/dsl/http_request_defaults.rb +4 -10
- data/lib/ruby-jmeter/dsl/if_controller.rb +1 -1
- data/lib/ruby-jmeter/dsl/jdbc_postprocessor.rb +1 -0
- data/lib/ruby-jmeter/dsl/jdbc_preprocessor.rb +1 -0
- data/lib/ruby-jmeter/dsl/jdbc_request.rb +1 -0
- data/lib/ruby-jmeter/dsl/jms_pointtopoint.rb +8 -2
- data/lib/ruby-jmeter/dsl/jms_publisher.rb +8 -2
- data/lib/ruby-jmeter/dsl/keystore_configuration.rb +1 -0
- data/lib/ruby-jmeter/dsl/ldap_request_defaults.rb +4 -5
- data/lib/ruby-jmeter/dsl/loop_controller.rb +1 -1
- data/lib/ruby-jmeter/dsl/response_assertion.rb +2 -2
- data/lib/ruby-jmeter/dsl/thread_group.rb +1 -1
- data/lib/ruby-jmeter/dsl/user_defined_variables.rb +5 -4
- data/lib/ruby-jmeter/dsl/user_parameters.rb +1 -2
- data/lib/ruby-jmeter/helpers/helper.rb +8 -2
- data/lib/ruby-jmeter/idl.xml +46 -36
- data/lib/ruby-jmeter/version.rb +1 -1
- data/spec/dsl_spec.rb +72 -10
- metadata +4 -2
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.9.3-
|
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
|
data/lib/ruby-jmeter/dsl.rb
CHANGED
@@ -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]}
|
159
|
+
"http://#{params[:host]}/data/#{params[:command]}/#{params[:key]}?type=text"
|
160
160
|
end
|
161
161
|
|
162
|
-
params[:url] = 'http://54.252.206.143
|
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[
|
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.
|
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
|
-
<
|
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">
|
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">
|
19
|
+
<boolProp name="IfController.useExpression">true</boolProp>
|
20
20
|
</IfController>)
|
21
21
|
EOS
|
22
22
|
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="
|
31
|
-
<collectionProp name="
|
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="
|
32
|
-
<collectionProp name="
|
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,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">
|
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="
|
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
|
-
<
|
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="
|
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">
|
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"
|
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="
|
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
|
-
|
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
|
data/lib/ruby-jmeter/idl.xml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<jmeterTestPlan version="1.2" properties="2.
|
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">
|
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">
|
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
|
-
|
203
|
-
<stringProp name="Argument.name"
|
204
|
-
<stringProp name="Argument.value"
|
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="
|
241
|
-
<stringProp name="Argument.name"
|
242
|
-
<stringProp name="Argument.value"
|
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"
|
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"
|
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">
|
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
|
-
<
|
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
|
-
<
|
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="
|
607
|
-
<collectionProp name="
|
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="
|
627
|
-
<collectionProp name="
|
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
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
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">
|
data/lib/ruby-jmeter/version.rb
CHANGED
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(:
|
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
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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(".//
|
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='
|
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.
|
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:
|
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
|