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 CHANGED
@@ -1,6 +1,8 @@
1
1
  # AutoTest
2
2
 
3
- TODO: Write a gem description
3
+ This Gem tests your application automatically. With some configuration it will login and logout, click links, fill in forms
4
+ and find exceptions. After finding an exception it will reduce the path to this error and show you the reduced path in a
5
+ firefox browser.
4
6
 
5
7
  ## Installation
6
8
 
@@ -18,12 +20,11 @@ Or install it yourself as:
18
20
 
19
21
  ## Usage
20
22
 
21
- TODO: Write usage instructions here
22
23
 
23
24
  ## Contributing
24
25
 
25
- 1. Fork it
26
+ <!-- 1. Fork it
26
27
  2. Create your feature branch (`git checkout -b my-new-feature`)
27
28
  3. Commit your changes (`git commit -am 'Added some feature'`)
28
29
  4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create new Pull Request
30
+ 5. Create new Pull Request -->
@@ -1,25 +1,32 @@
1
1
  require 'capybara/rspec'
2
2
 
3
3
  module AutoTest
4
+ # This module deals with all functions concerning authentication of users in the application
4
5
  module Authentication
5
6
  module_function
6
7
 
7
- # initialize the @users array
8
+ # initialize the users array
8
9
  def init_users
9
10
  @users = []
10
11
  @db_users = [false, nil]
11
12
  end
12
-
13
-
13
+
14
+ # initialize login data array
15
+ def init_login_data
16
+ @data = []
17
+ end
18
+
19
+ # user function to set the logout path
14
20
  def set_logout_path(path)
15
21
  @logout = path
16
22
  end
17
23
 
24
+ # getter for logout path
18
25
  def get_logout_path
19
26
  @logout
20
27
  end
21
28
 
22
- # set the attribute_names and fields that are needed to login
29
+ # user function to set the attribute_names and fields that are needed to login
23
30
  # the argument are two arrays, the first are the database names of the attribute
24
31
  # the second are the belonging field names
25
32
  def set_login_attribute_names(names, fields)
@@ -36,34 +43,34 @@ module AutoTest
36
43
  @login
37
44
  end
38
45
 
39
- # set the login path
46
+ # user function to set the login path
40
47
  def set_login_path(path)
41
48
  @login = path
42
49
  end
43
-
50
+
51
+ # user function to set the text of the login button
44
52
  def set_login_button(text)
45
53
  @login_button = text
46
54
  end
47
55
 
56
+ # get the login button
48
57
  def get_login_button
49
58
  @login_button
50
59
  end
51
60
 
52
- def init_login_data
53
- @data = []
54
- end
55
-
61
+ # get login data array
56
62
  def get_login_data
57
63
  @data
58
64
  end
59
65
 
66
+ # user function to set the login data
60
67
  def set_login_data(*data)
61
68
  data.each do |d|
62
69
  @data << d
63
70
  end
64
-
65
71
  end
66
72
 
73
+ # user function to determine if users are read from db
67
74
  def get_users_from_db(user_class_name, bool)
68
75
  @users = user_class_name.find(:all)
69
76
  if bool then
@@ -73,35 +80,42 @@ module AutoTest
73
80
  end
74
81
  end
75
82
 
83
+ # user function to set login names
76
84
  def set_login_names(names)
77
85
  @names = names
78
86
  end
79
87
 
88
+ # get login names
80
89
  def get_login_names
81
90
  @names
82
91
  end
83
92
 
84
-
93
+ # user function to set login fields
85
94
  def set_login_fields(fields)
86
95
  @fields = fields
87
96
  end
88
97
 
98
+ #get login fields
89
99
  def get_login_fields
90
100
  @fields
91
101
  end
92
102
 
103
+ # user function to set unique attribute name
93
104
  def set_unique_login_attribute_name(name)
94
105
  @unique_login = name
95
106
  end
96
107
 
108
+ # get unique attribute name
97
109
  def get_unique_login_attribute_name
98
110
  @unique_login
99
111
  end
100
112
 
113
+ # get first element of db users, determine if users are read from db
101
114
  def use_db_users
102
115
  @db_users[0]
103
116
  end
104
117
 
118
+ # get second element of db users, the class of the user
105
119
  def user_class
106
120
  @db_users[1]
107
121
  end
@@ -124,20 +138,23 @@ module AutoTest
124
138
  return @users
125
139
  end
126
140
 
141
+ # set user data
127
142
  def set_user_data(value)
128
143
  @user_data = value
129
144
  end
130
145
 
146
+ # get user data
131
147
  def get_user_data
132
148
  @user_data
133
149
  end
134
150
 
135
-
151
+ # logout a user
136
152
  def logout(session)
137
153
  begin
138
154
  hash = Hash.new
139
155
  hash["#{Test.get_sessions_array.index(session)}:#{session.current_path}"] = get_logout_path
140
156
  Test.add_to_action_path hash
157
+ # logout the user by visiting the logout path
141
158
  session.visit get_logout_path
142
159
  Page.check_for_error_code(session)
143
160
  rescue => e
@@ -161,6 +178,7 @@ module AutoTest
161
178
  end
162
179
  end
163
180
  end
181
+ # fill in fields with user data, either from db or given by the tester
164
182
  if @db_users[0] then
165
183
  get_login_attributes.each do |field|
166
184
  session.fill_in field[1], :with => user.send(field[0].to_sym)
@@ -171,8 +189,8 @@ module AutoTest
171
189
  end
172
190
  end
173
191
  session.click_button get_login_button
174
-
175
192
  Page.check_for_error_code(session)
193
+ # save from exception if user object has changed
176
194
  rescue (ActiveRecord::RecordNotFound)
177
195
  Test.sessions(Test.get_sessions_array.index(session), "depth", Test.get_max_depth+1)
178
196
  Test.sessions(Test.get_sessions_array.index(session), "current_depth", Test.get_sessions(Test.get_sessions_array.index(session), "depth"))
@@ -9,7 +9,7 @@ def logger
9
9
  Rails.logger
10
10
  end
11
11
 
12
-
12
+ # Main module
13
13
  module AutoTest
14
14
  include Page
15
15
  include Error
@@ -28,8 +28,6 @@ module AutoTest
28
28
  yield(configuration)
29
29
  end
30
30
 
31
-
32
-
33
31
  class Configuration
34
32
  def initialize
35
33
  Test.initialize_test
@@ -39,11 +37,12 @@ module AutoTest
39
37
  DatabaseCleaner.clean
40
38
  end
41
39
 
40
+ # define all user functions
41
+
42
42
  def use_fixtures(bool)
43
43
  Test.use_fixtures(bool)
44
44
  end
45
45
 
46
-
47
46
  def fixtures(*fixtures)
48
47
  Test.fixtures(fixtures)
49
48
  end
@@ -1,6 +1,7 @@
1
1
  require 'auto_test'
2
2
  require 'rails'
3
3
  module AutoTest
4
+ # make the tasks to start auto_test available in the application
4
5
  class Railtie < Rails::Railtie
5
6
  rake_tasks do
6
7
  require 'tasks/auto_test.rb'
@@ -1,3 +1,3 @@
1
1
  module AutoTest
2
- VERSION = "0.1.9.8.7"
2
+ VERSION = "1.0"
3
3
  end
data/lib/dsl.rb CHANGED
@@ -20,6 +20,7 @@ module AutoTest
20
20
  Test.set_max_depth(value)
21
21
  end
22
22
 
23
+ # set the unique attribute name of the user
23
24
  def set_unique_login_attribute_name(name)
24
25
  Authentication.set_unique_login_attribute_name(name)
25
26
  end
@@ -37,6 +38,7 @@ module AutoTest
37
38
  Authentication.set_login_data(*data)
38
39
  end
39
40
 
41
+ # determine wether users can be read from db or not
40
42
  def get_users_from_db(user_class_name, bool)
41
43
  Authentication.get_users_from_db(user_class_name, bool)
42
44
  end
@@ -47,19 +49,23 @@ module AutoTest
47
49
  Test.set_object_dependency(child, parent, attribute_name)
48
50
  end
49
51
 
52
+ # set the number of sessions used to test the app
50
53
  def set_number_of_sessions(number)
51
54
  Test.set_number_of_sessions(number)
52
55
  end
53
56
 
57
+ # set the maxium number of links one session can click in a row before
58
+ # the next session continues
54
59
  def set_max_number_of_session_links(no)
55
60
  Test.set_max_number_of_session_links(no)
56
61
  end
57
62
 
58
-
63
+ # set, if there´s no authentication in the application
59
64
  def set_no_auth
60
65
  Test.set_no_auth
61
66
  end
62
67
 
68
+ # set the text of the login button
63
69
  def set_login_button(text)
64
70
  Authentication.set_login_button(text)
65
71
  end
@@ -77,14 +83,17 @@ module AutoTest
77
83
  Authentication.set_login_names(names)
78
84
  end
79
85
 
86
+ # set the path to logout
80
87
  def set_logout_path(path)
81
88
  Authentication.set_logout_path(path)
82
89
  end
83
90
 
91
+ # determine if the test is supposed to stop when the first error is found
84
92
  def stop_at_first_error(stop_at_first_error)
85
93
  Test.stop_at_first_error(stop_at_first_error)
86
94
  end
87
95
 
96
+ # set the number of test runs
88
97
  def set_number_of_test_runs(number)
89
98
  Test.set_number_of_test_runs(number)
90
99
  end
@@ -1,8 +1,11 @@
1
1
  require 'capybara/rspec'
2
2
 
3
3
  module AutoTest
4
+
5
+ # This module deals with all functions concerning errors
4
6
  module Error
5
7
  module_function
8
+
6
9
  # increment the errorcount in the first field of the array,
7
10
  # add error messages
8
11
  def inc_error(value)
@@ -15,6 +18,8 @@ module AutoTest
15
18
  end
16
19
  end
17
20
 
21
+ # print the error on the console
22
+ # just the message of the exception, no backtrace
18
23
  def print_errors
19
24
  if get_error > 0 then
20
25
  if get_error == 1 then
@@ -33,14 +38,17 @@ module AutoTest
33
38
  end
34
39
  end
35
40
 
41
+ # get the error count
36
42
  def get_error
37
43
  @error[0]
38
44
  end
39
-
45
+
46
+ # get error message
40
47
  def get_error_messages
41
48
  @error[1..@error.size-1]
42
49
  end
43
50
 
51
+ # init error count with 0
44
52
  def init_error
45
53
  @error = [0]
46
54
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  require 'capybara/rspec'
3
-
3
+ # get a random time
4
4
  class Time
5
5
  def self.random
6
6
  year = Time.now.year
@@ -11,6 +11,7 @@ class Time
11
11
  end
12
12
 
13
13
  module AutoTest
14
+ # This module deals with the interaction on the page like clicking links and filling in forms
14
15
  module Page
15
16
  module_function
16
17
 
@@ -22,6 +23,7 @@ module AutoTest
22
23
  if Test.get_sessions(i,"depth") <= Test.get_max_depth then
23
24
  if Test.get_sessions(i,"iteration") <= Test.get_sessions(i,"iterations") then
24
25
  begin
26
+ # Login
25
27
  if Test.get_sessions(i, "current_depth") == 0 && !Test.no_auth then
26
28
  Authentication.login(Test.get_sessions(i,"user"),session)
27
29
  Test.check_invariants
@@ -30,6 +32,7 @@ module AutoTest
30
32
  session.visit "/"
31
33
  end
32
34
  if (Test.get_sessions(i,"current_depth") < Test.get_sessions(i,"depth")) then
35
+ # get the links of the page and delete the ones the tester specified
33
36
  links = all_links(session)
34
37
  handle_excluded_links(links)
35
38
  if !links.empty? then
@@ -38,13 +41,17 @@ module AutoTest
38
41
  paths = Test.get_sessions(i,"paths")
39
42
  paths[path] = links.size
40
43
  Test.sessions(i, "paths", paths)
44
+ # choose a random link
41
45
  random_link = links[rand(links.size)]
46
+ # check for javascript
42
47
  if random_link[:href] != "#" then
43
48
  hash = Hash.new
44
49
  hash["#{i}:#{path}"] = random_link[:href]+"+++"+random_link.text
45
50
  Test.add_to_action_path hash
46
51
  end
52
+ # click the link
47
53
  random_link.click
54
+ # update the console output
48
55
  STDOUT.write("\r#{Test.run}. run: \t#{Test.link_counter} links clicked, \t#{Test.users_logged_in} users logged in, \t#{Error.get_error} Errors")
49
56
  Test.link_counter = Test.link_counter + 1
50
57
  Test.check_invariants
@@ -55,19 +62,23 @@ module AutoTest
55
62
  else
56
63
  links = all_links(session)
57
64
  handle_excluded_links(links)
65
+ # calculate new iterations number
58
66
  if !links.empty? then
59
67
  Test.sessions(i,"iterations", 0)
60
68
  Test.get_sessions(i,"paths").each do |key, value|
61
69
  Test.sessions(i,"iterations", Test.get_sessions(i, "iterations") + value)
62
70
  end
63
71
  end
72
+ # logouz
64
73
  if !Test.no_auth then
65
74
  Authentication.logout(session)
66
75
  end
76
+ # new initialization of session variables
67
77
  Test.sessions(i, "current_depth", 0)
68
78
  Test.sessions(i, "paths", Hash.new)
69
79
  Test.sessions(i, "iteration", Test.get_sessions(i, "iteration") + 1)
70
80
  end
81
+ # rescue from exceptions, process the error
71
82
  rescue => e
72
83
  if Test.stop_at_first_error? then Test.stop! end
73
84
  message = e.message.to_s + " :" + e.backtrace.first.to_s
@@ -76,6 +87,7 @@ module AutoTest
76
87
 
77
88
  end
78
89
  else
90
+ # new initialization of session variables
79
91
  Test.sessions(i, "iteration", 0)
80
92
  Test.sessions(i, "iterations", 0)
81
93
  Test.sessions(i, "depth", Test.get_sessions(i, "depth") + 1)
@@ -86,6 +98,7 @@ module AutoTest
86
98
  Test.users_logged_in = Test.users_logged_in + 1
87
99
  end
88
100
  if !Test.no_auth then
101
+ # get new random user for next round
89
102
  Test.sessions(i, "current_user", Test.get_sessions(i,"current_user")+1)
90
103
  user = Authentication.get_users[rand(Authentication.get_users.size)]
91
104
  Test.sessions(i, "user", user)
@@ -113,9 +126,11 @@ module AutoTest
113
126
  button = all_submits(session)[rand(all_submits(session).size)]
114
127
  selects = all_selects(session)
115
128
  texts = []
129
+ # handle select fields first
116
130
  selects.each do |s|
117
131
  select_option(s[:id], texts, session)
118
132
  end
133
+ # handle other input types
119
134
  inputs.each do |i|
120
135
  case i[:type]
121
136
  when "email" then
@@ -147,6 +162,7 @@ module AutoTest
147
162
  end
148
163
  text = ""
149
164
  end
165
+ # check for values given by the tester and set these
150
166
  inputs_to_set = Test.get_inputs
151
167
  if !inputs_to_set.empty? then
152
168
  inputs.each do |i|
@@ -163,7 +179,6 @@ module AutoTest
163
179
  Test.add_to_action_path hash
164
180
  session.click_button button.value
165
181
  Test.link_counter = Test.link_counter + 1
166
-
167
182
  check_for_error_code(session)
168
183
  end
169
184
 
@@ -10,12 +10,15 @@ require 'test_starter'
10
10
  describe "Application" do
11
11
 
12
12
  describe "auto_test" do
13
+ # load fixtures
13
14
  if AutoTest::Test.use_fixtures? then
14
15
  fixtures(*AutoTest::Test.get_fixtures)
15
16
  end
16
17
  it "does test the application automatically" do
18
+ # load test data
17
19
  load "#{Rails.root}/db/test_seeds.rb"
18
20
  t = TestStarter.new
21
+ # start the test
19
22
  t.test
20
23
  end
21
24
  end