howitzer 0.0.3 → 1.0.1
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.
- data/.gitignore +8 -0
- data/.rspec +3 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +32 -0
- data/GETTING_STARTED.md +529 -0
- data/Gemfile +4 -2
- data/LICENSE +2 -2
- data/README.md +57 -13
- data/Rakefile +9 -2
- data/bin/howitzer +79 -31
- data/generators/base_generator.rb +87 -0
- data/generators/config/config_generator.rb +16 -20
- data/generators/config/templates/default.yml +26 -7
- data/generators/cucumber/cucumber_generator.rb +20 -26
- data/generators/{tasks → cucumber}/templates/cucumber.rake +0 -0
- data/generators/{config → cucumber}/templates/cucumber.yml +0 -0
- data/generators/emails/emails_generator.rb +11 -18
- data/generators/emails/templates/example_email.rb +1 -0
- data/generators/pages/pages_generator.rb +16 -18
- data/generators/pages/templates/example_menu.rb +1 -0
- data/generators/pages/templates/example_page.rb +1 -1
- data/generators/root/root_generator.rb +18 -20
- data/generators/root/templates/.gitignore +2 -1
- data/generators/root/templates/Gemfile +3 -2
- data/generators/root/templates/Rakefile +10 -0
- data/generators/root/templates/boot.rb +3 -9
- data/generators/rspec/rspec_generator.rb +23 -0
- data/generators/rspec/templates/example_spec.rb +7 -0
- data/generators/rspec/templates/rspec.rake +34 -0
- data/generators/rspec/templates/spec_helper.rb +56 -0
- data/generators/tasks/tasks_generator.rb +11 -17
- data/generators/tasks/templates/common.rake +15 -0
- data/howitzer.gemspec +13 -2
- data/lib/howitzer.rb +1 -0
- data/lib/howitzer/helpers.rb +87 -2
- data/lib/howitzer/init.rb +0 -1
- data/lib/howitzer/patches/rawler_patched.rb +86 -0
- data/lib/howitzer/settings.rb +27 -0
- data/lib/howitzer/utils.rb +3 -12
- data/lib/howitzer/utils/capybara_patched.rb +3 -2
- data/lib/howitzer/utils/capybara_settings.rb +158 -24
- data/lib/howitzer/utils/data_generator/data_storage.rb +35 -1
- data/lib/howitzer/utils/data_generator/gen.rb +45 -3
- data/lib/howitzer/utils/email/email.rb +44 -5
- data/lib/howitzer/utils/email/mail_client.rb +28 -22
- data/lib/howitzer/utils/email/mailgun_helper.rb +30 -4
- data/lib/howitzer/utils/locator_store.rb +111 -19
- data/lib/howitzer/utils/log.rb +137 -0
- data/lib/howitzer/utils/page_validator.rb +86 -0
- data/lib/howitzer/vendor/firebug-1.12.1-fx.xpi +0 -0
- data/lib/howitzer/vendor/firepath-0.9.7-fx.xpi +0 -0
- data/lib/howitzer/version.rb +2 -2
- data/lib/howitzer/web_page.rb +159 -19
- data/spec/active_resource.rb +0 -0
- data/spec/config/custom.yml +1 -0
- data/spec/config/default.yml +28 -0
- data/spec/spec_helper.rb +46 -1
- data/spec/support/boot_helper.rb +15 -0
- data/spec/support/generator_helper.rb +13 -0
- data/spec/support/logger_helper.rb +12 -0
- data/spec/unit/bin/howitzer_spec.rb +175 -0
- data/spec/unit/generators/generators_spec.rb +175 -0
- data/spec/unit/lib/capybara_settings_spec.rb +170 -0
- data/spec/unit/lib/helpers_spec.rb +619 -0
- data/spec/unit/lib/init_spec.rb +14 -0
- data/spec/unit/lib/settings_spec.rb +17 -0
- data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +62 -0
- data/spec/unit/lib/utils/data_generator/gen_spec.rb +151 -0
- data/spec/unit/lib/utils/email/email_spec.rb +75 -0
- data/spec/unit/lib/utils/email/mail_client_spec.rb +115 -0
- data/spec/unit/lib/utils/email/mailgun_helper_spec.rb +95 -0
- data/spec/unit/lib/utils/locator_store_spec.rb +122 -0
- data/spec/unit/lib/utils/log_spec.rb +107 -0
- data/spec/unit/lib/utils/page_validator_spec.rb +142 -0
- data/spec/unit/lib/web_page_spec.rb +250 -0
- data/spec/unit/version_spec.rb +8 -0
- metadata +215 -15
- data/Gemfile.lock +0 -103
- data/History.md +0 -20
- data/lib/howitzer/utils/logger.rb +0 -108
- data/spec/howitzer/version_spec.rb +0 -8
data/Gemfile
CHANGED
data/LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c)
|
1
|
+
Copyright (c) 2013 StrongQA, Inc.
|
2
2
|
|
3
3
|
MIT License
|
4
4
|
|
@@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
19
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
20
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
21
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# Howitzer
|
2
2
|
|
3
|
+
[](http://travis-ci.org/romikoops/howitzer)
|
3
4
|
[](https://gemnasium.com/romikoops/howitzer)
|
4
5
|
|
5
|
-
Howitzer is Ruby based framework for acceptance testing.
|
6
|
+
Howitzer is Ruby based framework for acceptance testing.
|
6
7
|
|
7
8
|
Initially it was developed for testing of web applications, but it is applicable to testing of web services or some API as well.
|
8
9
|
The framework uses modern patterns, techniques and tools in automated testing area. For details, please see [Test Framework Design](https://github.com/romikoops/howitzer/wiki/Test-Framework-Design).
|
@@ -11,10 +12,20 @@ The framework uses modern patterns, techniques and tools in automated testing ar
|
|
11
12
|
- Independent of test web application, its technologies and lanquage.
|
12
13
|
- Deploy all test infrastructure for 5 minutes.
|
13
14
|
- Flexible test framework configuration.
|
14
|
-
- Ability to choose desired BDD tool (Cucumber
|
15
|
-
- Itegration with SauceLabs, Mailgun web services.
|
15
|
+
- Ability to choose desired BDD tool (Cucumber or RSpec)
|
16
|
+
- Itegration with SauceLabs, Testingbot and Mailgun web services.
|
16
17
|
- Easy to support tests in actual state.
|
17
18
|
- Ability to execute tests against to both browserless driver and actual browsers with no changes in your tests.
|
19
|
+
- Ability to check all links are valid
|
20
|
+
|
21
|
+
|
22
|
+
## Documentation
|
23
|
+
See [GETTING_STARTED](https://github.com/romikoops/howitzer/blob/develop/GETTING_STARTED.md) how to work with *howitzer*.
|
24
|
+
|
25
|
+
Also you can find Rdoc documentation on [Rubygems](https://rubygems.org/gems/howitzer).
|
26
|
+
|
27
|
+
## Requirements
|
28
|
+
Ruby 1.9.3+
|
18
29
|
|
19
30
|
## Setup
|
20
31
|
To install, type
|
@@ -29,26 +40,46 @@ To deploy the framework, type:
|
|
29
40
|
```bash
|
30
41
|
mkdir test_automation
|
31
42
|
cd test_automation
|
43
|
+
```
|
44
|
+
|
45
|
+
Then for Cucumber:
|
46
|
+
|
47
|
+
```bash
|
32
48
|
howitzer install --cucumber
|
33
49
|
```
|
34
50
|
|
51
|
+
For Rspec:
|
52
|
+
|
53
|
+
```bash
|
54
|
+
howitzer install --rspec
|
55
|
+
```
|
56
|
+
|
57
|
+
Or for both the ones:
|
58
|
+
|
59
|
+
```bash
|
60
|
+
howitzer install --cucumber --rspec
|
61
|
+
```
|
62
|
+
|
35
63
|
This command will generate next folders and files:
|
36
64
|
```
|
37
65
|
config/
|
38
|
-
|
39
|
-
|
40
|
-
|
66
|
+
cucumber.yml
|
67
|
+
default.yml
|
68
|
+
custom.yml
|
41
69
|
tasks/
|
42
|
-
|
70
|
+
common.rake
|
71
|
+
cucumber.rake
|
72
|
+
rspec.rake
|
43
73
|
emails/
|
44
|
-
|
74
|
+
example_email.rb
|
45
75
|
features/
|
46
|
-
|
47
|
-
|
48
|
-
|
76
|
+
support/env.rb
|
77
|
+
step_definitions/common_steps.rb
|
78
|
+
example.feature
|
49
79
|
pages/
|
50
|
-
|
51
|
-
|
80
|
+
example_page.rb
|
81
|
+
example_menu.rb
|
82
|
+
boot.rb
|
52
83
|
Gemfile
|
53
84
|
Rakefile
|
54
85
|
.gitignore
|
@@ -64,6 +95,19 @@ Learn and specify correct default settings in `config/default.yml` file. For det
|
|
64
95
|
- Debug feature.
|
65
96
|
- Enjoy it!
|
66
97
|
|
98
|
+
## Rake tasks
|
99
|
+
|
100
|
+
You can list all available tasks with next command
|
101
|
+
|
102
|
+
```bash
|
103
|
+
rake -T
|
104
|
+
```
|
105
|
+
|
106
|
+
## More information
|
107
|
+
* [Rubygems](https://rubygems.org/gems/howitzer)
|
108
|
+
* [Mailing list](https://groups.google.com/forum/#!forum/howitzer_ruby)
|
109
|
+
* [Issues](https://github.com/romikoops/howitzer/issues)
|
110
|
+
|
67
111
|
## Contributing
|
68
112
|
|
69
113
|
1. Fork it
|
data/Rakefile
CHANGED
@@ -1,2 +1,9 @@
|
|
1
|
-
|
2
|
-
require "bundler
|
1
|
+
require 'rubygems'
|
2
|
+
require "bundler"
|
3
|
+
Bundler.setup
|
4
|
+
|
5
|
+
require 'rake'
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
Bundler::GemHelper.install_tasks
|
8
|
+
RSpec::Core::RakeTask.new(:spec) { |spec| }
|
9
|
+
task :default => :spec
|
data/bin/howitzer
CHANGED
@@ -1,41 +1,89 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
4
|
-
require 'rubigen'
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
Dir[File.join(File.dirname(__FILE__), '..', 'generators', '**', '*_generator.rb')].each{ |f| require File.expand_path(f) }
|
6
|
+
|
7
|
+
def check_arguments
|
8
|
+
expected_option_list = [
|
9
|
+
'install --cucumber',
|
10
|
+
'install --rspec',
|
11
|
+
'install --cucumber --rspec',
|
12
|
+
'install --rspec --cucumber',
|
13
|
+
'--version',
|
14
|
+
'--help'
|
15
|
+
]
|
16
|
+
|
17
|
+
actual_options = ARGV.map(&:downcase).join(' ')
|
18
|
+
unless expected_option_list.include?(actual_options)
|
19
|
+
puts "ERROR: incorrect options. Please, see help for details"
|
20
|
+
show_help
|
21
|
+
exit 1
|
22
|
+
end
|
10
23
|
end
|
11
24
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
])
|
19
|
-
|
20
|
-
CORRECT_ARGS = %w[--cucumber --rspec]
|
21
|
-
|
22
|
-
if ARGV[0] == "install"
|
23
|
-
ARGV.delete 'install'
|
24
|
-
ARGV.each do |option|
|
25
|
-
if option == '--cucumber'
|
26
|
-
RubiGen::Scripts::Generate.new.run(%w[cucumber])
|
27
|
-
RubiGen::Scripts::Generate.new.run(%w[root])
|
28
|
-
RubiGen::Scripts::Generate.new.run(%w[config])
|
29
|
-
RubiGen::Scripts::Generate.new.run(%w[pages])
|
30
|
-
RubiGen::Scripts::Generate.new.run(%w[tasks])
|
31
|
-
RubiGen::Scripts::Generate.new.run(%w[emails])
|
32
|
-
elsif option == '--rspec'
|
33
|
-
#TODO add rspec generator
|
34
|
-
puts "Rspec generator is not available"
|
25
|
+
def parse_options
|
26
|
+
first_option = ARGV.shift.to_s.downcase
|
27
|
+
case first_option
|
28
|
+
when 'install' then execute_generator(ARGV.map(&:downcase))
|
29
|
+
when '--version' then show_version
|
30
|
+
when '--help' then show_help
|
35
31
|
else
|
36
|
-
|
32
|
+
puts "ERROR: incorrect first argument ('#{first_option}')"
|
33
|
+
show_help
|
34
|
+
exit 1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def show_help
|
41
|
+
puts %{
|
42
|
+
howitzer [command {--cucumber, --rspec}] | {options}
|
43
|
+
|
44
|
+
Commands are ...
|
45
|
+
install Generate test framework units:
|
46
|
+
--rspec add RSpec integration with framework
|
47
|
+
--cucumber add Cucumber integration with framework
|
48
|
+
Options are ...
|
49
|
+
--help Display this help message.
|
50
|
+
--version Display the program version.
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def show_version
|
55
|
+
require_relative "../lib/howitzer/version"
|
56
|
+
puts "Version: #{Howitzer::VERSION}"
|
57
|
+
exit 0
|
58
|
+
end
|
59
|
+
|
60
|
+
def execute_generator(options)
|
61
|
+
if %w[--cucumber --rspec].include?(options.first)
|
62
|
+
Howitzer::ConfigGenerator.new
|
63
|
+
Howitzer::PagesGenerator.new
|
64
|
+
Howitzer::TasksGenerator.new
|
65
|
+
Howitzer::EmailsGenerator.new
|
66
|
+
Howitzer::RootGenerator.new
|
67
|
+
|
68
|
+
options.each do |option|
|
69
|
+
case option
|
70
|
+
when '--cucumber' then Howitzer::CucumberGenerator.new
|
71
|
+
when '--rspec' then Howitzer::RspecGenerator.new
|
72
|
+
else nil
|
73
|
+
end
|
37
74
|
end
|
75
|
+
else
|
76
|
+
if options.empty?
|
77
|
+
puts "ERROR: No option specified for install command."
|
78
|
+
else
|
79
|
+
puts "ERROR: Unknown '#{options.first}' option specified."
|
80
|
+
end
|
81
|
+
show_help
|
82
|
+
exit 1
|
38
83
|
end
|
39
|
-
|
40
|
-
|
84
|
+
end
|
85
|
+
|
86
|
+
unless ENV['TEST_MODE']
|
87
|
+
check_arguments
|
88
|
+
parse_options
|
41
89
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Howitzer
|
4
|
+
class BaseGenerator
|
5
|
+
def self.logger=(logger)
|
6
|
+
@logger = logger
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.destination=(destination)
|
10
|
+
@destination = destination
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
print_banner
|
15
|
+
manifest.each do |type, list|
|
16
|
+
case type
|
17
|
+
when :files
|
18
|
+
copy_files(list)
|
19
|
+
when :templates
|
20
|
+
copy_templates(list)
|
21
|
+
else nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def manifest; end
|
27
|
+
|
28
|
+
protected
|
29
|
+
def banner; end
|
30
|
+
|
31
|
+
def logger
|
32
|
+
BaseGenerator.instance_variable_get(:@logger) || $stdout
|
33
|
+
end
|
34
|
+
|
35
|
+
def destination
|
36
|
+
BaseGenerator.instance_variable_get(:@destination) || Dir.pwd
|
37
|
+
end
|
38
|
+
|
39
|
+
def copy_files(list)
|
40
|
+
list.each do |data|
|
41
|
+
source_file = source_path(data[:source])
|
42
|
+
|
43
|
+
if File.exists?(source_file)
|
44
|
+
copy_with_path(data)
|
45
|
+
else
|
46
|
+
print_error("File '#{source_file}' was not found.")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def copy_templates(list)
|
52
|
+
#TODO implement me if it is require
|
53
|
+
end
|
54
|
+
|
55
|
+
def print_banner
|
56
|
+
logger.puts banner unless banner.empty?
|
57
|
+
end
|
58
|
+
|
59
|
+
def print_info(data)
|
60
|
+
logger.puts " #{data}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def print_error(data)
|
64
|
+
logger.puts " ERROR: #{data}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def source_path(file_name)
|
68
|
+
File.expand_path(
|
69
|
+
file_name, File.join(File.dirname(__FILE__), self.class.name.sub('Generator', '').sub('Howitzer::', '').downcase, 'templates')
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
def dest_path(path)
|
74
|
+
File.expand_path(File.join(destination, path))
|
75
|
+
end
|
76
|
+
|
77
|
+
def copy_with_path(data)
|
78
|
+
src = source_path(data[:source])
|
79
|
+
dst = dest_path(data[:destination])
|
80
|
+
FileUtils.mkdir_p(File.dirname(dst))
|
81
|
+
FileUtils.cp(src, dst)
|
82
|
+
print_info("Added '#{data[:destination]}' file")
|
83
|
+
rescue => e
|
84
|
+
print_error("Impossible to create '#{data[:destination]}' file. Reason: #{e.message}")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -1,24 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class ConfigGenerator <
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
m.directory ''
|
12
|
-
m.template 'custom.yml', 'custom.yml'
|
13
|
-
m.template 'default.yml', 'default.yml'
|
14
|
-
m.file 'cucumber.yml', 'cucumber.yml'
|
1
|
+
require_relative '../base_generator'
|
2
|
+
module Howitzer
|
3
|
+
class ConfigGenerator < BaseGenerator
|
4
|
+
def manifest
|
5
|
+
{ files:
|
6
|
+
[
|
7
|
+
{ source: 'custom.yml', destination: 'config/custom.yml'},
|
8
|
+
{ source: 'default.yml', destination: 'config/default.yml'}
|
9
|
+
]
|
10
|
+
}
|
15
11
|
end
|
16
|
-
end
|
17
12
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
13
|
+
protected
|
14
|
+
def banner
|
15
|
+
<<-EOF
|
16
|
+
Creates config files.
|
17
|
+
EOF
|
18
|
+
end
|
23
19
|
end
|
24
20
|
end
|
@@ -6,8 +6,11 @@
|
|
6
6
|
###########################################################
|
7
7
|
# APPLICATION SETTINGS #
|
8
8
|
###########################################################
|
9
|
+
app_base_auth_login: login
|
10
|
+
app_base_auth_pass: pass
|
11
|
+
app_protocol: http
|
9
12
|
app_host: my.website.com
|
10
|
-
|
13
|
+
|
11
14
|
def_test_user: test@test.com
|
12
15
|
def_test_pass: mypass
|
13
16
|
def_test_name: Auto Tester
|
@@ -16,19 +19,17 @@
|
|
16
19
|
# TEST ENVIRONMENTS SETTINGS #
|
17
20
|
###########################################################
|
18
21
|
|
19
|
-
# Specify one of the following drivers: selenium, selenium_dev, webkit, poltergeist, sauce
|
20
|
-
driver:
|
22
|
+
# Specify one of the following drivers: selenium, selenium_dev, webkit, poltergeist, sauce, testingbot
|
23
|
+
driver: poltergeist
|
21
24
|
|
22
25
|
# -Selenium-
|
23
26
|
# specify one of next browsers: iexplore (ie), firefox (ff), chrome, opera
|
24
27
|
sel_browser: ff
|
25
|
-
sel_firefox_version: 10
|
26
|
-
sel_firebug_version: 1.9.1
|
27
|
-
sel_firepath_version: 0.9.7
|
28
28
|
|
29
29
|
# -PhantomJS-
|
30
30
|
# specify settings for poltergeist
|
31
|
-
|
31
|
+
pjs_ignore_js_errors: false
|
32
|
+
pjs_ignore_ssl_errors: true
|
32
33
|
|
33
34
|
# -SauceLabs-
|
34
35
|
sl_user: some_user
|
@@ -40,6 +41,18 @@
|
|
40
41
|
sl_max_duration: '1800'
|
41
42
|
sl_idle_timeout: '180'
|
42
43
|
|
44
|
+
# -TestingBot- browsers that are supported: firefox => '8', googlechrome, iexplore => '9'
|
45
|
+
tb_api_key: client_key
|
46
|
+
tb_api_secret: client_secret
|
47
|
+
tb_url: "http://${tb_api_key}:${tb_api_secret}@hub.testingbot.com:80/wd/hub"
|
48
|
+
tb_platform: :WIN8
|
49
|
+
tb_browser_name: firefox
|
50
|
+
tb_browser_version: 8
|
51
|
+
tb_selenium_version: "2.18.0"
|
52
|
+
tb_max_duration: '1800'
|
53
|
+
tb_idle_timeout: '180'
|
54
|
+
tb_record_screenshot: false
|
55
|
+
|
43
56
|
###########################################################
|
44
57
|
# DATABASE SETTINGS #
|
45
58
|
###########################################################
|
@@ -51,8 +64,14 @@
|
|
51
64
|
###########################################################
|
52
65
|
log_dir: "log"
|
53
66
|
txt_log: log.txt
|
67
|
+
html_log: log.html
|
54
68
|
selenium_server_log: selenium-server.log
|
55
69
|
required_clean_logs: true
|
70
|
+
rawler_log: rawler_log.txt
|
71
|
+
add_rawler_xml_log: false
|
72
|
+
rawler_xml_log: rawler_log.xml
|
73
|
+
add_rawler_html_log: false # not implemented yet
|
74
|
+
rawler_html_log: rawler_log.html # not implemented yet
|
56
75
|
|
57
76
|
###########################################################
|
58
77
|
# MAIL SETTINGS #
|