auto_test 0.1.9.8.7 → 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +5 -4
- data/lib/authentication.rb +32 -14
- data/lib/auto_test.rb +3 -4
- data/lib/auto_test/railtie.rb +1 -0
- data/lib/auto_test/version.rb +1 -1
- data/lib/dsl.rb +10 -1
- data/lib/error.rb +9 -1
- data/lib/page.rb +17 -2
- data/lib/spec/requests/auto_spec.rb +3 -0
- data/lib/spec/requests/error_reduction_spec.rb +376 -361
- data/lib/spec/requests/simulation_spec.rb +20 -1
- data/lib/tasks/auto_test.rb +3 -3
- data/lib/test.rb +92 -39
- data/lib/test_starter.rb +8 -0
- metadata +2 -2
@@ -5,14 +5,16 @@ require 'auto_test'
|
|
5
5
|
|
6
6
|
describe "Application" do
|
7
7
|
describe "auto_test" do
|
8
|
-
|
8
|
+
# load the fixtures
|
9
9
|
if AutoTest::Test.use_fixtures? then
|
10
10
|
fixtures(*AutoTest::Test.get_fixtures)
|
11
11
|
end
|
12
12
|
it "simulates the error" do
|
13
|
+
# load test data
|
13
14
|
load "#{Rails.root}/db/test_seeds.rb"
|
14
15
|
sessions_array = []
|
15
16
|
puts "Firefox is getting started..."
|
17
|
+
# get the path to simulate
|
16
18
|
begin
|
17
19
|
paths = File.new("#{Rails.root}/log/new_path.log", "r")
|
18
20
|
rescue
|
@@ -22,24 +24,30 @@ describe "Application" do
|
|
22
24
|
sessions = search_sessions
|
23
25
|
number_of_sessions = sessions.size
|
24
26
|
user = Array.new(AutoTest::Test.get_number_of_sessions.to_i)
|
27
|
+
# start right number of firefox browsers
|
25
28
|
for i in 0..number_of_sessions-1 do
|
26
29
|
browser = Watir::Browser.new :ff
|
27
30
|
sessions_array[sessions[i]] = browser
|
28
31
|
end
|
32
|
+
|
29
33
|
while line = paths.gets do
|
34
|
+
# parse the path
|
30
35
|
if !line.chop!.end_with? "ID" then
|
31
36
|
hash = Hash.new
|
32
37
|
a = line.gsub!(/[{}\"]/,'').split(/\=\>/)
|
33
38
|
session = sessions_array[a[0].split(":").first.to_i]
|
34
39
|
session_index = sessions_array.index(session)
|
35
40
|
session.windows.first.use
|
41
|
+
# login
|
36
42
|
if a[0].split(":").second == AutoTest::Authentication.get_login_path then
|
37
43
|
session.goto home + AutoTest::Authentication.get_login_path
|
38
44
|
hash["#{a[0]}"] = a[1]
|
39
45
|
login(session, user[session_index].class.find(user[session_index].id))
|
46
|
+
# logout
|
40
47
|
elsif a[1] == AutoTest::Authentication.get_logout_path then
|
41
48
|
hash["#{a[0]}"] = AutoTest::Authentication.get_logout_path
|
42
49
|
session.goto home + AutoTest::Authentication.get_logout_path
|
50
|
+
# fill in form
|
43
51
|
elsif a[1][0] == "[" then
|
44
52
|
texts = []
|
45
53
|
inputs = a[1][1,a[1].size-2].split(/,/)
|
@@ -58,23 +66,30 @@ describe "Application" do
|
|
58
66
|
session.text_field(:name => inputs[i].strip).set inputs[i+1].strip
|
59
67
|
end
|
60
68
|
i = i + 2
|
69
|
+
# wait 2 seconds, so the user can follow the simulation
|
70
|
+
sleep 2
|
61
71
|
end
|
62
72
|
hash["#{a[0]}"] = texts
|
73
|
+
# click submit button
|
63
74
|
session.button(:type => "submit").click
|
64
75
|
else
|
76
|
+
# find and click link
|
65
77
|
link = a[1].split(/\+\+\+/)
|
66
78
|
href = link[0]
|
67
79
|
text = link[1]
|
68
80
|
session.a(:href => href, :text => text).flash
|
69
81
|
session.a(:href => href, :text => text).click
|
70
82
|
begin
|
83
|
+
# if a javascript alert pops up, accept it
|
71
84
|
session.driver.switch_to.alert.accept
|
72
85
|
rescue
|
73
86
|
end
|
74
87
|
hash["#{a[0]}"] = a[1]
|
75
88
|
end
|
89
|
+
# wait 2 seconds, so the user can follow the simulation
|
76
90
|
sleep 2
|
77
91
|
else
|
92
|
+
# get the right user
|
78
93
|
line_parts = line.split(":")
|
79
94
|
session_index = line_parts[0].to_i
|
80
95
|
id = line_parts[1].to_i
|
@@ -90,13 +105,16 @@ describe "Application" do
|
|
90
105
|
end
|
91
106
|
end
|
92
107
|
|
108
|
+
# login a user in a certain browser
|
93
109
|
def login(browser, user)
|
94
110
|
if AutoTest::Authentication.use_db_users then
|
111
|
+
# if data read from db, fill in forms
|
95
112
|
AutoTest::Authentication.get_login_attributes.each do |field|
|
96
113
|
browser.text_field(:id => field[1]).set user.send(field[0].to_sym)
|
97
114
|
end
|
98
115
|
sleep 1
|
99
116
|
else
|
117
|
+
# if data given by tester, fill these in
|
100
118
|
index = AutoTest::Authentication.get_login_names.index(AutoTest::Authentication.get_unique_login_attribute_name)
|
101
119
|
user_data = nil
|
102
120
|
user.class.find(:all).each do |u|
|
@@ -114,6 +132,7 @@ def login(browser, user)
|
|
114
132
|
browser.button(:type => 'submit').click
|
115
133
|
end
|
116
134
|
|
135
|
+
# get the session ids from the path
|
117
136
|
def search_sessions
|
118
137
|
begin
|
119
138
|
path_to_search = File.new("#{Rails.root}/log/new_path.log", "r")
|
data/lib/tasks/auto_test.rb
CHANGED
@@ -4,7 +4,7 @@ path = %x(gem which auto_test)
|
|
4
4
|
path = path[0..path.size-15]
|
5
5
|
|
6
6
|
namespace :auto_test do
|
7
|
-
desc "
|
7
|
+
desc "Starting the test"
|
8
8
|
task :test do
|
9
9
|
puts "Running auto_test..."
|
10
10
|
sh "rspec '#{path}/spec/requests/auto_spec.rb' -o '#{path}/../log/rspec.txt'"
|
@@ -15,7 +15,7 @@ namespace :auto_test do
|
|
15
15
|
Rake::Task["auto_test:error_calc"].invoke
|
16
16
|
end
|
17
17
|
|
18
|
-
desc "
|
18
|
+
desc "Calculating the errors"
|
19
19
|
task :error_calc do
|
20
20
|
err = File.read("#{Rails.root}/log/errors.log")
|
21
21
|
if err.to_i > 0 then
|
@@ -51,7 +51,7 @@ namespace :auto_test do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
|
54
|
-
desc '
|
54
|
+
desc 'Stopping rails server'
|
55
55
|
task :stop do
|
56
56
|
begin
|
57
57
|
pid_file = 'tmp/pids/server.pid'
|
data/lib/test.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module AutoTest
|
2
2
|
module Test
|
3
3
|
module_function
|
4
|
+
|
4
5
|
# initialize all variables
|
5
6
|
def initialize_test
|
6
7
|
Error.init_error
|
@@ -20,6 +21,9 @@ module AutoTest
|
|
20
21
|
init_number_of_test_runs
|
21
22
|
end
|
22
23
|
|
24
|
+
###############################################################
|
25
|
+
### initializers
|
26
|
+
|
23
27
|
def init_links
|
24
28
|
@@links = []
|
25
29
|
end
|
@@ -27,22 +31,6 @@ module AutoTest
|
|
27
31
|
def init_fixtures
|
28
32
|
@@use_fixtures = false
|
29
33
|
end
|
30
|
-
|
31
|
-
def use_fixtures?
|
32
|
-
@@use_fixtures
|
33
|
-
end
|
34
|
-
|
35
|
-
def fixtures(*fixtures)
|
36
|
-
@@fixtures = fixtures
|
37
|
-
end
|
38
|
-
|
39
|
-
def get_fixtures
|
40
|
-
@@fixtures
|
41
|
-
end
|
42
|
-
|
43
|
-
def use_fixtures(bool)
|
44
|
-
@@use_fixtures = bool
|
45
|
-
end
|
46
34
|
|
47
35
|
def init_number_of_test_runs
|
48
36
|
@@runs = 1
|
@@ -85,9 +73,49 @@ module AutoTest
|
|
85
73
|
def init_inputs
|
86
74
|
@@inputs = Hash.new
|
87
75
|
end
|
88
|
-
|
89
76
|
|
77
|
+
def init_sessions
|
78
|
+
@sessions = Hash.new
|
79
|
+
end
|
80
|
+
|
81
|
+
def init_hash_sessions(key, value)
|
82
|
+
@sessions["#{key}"] = value
|
83
|
+
end
|
84
|
+
|
85
|
+
def init_sessions_array
|
86
|
+
@sessions_array = []
|
87
|
+
end
|
88
|
+
|
89
|
+
def init_ready
|
90
|
+
@ready = Array.new(Test.get_number_of_sessions)
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
###############################################################
|
95
|
+
|
96
|
+
# getter for use fixtures
|
97
|
+
def use_fixtures?
|
98
|
+
@@use_fixtures
|
99
|
+
end
|
100
|
+
|
101
|
+
# set the fixtures to be used
|
102
|
+
def fixtures(*fixtures)
|
103
|
+
@@fixtures = fixtures
|
104
|
+
end
|
105
|
+
|
106
|
+
# get the fixtures
|
107
|
+
def get_fixtures
|
108
|
+
@@fixtures
|
109
|
+
end
|
110
|
+
|
111
|
+
# determine if fixtures should be used
|
112
|
+
def use_fixtures(bool)
|
113
|
+
@@use_fixtures = bool
|
114
|
+
end
|
115
|
+
|
116
|
+
# check the invariants
|
90
117
|
def check_invariants
|
118
|
+
# check always present invariant
|
91
119
|
get_always_present.each do |present|
|
92
120
|
if present[0].find(:first, :conditions => "#{present[1]} = '#{present[2]}'") == nil then
|
93
121
|
if stop_at_first_error? then stop! end
|
@@ -99,6 +127,7 @@ module AutoTest
|
|
99
127
|
Error.inc_error(message)
|
100
128
|
end
|
101
129
|
end
|
130
|
+
# check object dependency invariant
|
102
131
|
get_object_dependencies.each do |dependency|
|
103
132
|
children = dependency[0].find(:all)
|
104
133
|
children.each do |child|
|
@@ -117,26 +146,32 @@ module AutoTest
|
|
117
146
|
end
|
118
147
|
end
|
119
148
|
|
149
|
+
# user function to set number of test runs
|
120
150
|
def set_number_of_test_runs(number)
|
121
151
|
@@runs = number
|
122
152
|
end
|
123
153
|
|
154
|
+
# get number of test runs
|
124
155
|
def get_number_of_test_runs
|
125
156
|
@@runs
|
126
157
|
end
|
127
|
-
|
158
|
+
|
159
|
+
# user function ti stop at first error
|
128
160
|
def stop_at_first_error(stop_at_first_error)
|
129
161
|
@@stop_at_first_error = stop_at_first_error
|
130
162
|
end
|
131
163
|
|
164
|
+
# get stop at first error
|
132
165
|
def stop_at_first_error?
|
133
166
|
@@stop_at_first_error
|
134
167
|
end
|
135
168
|
|
169
|
+
# has the test to be stopped?
|
136
170
|
def stop?
|
137
171
|
@@stop
|
138
172
|
end
|
139
173
|
|
174
|
+
# stop the test
|
140
175
|
def stop!
|
141
176
|
@@stop = true
|
142
177
|
end
|
@@ -146,24 +181,27 @@ module AutoTest
|
|
146
181
|
@@depth = @@depth + 1
|
147
182
|
end
|
148
183
|
|
184
|
+
# get depth
|
149
185
|
def get_depth
|
150
186
|
@@depth
|
151
187
|
end
|
152
|
-
|
188
|
+
|
189
|
+
# user function to set the maximum depth
|
153
190
|
def set_max_depth(value)
|
154
191
|
@@max_depth = value
|
155
192
|
end
|
156
193
|
|
194
|
+
# get max depth
|
157
195
|
def get_max_depth
|
158
196
|
@@max_depth
|
159
197
|
end
|
160
198
|
|
161
|
-
|
162
199
|
# get object dependencies
|
163
200
|
def get_object_dependencies
|
164
201
|
@@dependencies
|
165
202
|
end
|
166
203
|
|
204
|
+
# user function to set invariant for object dependency
|
167
205
|
# for all objects of class child, there has to be one object of class parent
|
168
206
|
# attribute_name is the column that joins the two tables
|
169
207
|
def set_object_dependency(child, parent, attribute_name)
|
@@ -176,95 +214,113 @@ module AutoTest
|
|
176
214
|
@@inputs.store(input, values)
|
177
215
|
end
|
178
216
|
|
217
|
+
# get inputs
|
179
218
|
def get_inputs
|
180
219
|
@@inputs
|
181
220
|
end
|
182
221
|
|
222
|
+
# user function to set the number of sessions used to test the app
|
183
223
|
def set_number_of_sessions(number)
|
184
224
|
@@number_of_sessions = number
|
185
225
|
end
|
186
226
|
|
227
|
+
# get number of sessions
|
187
228
|
def get_number_of_sessions
|
188
229
|
@@number_of_sessions
|
189
230
|
end
|
190
|
-
|
231
|
+
|
232
|
+
# user function to set the invariant 'always present'
|
191
233
|
# add an array of the classname, key and value of the object to be checked every cycle
|
192
234
|
def always_present(class_name, key, value)
|
193
235
|
@@always_present << [class_name, key, value]
|
194
236
|
end
|
195
237
|
|
238
|
+
# get invariant always present
|
196
239
|
def get_always_present
|
197
240
|
@@always_present
|
198
241
|
end
|
199
242
|
|
243
|
+
# get the links to exclude from the test
|
200
244
|
def get_links_to_exclude
|
201
245
|
@@links
|
202
246
|
end
|
203
247
|
|
204
|
-
# list of links that will not be clicked during the test
|
248
|
+
# user function to set the list of links that will not be clicked during the test
|
205
249
|
def links_to_exclude(*links)
|
206
250
|
@@links = links
|
207
251
|
end
|
208
252
|
|
253
|
+
# setter for paths
|
209
254
|
def paths=(value)
|
210
255
|
@paths = value
|
211
256
|
end
|
212
257
|
|
258
|
+
# getter for paths
|
213
259
|
def paths
|
214
260
|
@paths
|
215
261
|
end
|
216
262
|
|
263
|
+
# getter for iterations
|
217
264
|
def iterations
|
218
265
|
@iterations
|
219
266
|
end
|
220
267
|
|
268
|
+
# setter for iterations
|
221
269
|
def iterations=(value)
|
222
270
|
@iterations = value
|
223
271
|
end
|
224
272
|
|
273
|
+
# getter for link counter
|
225
274
|
def link_counter
|
226
275
|
@link_counter
|
227
276
|
end
|
277
|
+
|
278
|
+
# setter for link counter
|
228
279
|
def link_counter=(value)
|
229
280
|
@link_counter = value
|
230
281
|
end
|
231
282
|
|
283
|
+
# setter for run
|
232
284
|
def run=(value)
|
233
285
|
@run = value
|
234
286
|
end
|
235
287
|
|
288
|
+
# getter for run
|
236
289
|
def run
|
237
290
|
@run
|
238
291
|
end
|
239
292
|
|
293
|
+
# getter for action path
|
240
294
|
def action_path
|
241
295
|
@@action_paths
|
242
296
|
end
|
243
297
|
|
298
|
+
# getter for no authentication
|
244
299
|
def no_auth
|
245
300
|
@@no_auth
|
246
301
|
end
|
247
302
|
|
303
|
+
# user function to determine that the application has no authentification
|
248
304
|
def set_no_auth
|
249
305
|
@@no_auth = true
|
250
306
|
end
|
251
|
-
|
307
|
+
|
308
|
+
# method to add an element to the action path
|
252
309
|
def add_to_action_path(hash)
|
253
310
|
@@action_paths << hash
|
254
311
|
end
|
255
312
|
|
313
|
+
# getter for number of users logged in during the test
|
256
314
|
def users_logged_in
|
257
315
|
@users_logged_in
|
258
316
|
end
|
259
317
|
|
260
|
-
|
261
|
-
@ready = Array.new(Test.get_number_of_sessions)
|
262
|
-
end
|
263
|
-
|
318
|
+
# set one session to be finished in this round of the test
|
264
319
|
def ready(i)
|
265
320
|
@ready[i-1] = true
|
266
321
|
end
|
267
322
|
|
323
|
+
# see if all sessions are ready
|
268
324
|
def ready?
|
269
325
|
count = 0
|
270
326
|
for i in 0..@ready.size-1 do
|
@@ -279,42 +335,39 @@ module AutoTest
|
|
279
335
|
end
|
280
336
|
end
|
281
337
|
|
282
|
-
|
283
|
-
@sessions = Hash.new
|
284
|
-
end
|
285
|
-
|
286
|
-
def init_hash_sessions(key, value)
|
287
|
-
@sessions["#{key}"] = value
|
288
|
-
end
|
289
|
-
|
338
|
+
# set variables for a session
|
290
339
|
def sessions(index, key, value)
|
291
340
|
@sessions["#{index}"]["#{key}"] = value
|
292
341
|
end
|
293
342
|
|
343
|
+
# get variables for a session
|
294
344
|
def get_sessions(i, key)
|
295
345
|
@sessions["#{i}"]["#{key}"]
|
296
346
|
end
|
297
347
|
|
348
|
+
# getter for sessions array
|
298
349
|
def get_sessions_array
|
299
350
|
@sessions_array
|
300
351
|
end
|
301
352
|
|
302
|
-
|
303
|
-
|
304
|
-
end
|
305
|
-
|
353
|
+
|
354
|
+
# method to add a session
|
306
355
|
def add_to_sessions_array(session)
|
307
356
|
@sessions_array << session
|
308
357
|
end
|
309
358
|
|
359
|
+
# setter for users logged in
|
310
360
|
def users_logged_in=(value)
|
311
361
|
@users_logged_in = value
|
312
362
|
end
|
313
363
|
|
364
|
+
# user function to set the maximum number of links a session may click before the
|
365
|
+
# next session continues
|
314
366
|
def set_max_number_of_session_links(no)
|
315
367
|
@@no_session_links = no
|
316
368
|
end
|
317
369
|
|
370
|
+
# getter fo maximum number of session links
|
318
371
|
def get_max_number_of_session_links
|
319
372
|
@@no_session_links
|
320
373
|
end
|