acceptance_test2 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +40 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGES +5 -0
- data/Gemfile +31 -0
- data/LICENSE +22 -0
- data/README.md +280 -0
- data/Rakefile +59 -0
- data/acceptance_test2.gemspec.erb +21 -0
- data/lib/acceptance_test/capybara/capybara_helper.rb +221 -0
- data/lib/acceptance_test/minitest/acceptance_spec.rb +20 -0
- data/lib/acceptance_test/rspec/rspec_helper.rb +177 -0
- data/lib/acceptance_test/turnip/turnip_helper.rb +46 -0
- data/lib/acceptance_test/version.rb +3 -0
- data/spec/features/search_with_drivers.feature +19 -0
- data/spec/features/search_with_pages.feature +9 -0
- data/spec/features/search_with_scenario_outline1.feature +15 -0
- data/spec/features/search_with_table.feature +16 -0
- data/spec/minitest_helper.rb +11 -0
- data/spec/rspec_helper.rb +4 -0
- data/spec/support/features/steps/common_steps.rb +5 -0
- data/spec/support/features/steps/main_page_steps.rb +16 -0
- data/spec/support/features/steps/search_with_drivers_steps.rb +18 -0
- data/spec/support/features/steps/search_with_pages_steps.rb +8 -0
- data/spec/support/features/steps/search_with_scenario_outline_steps.rb +18 -0
- data/spec/support/features/steps/search_with_table_steps.rb +34 -0
- data/spec/turnip_helper.rb +16 -0
- data/spec/unit/google_search_test.rb +34 -0
- data/spec/unit/wikipedia_search_spec.rb +19 -0
- data/spec/unit/wikipedia_search_test.rb +32 -0
- metadata +285 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/lib/acceptance_test/version')
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "acceptance_test2"
|
7
|
+
spec.summary = %q{Simplifies congiguration and run of acceptance tests.}
|
8
|
+
spec.description = %q{Description: simplifies congiguration and run of acceptance tests.}
|
9
|
+
spec.email = "alexander.shvets@gmail.com"
|
10
|
+
spec.authors = ["Alexander Shvets"]
|
11
|
+
spec.homepage = "http://github.com/shvets/acceptance_test2"
|
12
|
+
|
13
|
+
spec.files = `git ls-files`.split($\)
|
14
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
|
+
spec.require_paths = ["lib"]
|
16
|
+
spec.version = AcceptanceTest::VERSION
|
17
|
+
spec.license = "MIT"
|
18
|
+
|
19
|
+
<%= project_dependencies %>
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,221 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'capybara'
|
3
|
+
|
4
|
+
class CapybaraHelper
|
5
|
+
include Singleton
|
6
|
+
|
7
|
+
DEFAULT_DRIVER = :selenium
|
8
|
+
DEFAULT_BROWSER = :chrome
|
9
|
+
DEFAULT_WAIT_TIME = 2
|
10
|
+
|
11
|
+
attr_reader :headless_mode, :video_mode
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
Capybara.run_server = false
|
15
|
+
|
16
|
+
if ENV['HEADLESS']
|
17
|
+
begin
|
18
|
+
require 'headless'
|
19
|
+
|
20
|
+
@headless_mode = true
|
21
|
+
rescue LoadError
|
22
|
+
@headless_mode = false
|
23
|
+
|
24
|
+
puts "Headless mode is not supported on this OS."
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
@video_mode = ENV['VIDEO'] ? true : false
|
29
|
+
|
30
|
+
@parallel_tests_mode = ENV['TEST_ENV_NUMBER'] ? true : false
|
31
|
+
end
|
32
|
+
|
33
|
+
def before_test(app_host:, driver: DEFAULT_DRIVER, browser: DEFAULT_BROWSER, wait_time: DEFAULT_WAIT_TIME)
|
34
|
+
@old_driver = Capybara.current_driver
|
35
|
+
|
36
|
+
driver_name = register_driver driver: driver, browser: browser, selenium_url: nil, capabilities: nil
|
37
|
+
|
38
|
+
use_driver(driver_name)
|
39
|
+
|
40
|
+
# driver_manager.setup_browser_binary config[:browser].to_sym, config[:browser_binaries]
|
41
|
+
|
42
|
+
Capybara.app_host = app_host
|
43
|
+
|
44
|
+
@old_default_max_wait_time = Capybara.default_max_wait_time
|
45
|
+
|
46
|
+
Capybara.configure do |conf|
|
47
|
+
conf.default_max_wait_time = wait_time
|
48
|
+
|
49
|
+
# conf.match = :first
|
50
|
+
#
|
51
|
+
# conf.ignore_hidden_elements = false
|
52
|
+
end
|
53
|
+
|
54
|
+
if headless_mode
|
55
|
+
headless_params = {}
|
56
|
+
#headless_params[:display] = @parallel_tests_mode ? 100 + test_number : 1
|
57
|
+
headless_params[:reuse] = @parallel_tests_mode ? true : false
|
58
|
+
headless_params[:dimensions] = "1280x900x24"
|
59
|
+
|
60
|
+
headless_params[:video] = {
|
61
|
+
frame_rate: 12,
|
62
|
+
provider: :ffmpeg,
|
63
|
+
codec: :libx264,
|
64
|
+
pid_file_name: "/tmp/.headless_ffmpeg_#{test_number}.pid",
|
65
|
+
tmp_file_name: "/tmp/.headless_ffmpeg_#{test_number}.mp4",
|
66
|
+
extra: ['-pix_fmt yuv420p', '-b 6144k', '-b 6144k'],
|
67
|
+
log_file_path: STDERR
|
68
|
+
} if video_mode
|
69
|
+
|
70
|
+
@headless = Headless.new headless_params
|
71
|
+
|
72
|
+
@headless.start
|
73
|
+
|
74
|
+
#page.driver.browser.manage.window.resize_to(1280, 900)
|
75
|
+
|
76
|
+
@headless.video.start_capture if video_mode
|
77
|
+
end
|
78
|
+
|
79
|
+
driver_name
|
80
|
+
end
|
81
|
+
|
82
|
+
def after_test metadata: nil, exception: nil
|
83
|
+
Capybara.default_driver = @old_driver
|
84
|
+
Capybara.current_driver = @old_driver
|
85
|
+
Capybara.javascript_driver = @old_driver
|
86
|
+
|
87
|
+
Capybara.app_host = nil
|
88
|
+
|
89
|
+
Capybara.configure do |conf|
|
90
|
+
conf.default_max_wait_time = @old_default_max_wait_time
|
91
|
+
end
|
92
|
+
|
93
|
+
if headless_mode
|
94
|
+
|
95
|
+
#p metadata[:file_path]
|
96
|
+
|
97
|
+
#if exception
|
98
|
+
#File.basename(e.metadata[:file_path]
|
99
|
+
|
100
|
+
name = 'report'
|
101
|
+
|
102
|
+
@headless.video.stop_and_save "video_#{test_number}_#{name}.mp4" if video_mode
|
103
|
+
# else
|
104
|
+
# @headless.video.stop_and_discard if video_mode
|
105
|
+
# end
|
106
|
+
|
107
|
+
@headless.destroy
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_number
|
112
|
+
@parallel_tests_mode ? + ENV['TEST_ENV_NUMBER'].to_i : 1
|
113
|
+
end
|
114
|
+
|
115
|
+
def take_screenshot
|
116
|
+
if headless_mode
|
117
|
+
#@headless.take_screenshot
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
|
123
|
+
def register_driver driver:, browser: DEFAULT_BROWSER, selenium_url: nil, capabilities: nil
|
124
|
+
driver_name = build_driver_name(driver: driver, browser: browser, selenium_url: selenium_url)
|
125
|
+
|
126
|
+
# case driver
|
127
|
+
# # when :poltergeist
|
128
|
+
# # require 'capybara/poltergeist'
|
129
|
+
#
|
130
|
+
# when :webkit
|
131
|
+
# require "capybara-webkit"
|
132
|
+
#
|
133
|
+
# when :firefox_with_firebug
|
134
|
+
# require 'capybara/firebug'
|
135
|
+
#
|
136
|
+
# else
|
137
|
+
# ;
|
138
|
+
# end
|
139
|
+
|
140
|
+
# if driver == :poltergeist
|
141
|
+
# properties = {}
|
142
|
+
# properties[:debug] = false
|
143
|
+
#
|
144
|
+
# Capybara.register_driver :poltergeist do |app|
|
145
|
+
# Capybara::Poltergeist::Driver.new(app, properties)
|
146
|
+
# end
|
147
|
+
# elsif driver == :webkit
|
148
|
+
# ;
|
149
|
+
# else
|
150
|
+
if driver == :selenium
|
151
|
+
properties = {}
|
152
|
+
|
153
|
+
if not selenium_url
|
154
|
+
properties[:browser] = browser
|
155
|
+
else
|
156
|
+
properties[:browser] = :remote
|
157
|
+
properties[:url] = selenium_url
|
158
|
+
|
159
|
+
case browser
|
160
|
+
when :firefox
|
161
|
+
# profile = Selenium::WebDriver::Firefox::Profile.new
|
162
|
+
# profile.enable_firebug
|
163
|
+
# capabilities = Selenium::WebDriver::Remote::Capabilities.firefox(:firefox_profile => profile)
|
164
|
+
|
165
|
+
caps = Selenium::WebDriver::Remote::Capabilities.firefox
|
166
|
+
when :chrome
|
167
|
+
caps = Selenium::WebDriver::Remote::Capabilities.chrome
|
168
|
+
else
|
169
|
+
;
|
170
|
+
end
|
171
|
+
|
172
|
+
desired_capabilities =
|
173
|
+
if caps
|
174
|
+
capabilities.each do |key, value|
|
175
|
+
caps[key] = value
|
176
|
+
end if capabilities
|
177
|
+
|
178
|
+
caps
|
179
|
+
elsif capabilities
|
180
|
+
capabilities
|
181
|
+
end
|
182
|
+
|
183
|
+
properties[:desired_capabilities] = desired_capabilities if desired_capabilities
|
184
|
+
end
|
185
|
+
|
186
|
+
Capybara.register_driver driver_name do |app|
|
187
|
+
Capybara::Selenium::Driver.new(app, properties)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
driver_name
|
192
|
+
end
|
193
|
+
|
194
|
+
def build_driver_name driver:, browser:, selenium_url: nil
|
195
|
+
case driver
|
196
|
+
when :webkit
|
197
|
+
:webkit
|
198
|
+
# when :poltergeist
|
199
|
+
# :poltergeist
|
200
|
+
when :selenium
|
201
|
+
name = ""
|
202
|
+
name += driver ? "#{driver}_" : "#{Capybara.default_driver}_"
|
203
|
+
|
204
|
+
name += "#{browser}_" if browser
|
205
|
+
name += "remote" if selenium_url
|
206
|
+
name = name[0..name.size-2] if name[name.size-1] == "_"
|
207
|
+
|
208
|
+
name.to_sym
|
209
|
+
else
|
210
|
+
:unsupported
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
def use_driver driver
|
215
|
+
if driver and Capybara.drivers[driver]
|
216
|
+
# Capybara.default_driver = driver
|
217
|
+
Capybara.current_driver = driver
|
218
|
+
Capybara.javascript_driver = driver
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'minitest/spec'
|
2
|
+
require 'capybara'
|
3
|
+
|
4
|
+
class AcceptanceSpec < MiniTest::Spec
|
5
|
+
include Capybara::DSL
|
6
|
+
include Capybara::Assertions
|
7
|
+
|
8
|
+
before do
|
9
|
+
if metadata[:js]
|
10
|
+
Capybara.current_driver = Capybara.javascript_driver
|
11
|
+
else
|
12
|
+
Capybara.current_driver = Capybara.default_driver
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def teardown
|
17
|
+
Capybara.reset_session!
|
18
|
+
Capybara.use_default_driver
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'rspec/expectations'
|
3
|
+
|
4
|
+
require 'capybara/rspec'
|
5
|
+
require 'capybara/dsl'
|
6
|
+
|
7
|
+
require 'singleton'
|
8
|
+
|
9
|
+
require 'acceptance_test/capybara/capybara_helper'
|
10
|
+
|
11
|
+
class RspecHelper
|
12
|
+
include Singleton
|
13
|
+
|
14
|
+
def configure(app_host:, driver: CapybaraHelper::DEFAULT_DRIVER, browser: CapybaraHelper::DEFAULT_BROWSER,
|
15
|
+
wait_time: CapybaraHelper::DEFAULT_WAIT_TIME)
|
16
|
+
register_extensions
|
17
|
+
|
18
|
+
RSpec.configure do |rspec_config|
|
19
|
+
params = {app_host: app_host, driver: driver, browser: browser, wait_time: wait_time}
|
20
|
+
|
21
|
+
RspecHelper.instance.configure_rspec rspec_config, params
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_shared_context(name)
|
26
|
+
register_extensions
|
27
|
+
|
28
|
+
RSpec.shared_context name do |app_host:, driver: CapybaraHelper::DEFAULT_DRIVER, browser: CapybaraHelper::DEFAULT_BROWSER,
|
29
|
+
wait_time: CapybaraHelper::DEFAULT_WAIT_TIME|
|
30
|
+
self.define_singleton_method(:include_context, lambda do
|
31
|
+
params = {app_host: app_host, driver: driver, browser: browser, wait_time: wait_time}
|
32
|
+
|
33
|
+
RspecHelper.instance.configure_rspec self, params
|
34
|
+
end)
|
35
|
+
|
36
|
+
include_context
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def configure_rspec(rspec_config, app_host:, driver: CapybaraHelper::DEFAULT_DRIVER, browser: CapybaraHelper::DEFAULT_BROWSER,
|
41
|
+
wait_time: CapybaraHelper::DEFAULT_WAIT_TIME)
|
42
|
+
rspec_config.around(:each) do |example|
|
43
|
+
params = {metadata: example.metadata, app_host: app_host, driver: driver, browser: browser, wait_time: wait_time}
|
44
|
+
|
45
|
+
RspecHelper.instance.before_test params
|
46
|
+
|
47
|
+
example.run
|
48
|
+
|
49
|
+
RspecHelper.instance.after_test metadata: example.metadata, exception: example.exception
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def before_test metadata:, app_host:, driver:, browser:, wait_time:
|
54
|
+
old_driver = Capybara.current_driver
|
55
|
+
|
56
|
+
selected_driver = RspecHelper.instance.get_driver(metadata, driver: driver)
|
57
|
+
selected_browser = RspecHelper.instance.get_browser(metadata, browser: browser)
|
58
|
+
|
59
|
+
params = {app_host: app_host, driver: selected_driver, browser: selected_browser, wait_time: wait_time}
|
60
|
+
|
61
|
+
CapybaraHelper.instance.before_test params
|
62
|
+
|
63
|
+
# puts "Using driver: #{Capybara.current_driver}."
|
64
|
+
# puts "Default wait time: #{Capybara.default_max_wait_time }."
|
65
|
+
|
66
|
+
new_driver = Capybara.current_driver
|
67
|
+
|
68
|
+
Capybara.current_session.instance_variable_set(:@mode, new_driver)
|
69
|
+
|
70
|
+
if old_driver != new_driver
|
71
|
+
metadata.delete(old_driver)
|
72
|
+
metadata[new_driver] = true
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def after_test(metadata: metadata, exception: exception)
|
77
|
+
CapybaraHelper.instance.after_test metadata: metadata, exception: exception
|
78
|
+
|
79
|
+
# driver = driver(example.metadata)
|
80
|
+
#
|
81
|
+
# if driver and exception and page and not [:webkit].include? driver
|
82
|
+
# screenshot_maker.basedir = File.expand_path(config[:screenshots_dir])
|
83
|
+
#
|
84
|
+
# screenshot_maker.make page, example.metadata
|
85
|
+
#
|
86
|
+
# puts example.metadata[:full_description]
|
87
|
+
# puts "Screenshot: #{screenshot_maker.screenshot_url(example.metadata)}"
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
end
|
91
|
+
|
92
|
+
def register_extensions
|
93
|
+
RSpec.configure do |conf|
|
94
|
+
conf.filter_run_excluding :exclude => true
|
95
|
+
end
|
96
|
+
|
97
|
+
RSpec::configure do |config|
|
98
|
+
config.include RSpec::Matchers::DSL
|
99
|
+
config.include Capybara::RSpecMatchers
|
100
|
+
config.include Capybara::DSL
|
101
|
+
end
|
102
|
+
|
103
|
+
# RSpec::Core::ExampleGroup.send :include, Capybara::DSL
|
104
|
+
end
|
105
|
+
|
106
|
+
def get_driver(metadata, driver:)
|
107
|
+
#driver = ENV['DRIVER'].nil? ? nil : ENV['DRIVER'].to_sym
|
108
|
+
|
109
|
+
driver_name = driver
|
110
|
+
|
111
|
+
driver_name = metadata[:driver] unless driver_name
|
112
|
+
|
113
|
+
supported_drivers.each do |supported_driver|
|
114
|
+
driver_name = supported_driver if metadata[supported_driver]
|
115
|
+
break if driver
|
116
|
+
end if driver.nil?
|
117
|
+
|
118
|
+
driver_name = :selenium unless driver_name
|
119
|
+
|
120
|
+
driver_name
|
121
|
+
end
|
122
|
+
|
123
|
+
def get_browser(metadata, browser:)
|
124
|
+
#browser_name = ENV['BROWSER'].nil? ? nil : ENV['BROWSER'].to_sym
|
125
|
+
|
126
|
+
browser_name = browser
|
127
|
+
|
128
|
+
browser_name = metadata[:browser] unless browser_name
|
129
|
+
|
130
|
+
supported_browsers.each do |supported_browser|
|
131
|
+
browser_name = supported_browser if metadata[supported_browser]
|
132
|
+
break if browser
|
133
|
+
end if browser.nil?
|
134
|
+
|
135
|
+
browser_name = CapybaraHelper::DEFAULT_BROWSER unless browser_name
|
136
|
+
|
137
|
+
browser_name
|
138
|
+
end
|
139
|
+
|
140
|
+
def supported_drivers
|
141
|
+
[:selenium, :webkit]
|
142
|
+
end
|
143
|
+
|
144
|
+
def supported_browsers
|
145
|
+
[:chrome, :firefox]
|
146
|
+
end
|
147
|
+
|
148
|
+
def run_on_specs_finished command
|
149
|
+
clazz = Object.const_set("CustomFormatter", Class.new)
|
150
|
+
|
151
|
+
clazz.class_eval do
|
152
|
+
define_method :initialize do |_| ; end
|
153
|
+
|
154
|
+
define_method :close do |_|
|
155
|
+
system command
|
156
|
+
|
157
|
+
# require 'launchy'
|
158
|
+
#
|
159
|
+
# ENV['BROWSER'] = '/Applications/Google\ Chrome.app'
|
160
|
+
#
|
161
|
+
# Launchy.open "output/wikipedia-turnip-report.html"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
RSpec::Core::Formatters.register clazz, :close
|
166
|
+
|
167
|
+
RSpec::configure do |config|
|
168
|
+
config.formatter = "CustomFormatter"
|
169
|
+
end
|
170
|
+
|
171
|
+
# RSpec.configure do |config|
|
172
|
+
# config.after(:type => :feature) do
|
173
|
+
# system cmd
|
174
|
+
# end
|
175
|
+
# end
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
require 'turnip/capybara'
|
4
|
+
|
5
|
+
class TurnipHelper
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def configure(title: 'Turnip', report_file:, steps_dir:)
|
9
|
+
# configure turnip formatter
|
10
|
+
|
11
|
+
require 'turnip_formatter'
|
12
|
+
|
13
|
+
RSpec.configure do |config|
|
14
|
+
config.add_formatter RSpecTurnipFormatter, report_file
|
15
|
+
end
|
16
|
+
|
17
|
+
TurnipFormatter.configure do |config|
|
18
|
+
config.title = title
|
19
|
+
end
|
20
|
+
|
21
|
+
# configure gnawrnip
|
22
|
+
|
23
|
+
require 'gnawrnip'
|
24
|
+
|
25
|
+
Gnawrnip.configure do |c|
|
26
|
+
c.make_animation = true
|
27
|
+
c.max_frame_size = 1024 # pixel
|
28
|
+
end
|
29
|
+
|
30
|
+
Gnawrnip.ready!
|
31
|
+
|
32
|
+
load_steps [steps_dir]
|
33
|
+
end
|
34
|
+
|
35
|
+
def load_steps support_dirs
|
36
|
+
support_dirs.each do |support_dir|
|
37
|
+
Dir["#{support_dir}/**/steps/*_steps.rb"].each do |name|
|
38
|
+
ext = File.extname(name)
|
39
|
+
name = name[support_dir.length+1..name.length-ext.length-1]
|
40
|
+
|
41
|
+
require name
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|