chemistrykit 3.9.0.rc3 → 3.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.
- data/CHANGELOG.md +15 -0
- data/README.md +26 -20
- data/Rakefile +2 -2
- data/chemistrykit.gemspec +3 -3
- data/features/brew.feature +2 -6
- data/features/catalyst.feature +0 -1
- data/features/chemists.feature +0 -1
- data/features/concurrency.feature +0 -1
- data/features/exit_status.feature +0 -1
- data/features/global-config.feature +0 -1
- data/features/load_page_objects.feature +0 -1
- data/features/multi-config.feature +2 -3
- data/features/reporting.feature +16 -3
- data/features/sauce.feature +46 -0
- data/features/split_testing.feature +0 -1
- data/lib/chemistrykit/catalyst.rb +1 -1
- data/lib/chemistrykit/cli/cli.rb +22 -6
- data/lib/chemistrykit/config/reporting.rb +14 -0
- data/lib/chemistrykit/configuration.rb +4 -13
- data/lib/chemistrykit/reporting/html_report_assembler.rb +7 -2
- data/lib/chemistrykit/rspec/html_formatter.rb +15 -7
- data/spec/support/config.yaml +0 -4
- data/spec/unit/lib/chemistrykit/config/reporting_spec.rb +21 -0
- data/spec/unit/lib/chemistrykit/configuration_spec.rb +8 -22
- metadata +16 -10
- data/features/logging.feature +0 -98
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
#3.9.0 (2013-08-26)
|
2
|
+
Improved reporting features and configuration for sauce permissions
|
3
|
+
|
4
|
+
- Bumped version to 3.9.0 to prepare for release.
|
5
|
+
- updated rake file to override build verify in special cases
|
6
|
+
- final fix to a test
|
7
|
+
- fixed issues causing tests to fail
|
8
|
+
- updated docs to reflect recent changes and future release
|
9
|
+
- updated report generation to include dom dumps for all available windows
|
10
|
+
- upgraded SC version and added hooks to handle tagging sauce jobs and setting the team permission via a beaker tag, plus tests
|
11
|
+
- screenshots front and center, hiding of success
|
12
|
+
- now hiding success by default with off switch
|
13
|
+
- removed specific log specification from system tests, cleaned up log configuration to just default to evidence and refactoried the cli a small bit to support it.
|
14
|
+
- updated bundle and fixed new code quality error
|
15
|
+
|
1
16
|
#3.9.0-rc.3 (2013-08-19)
|
2
17
|
- added toggle for parts of html reports
|
3
18
|
- added a fix to allow jenkins ci server to show the html report images
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#ChemistryKit 3.9.0
|
1
|
+
#ChemistryKit 3.9.0 (2013-08-26)
|
2
2
|
|
3
3
|
[](http://badge.fury.io/rb/chemistrykit) [](https://travis-ci.org/jrobertfox/chef-broiler-platter) [](https://codeclimate.com/github/arrgyle/chemistrykit) [](https://coveralls.io/r/arrgyle/chemistrykit?branch=develop)
|
4
4
|
|
@@ -74,7 +74,11 @@ To exclude a tag, put a ~ in front of it.
|
|
74
74
|
During development it is often helpful to just run a specific beaker, this can be accomplished with the `--beakers` flag:
|
75
75
|
|
76
76
|
ckit brew --beakers=beakers/wip_beaker.rb
|
77
|
+
|
78
|
+
####Special Tags
|
79
|
+
There are some tags that can be used to control various aspects of the harness. The following are supported:
|
77
80
|
|
81
|
+
- `public: SOME_VALUE` - If you are running your harness against sauce labs, then you can control how the permissions are set for a particular beaker according to the visibility options detailed at the bottom of [this page](https://saucelabs.com/docs/additional-config). For example if you wanted a test to be private you could add `public: 'private'` to your beaker tags.
|
78
82
|
|
79
83
|
###Formula Loading
|
80
84
|
Code in the `formula` directory can be used to build out page objects and helper functions to facilitate your testing. The files are loaded in a particular way:
|
@@ -162,38 +166,41 @@ end
|
|
162
166
|
|
163
167
|
You can even nest them inside different describe/context blocks and they will get executed from the outside-in.
|
164
168
|
|
165
|
-
###
|
166
|
-
Each run of Chemistry Kit saves logging and test output to the _evidence_ directory
|
169
|
+
###Reporting and CI Integration
|
170
|
+
Each run of Chemistry Kit saves logging and test output to the _evidence_ directory. And in there will be the full set of JUnit XML files that may be consumed by your CI as well as a `final_results.html` report file with a full review of all the tests.
|
167
171
|
|
168
|
-
Assets generated by
|
172
|
+
Assets generated by Selenium (logs, screenshots, etc.) are stored in a subfolder with a name matching the describe block in your beaker, slugifyed like: `my_beaker_name`. This is to provide some organization but also allow the integration with jenkins using [this plugin](https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Attachments+Plugin).
|
169
173
|
|
170
174
|
##Configuration
|
171
175
|
ChemistryKit is configured by default with a `config.yaml` file that is created for you when you scaffold out a test harness. Relevant configuration options are detailed below:
|
172
176
|
|
173
|
-
|
177
|
+
###Basic Options
|
178
|
+
- `base_url:` The base url of your app, stored to the ENV for access in your beakers and formulas.
|
179
|
+
- `retries_on_failure:` Defaults to 1, set the number of times a test should be retried on failure
|
180
|
+
- `concurrency:` You may override the default concurrency of 1 to run the tests in parallel
|
174
181
|
|
175
|
-
`
|
182
|
+
- `screenshot_on_fail` By default false, set to true to download a screenshot of the failure (supported by sauce labs for now.)
|
176
183
|
|
177
|
-
|
184
|
+
###Selenium Connect Options
|
178
185
|
|
179
|
-
`
|
186
|
+
`selenium_connect:` Options under this node override the defaults for the [Selenium Connect](https://github.com/arrgyle/selenium-connect) gem. See that documentation for specifics.
|
180
187
|
|
181
|
-
|
188
|
+
###Basic Auth Options
|
189
|
+
`basic_auth:` Options under this node allow you to configure your test harness to authenticate prior to executing a test. This is helpful for testing against restricted development environments. The options include:
|
182
190
|
|
183
|
-
`
|
191
|
+
- `username:` The username to access your site with basic HTTP authentication.
|
192
|
+
- `password:` The password to access your site with basic HTTP authentication.
|
193
|
+
- `http_path:` An HTTP end-point loaded before each test run to cache the credentials for the test run.
|
194
|
+
- `https_path:` An HTTPS end-point loaded before each test run to cache the credentials for the test run.
|
184
195
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
`screenshot_on_fail` By default false, set to true to download a screenshot of the failure (supported by sauce labs for now.)
|
196
|
+
###Split Testing Options
|
197
|
+
`split_testing:` Currently ChemistryKit supports opting out of [Optimizely](https://www.optimizely.com/) A/B testing. The available options are:
|
189
198
|
|
190
|
-
`
|
199
|
+
- `provider:` Currently only `optimizely` is supported.
|
200
|
+
- `opt_out:` A value of `true` will opt you out of the A/B testing
|
191
201
|
|
192
|
-
`basic_auth: password:` The password to access your site with basic HTTP authentication
|
193
202
|
|
194
|
-
|
195
|
-
|
196
|
-
`basic_auth: https_path:` An HTTPS end-point loaded before each test run to cache the credentials for the test run
|
203
|
+
##Command Line Usage
|
197
204
|
|
198
205
|
###new
|
199
206
|
Creates a new ChemistryKit project.
|
@@ -215,7 +222,6 @@ Available options for the `brew` command:
|
|
215
222
|
-a, --all Run every beaker regardless of tag.
|
216
223
|
-b, --beakers [BEAKERS] Pass a list of beaker paths to be executed.
|
217
224
|
-c, --config [PATH] Pass the path to an alternative config.yaml file.
|
218
|
-
-r, --results_file [NAME] Specify the name of your results file.
|
219
225
|
--tag [TAGS] Specify a list of tags to run or exclude.
|
220
226
|
--params [HASH] Send a list of "key:value" parameters to the ENV.
|
221
227
|
-x, --retry [INT] How many times should a failing test be retried.
|
data/Rakefile
CHANGED
@@ -75,7 +75,7 @@ end
|
|
75
75
|
|
76
76
|
# TODO This could probably be more cleanly automated
|
77
77
|
desc 'Start a release (Requires Git Flow)'
|
78
|
-
task :release_start, :version do |t, args|
|
78
|
+
task :release_start, [:version, :no_verify] do |t, args|
|
79
79
|
version = args['version']
|
80
80
|
|
81
81
|
# make sure we have the latest stuff
|
@@ -90,7 +90,7 @@ task :release_start, :version do |t, args|
|
|
90
90
|
system 'git pull --no-edit origin develop'
|
91
91
|
|
92
92
|
# next assure all the tests run
|
93
|
-
task(:build_full).invoke
|
93
|
+
task(:build_full).invoke unless !!args['no_verify']
|
94
94
|
|
95
95
|
# start the release process
|
96
96
|
system "git flow release start #{version}"
|
data/chemistrykit.gemspec
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'chemistrykit'
|
5
|
-
s.version = '3.9.0
|
5
|
+
s.version = '3.9.0'
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.authors = ['Dave Haeffner', 'Jason Fox']
|
8
8
|
s.email = ['dave@arrgyle.com', 'jason@arrgyle.com']
|
9
9
|
s.homepage = 'https://github.com/arrgyle/chemistrykit'
|
10
10
|
s.summary = 'A simple and opinionated web testing framework for Selenium that follows convention over configuration.'
|
11
|
-
s.description = '
|
11
|
+
s.description = 'Improved reporting features and configuration for sauce permissions'
|
12
12
|
s.license = 'MIT'
|
13
13
|
|
14
14
|
s.files = `git ls-files`.split($/)
|
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_dependency 'builder', '~> 3.2.2'
|
25
25
|
s.add_dependency 'selenium-webdriver', '~> 2.29.0'
|
26
26
|
s.add_dependency 'rest-client', '~> 1.6.7'
|
27
|
-
s.add_dependency 'selenium-connect', '~> 3.
|
27
|
+
s.add_dependency 'selenium-connect', '~> 3.7.0'
|
28
28
|
s.add_dependency 'parallel_tests', '~> 0.15.0'
|
29
29
|
s.add_dependency 'parallel', '~> 0.7.0'
|
30
30
|
s.add_dependency 'rspec-retry', '~> 0.2.1'
|
data/features/brew.feature
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
@announce
|
1
2
|
Feature: Brewing a ChemistryKit project
|
2
3
|
|
3
4
|
Running ckit brew runs the suite of tests.
|
@@ -34,20 +35,18 @@ Feature: Brewing a ChemistryKit project
|
|
34
35
|
Given a file named "config.yaml" with:
|
35
36
|
"""
|
36
37
|
selenium_connect:
|
37
|
-
log: 'evidence'
|
38
38
|
host: 'localhost'
|
39
39
|
"""
|
40
40
|
When I run `ckit brew`
|
41
41
|
Then the stdout should contain "1 example, 0 failures"
|
42
42
|
And the following files should exist:
|
43
|
-
| evidence/
|
43
|
+
| evidence/junit_0.xml |
|
44
44
|
| evidence/bookie/bookie_loads_an_external_web_page/server.log |
|
45
45
|
|
46
46
|
Scenario: Brew a single beaker
|
47
47
|
Given a file named "config.yaml" with:
|
48
48
|
"""
|
49
49
|
selenium_connect:
|
50
|
-
log: 'evidence'
|
51
50
|
host: 'localhost'
|
52
51
|
"""
|
53
52
|
And a file named "beakers/other_beaker.rb" with:
|
@@ -67,7 +66,6 @@ Feature: Brewing a ChemistryKit project
|
|
67
66
|
Given a file named "config.yaml" with:
|
68
67
|
"""
|
69
68
|
selenium_connect:
|
70
|
-
log: 'evidence'
|
71
69
|
host: 'localhost'
|
72
70
|
"""
|
73
71
|
And a file named "beakers/other_beaker.rb" with:
|
@@ -88,7 +86,6 @@ Feature: Brewing a ChemistryKit project
|
|
88
86
|
"""
|
89
87
|
screenshot_on_fail: true
|
90
88
|
selenium_connect:
|
91
|
-
log: 'evidence'
|
92
89
|
host: 'saucelabs'
|
93
90
|
browser: 'iexplore'
|
94
91
|
os: 'windows 2003'
|
@@ -117,7 +114,6 @@ Feature: Brewing a ChemistryKit project
|
|
117
114
|
"""
|
118
115
|
retries_on_failure: 3
|
119
116
|
selenium_connect:
|
120
|
-
log: 'evidence'
|
121
117
|
host: 'localhost'
|
122
118
|
"""
|
123
119
|
And a file named "beakers/other_beaker.rb" with:
|
data/features/catalyst.feature
CHANGED
data/features/chemists.feature
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
@announce
|
1
2
|
Feature: Support for multiple configuration files
|
2
3
|
In order to quickly change between different configurations
|
3
4
|
As a chemistry kit harness developer
|
@@ -58,13 +59,11 @@ Feature: Support for multiple configuration files
|
|
58
59
|
And a file named "alternate.yaml" with:
|
59
60
|
"""
|
60
61
|
concurrency: 4
|
61
|
-
log:
|
62
|
-
path: 'evidence_alternate'
|
63
62
|
selenium_connect:
|
63
|
+
log: 'evidence_alternate'
|
64
64
|
host: 'localhost'
|
65
65
|
"""
|
66
66
|
When I run `ckit brew --config alternate.yaml`
|
67
67
|
Then the stdout should contain "1 example, 0 failures"
|
68
|
-
And there should be "1" unique results files in the "evidence_alternate" directory
|
69
68
|
And the following files should exist:
|
70
69
|
| evidence_alternate/cheese/cheese_loads_an_external_web_page/server.log |
|
data/features/reporting.feature
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
@announce
|
1
2
|
Feature: Advanced HTML Reports
|
2
3
|
In order to quickly know the status of the application
|
3
4
|
As a chemistry kit harness user
|
@@ -44,7 +45,6 @@ Feature: Advanced HTML Reports
|
|
44
45
|
"""
|
45
46
|
screenshot_on_fail: true
|
46
47
|
selenium_connect:
|
47
|
-
log: 'evidence'
|
48
48
|
browser: 'firefox'
|
49
49
|
"""
|
50
50
|
|
@@ -60,7 +60,6 @@ Feature: Advanced HTML Reports
|
|
60
60
|
concurrency: 2
|
61
61
|
screenshot_on_fail: true
|
62
62
|
selenium_connect:
|
63
|
-
log: 'evidence'
|
64
63
|
browser: 'chrome'
|
65
64
|
"""
|
66
65
|
When I run `ckit brew`
|
@@ -74,7 +73,6 @@ Feature: Advanced HTML Reports
|
|
74
73
|
concurrency: 2
|
75
74
|
screenshot_on_fail: true
|
76
75
|
selenium_connect:
|
77
|
-
log: 'evidence'
|
78
76
|
host: 'saucelabs'
|
79
77
|
browser: 'firefox'
|
80
78
|
sauce_username: 'testing_arrgyle'
|
@@ -100,3 +98,18 @@ Feature: Advanced HTML Reports
|
|
100
98
|
And the following files should exist:
|
101
99
|
| evidence/final_results.html |
|
102
100
|
|
101
|
+
Scenario: I capture the dom from all open windows
|
102
|
+
Given a file named "beakers/fifth_beaker.rb" with:
|
103
|
+
"""
|
104
|
+
describe "Reporting Beaker 5", :depth => 'shallow' do
|
105
|
+
it "loads two windows, from 5" do
|
106
|
+
@driver.get 'http://the-internet.herokuapp.com/windows'
|
107
|
+
@driver.find_element(css: '.example a').click
|
108
|
+
@driver.title.should include("Google")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
"""
|
112
|
+
When I run `ckit brew --beakers=beakers/fifth_beaker.rb`
|
113
|
+
And the following files should exist:
|
114
|
+
| evidence/final_results.html |
|
115
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
@announce
|
2
|
+
Feature: Sauce specific feature tests
|
3
|
+
|
4
|
+
Background:
|
5
|
+
Given I run `ckit new sauce-test`
|
6
|
+
And I cd to "sauce-test"
|
7
|
+
And a file named "beakers/first_beaker.rb" with:
|
8
|
+
"""
|
9
|
+
describe "Sauce Beaker", :depth => 'shallow' do
|
10
|
+
it "test" do
|
11
|
+
@driver.get "http://www.google.com"
|
12
|
+
@driver.title.should include("Google")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
"""
|
16
|
+
And I overwrite config.yaml with:
|
17
|
+
"""
|
18
|
+
screenshot_on_fail: true
|
19
|
+
selenium_connect:
|
20
|
+
host: 'saucelabs'
|
21
|
+
browser: 'firefox'
|
22
|
+
sauce_username: 'testing_arrgyle'
|
23
|
+
sauce_api_key: 'ab7a6e17-16df-42d2-9ef6-c8d2539cc38a'
|
24
|
+
sauce_opts:
|
25
|
+
public: 'private'
|
26
|
+
"""
|
27
|
+
|
28
|
+
Scenario: Default permission config should work
|
29
|
+
When I run `ckit brew`
|
30
|
+
Then the stdout should contain "1 example, 0 failures"
|
31
|
+
And the file "evidence/sauce_beaker/sauce_beaker_test/sauce_job.log" should contain "private"
|
32
|
+
|
33
|
+
Scenario: I can set a specific permission with a tag
|
34
|
+
Given I overwrite "beakers/first_beaker.rb" with:
|
35
|
+
"""
|
36
|
+
describe "Sauce Beaker", :depth => 'shallow', :public => 'share', :crazy => 'test_tag' do
|
37
|
+
it "test" do
|
38
|
+
@driver.get "http://www.google.com"
|
39
|
+
@driver.title.should include("Google")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
"""
|
43
|
+
When I run `ckit brew`
|
44
|
+
Then the stdout should contain "1 example, 0 failures"
|
45
|
+
And the file "evidence/sauce_beaker/sauce_beaker_test/sauce_job.log" should contain "share"
|
46
|
+
And the file "evidence/sauce_beaker/sauce_beaker_test/sauce_job.log" should contain "crazy:test_tag"
|
data/lib/chemistrykit/cli/cli.rb
CHANGED
@@ -50,7 +50,7 @@ module ChemistryKit
|
|
50
50
|
c.add_setting :used_tags
|
51
51
|
c.before(:suite) { ::RSpec.configuration.used_tags = [] }
|
52
52
|
c.around(:each) do |example|
|
53
|
-
standard_keys = [:example_group, :example_group_block, :description_args, :caller, :execution_result]
|
53
|
+
standard_keys = [:example_group, :example_group_block, :description_args, :caller, :execution_result, :full_description]
|
54
54
|
example.metadata.each do |key, value|
|
55
55
|
tag = "#{key}:#{value}" unless standard_keys.include?(key)
|
56
56
|
::RSpec.configuration.used_tags.push tag unless ::RSpec.configuration.used_tags.include?(tag) || tag.nil?
|
@@ -135,7 +135,6 @@ module ChemistryKit
|
|
135
135
|
|
136
136
|
def override_configs(options, config)
|
137
137
|
# TODO: expand this to allow for more overrides as needed
|
138
|
-
config.log.results_file = options['results_file'] if options['results_file']
|
139
138
|
config.retries_on_failure = options['retry'].to_i if options['retry']
|
140
139
|
config
|
141
140
|
end
|
@@ -197,6 +196,23 @@ module ChemistryKit
|
|
197
196
|
test_path = File.join(Dir.getwd, sc_config[:log])
|
198
197
|
Dir.mkdir test_path unless File.exists?(test_path)
|
199
198
|
|
199
|
+
# set the tags and permissions if sauce
|
200
|
+
if sc_config[:host] == 'saucelabs'
|
201
|
+
tags = example.metadata.reject do |key, value|
|
202
|
+
[:example_group, :example_group_block, :description_args, :caller, :execution_result, :full_description].include? key
|
203
|
+
end
|
204
|
+
sauce_opts = {}
|
205
|
+
sauce_opts.merge!(public: tags.delete(:public)) if tags.key?(:public)
|
206
|
+
sauce_opts.merge!(tags: tags.map { |key, value| "#{key}:#{value}"}) unless tags.empty?
|
207
|
+
|
208
|
+
if sc_config[:sauce_opts]
|
209
|
+
sc_config[:sauce_opts].merge!(sauce_opts) unless sauce_opts.empty?
|
210
|
+
else
|
211
|
+
sc_config[:sauce_opts] = sauce_opts unless sauce_opts.empty?
|
212
|
+
end
|
213
|
+
|
214
|
+
end
|
215
|
+
|
200
216
|
# configure and start sc
|
201
217
|
configuration = SeleniumConnect::Configuration.new sc_config
|
202
218
|
@sc = SeleniumConnect.start configuration
|
@@ -237,16 +253,16 @@ module ChemistryKit
|
|
237
253
|
|
238
254
|
html_log_name = options[:parallel] ? "results_#{options[:parallel]}.html" : 'results_0.html'
|
239
255
|
|
240
|
-
c.add_formatter(ChemistryKit::RSpec::HtmlFormatter, File.join(Dir.getwd, config.
|
241
|
-
# c.add_formatter(::RSpec::Core::Formatters::HtmlFormatter, File.join(Dir.getwd, config.log.path, html_log_name))
|
256
|
+
c.add_formatter(ChemistryKit::RSpec::HtmlFormatter, File.join(Dir.getwd, config.reporting.path, html_log_name))
|
242
257
|
|
243
258
|
# for rspec-retry
|
244
259
|
c.verbose_retry = true # for rspec-retry
|
245
260
|
c.default_retry_count = config.retries_on_failure
|
246
261
|
|
262
|
+
# TODO: this is messy... there should be a cleaner way to hook various reporter things.
|
247
263
|
if config.concurrency == 1 || options['parallel']
|
248
|
-
junit_log_name = options[:parallel] ? "junit_#{options[:parallel]}.xml" : '
|
249
|
-
c.add_formatter(ChemistryKit::RSpec::JUnitFormatter, File.join(Dir.getwd, config.
|
264
|
+
junit_log_name = options[:parallel] ? "junit_#{options[:parallel]}.xml" : 'junit_0.xml'
|
265
|
+
c.add_formatter(ChemistryKit::RSpec::JUnitFormatter, File.join(Dir.getwd, config.reporting.path, junit_log_name))
|
250
266
|
end
|
251
267
|
end
|
252
268
|
end
|
@@ -5,6 +5,7 @@ require 'ostruct'
|
|
5
5
|
|
6
6
|
require 'chemistrykit/config/basic_auth'
|
7
7
|
require 'chemistrykit/config/split_testing'
|
8
|
+
require 'chemistrykit/config/reporting'
|
8
9
|
|
9
10
|
module ChemistryKit
|
10
11
|
# Default configuration class
|
@@ -15,7 +16,7 @@ module ChemistryKit
|
|
15
16
|
:screenshot_on_fail,
|
16
17
|
:retries_on_failure
|
17
18
|
|
18
|
-
attr_reader :
|
19
|
+
attr_reader :reporting, :basic_auth, :split_testing
|
19
20
|
|
20
21
|
attr_writer :selenium_connect
|
21
22
|
|
@@ -25,10 +26,7 @@ module ChemistryKit
|
|
25
26
|
@retries_on_failure = 1
|
26
27
|
@selenium_connect = {}
|
27
28
|
@screenshot_on_fail = false
|
28
|
-
@
|
29
|
-
@log.path = 'evidence'
|
30
|
-
@log.results_file = 'results_junit.xml'
|
31
|
-
@log.format = 'ChemistryKit::RSpec::JUnitFormatter'
|
29
|
+
@reporting = ChemistryKit::Config::Reporting.new
|
32
30
|
@basic_auth = nil
|
33
31
|
@split_testing = nil
|
34
32
|
|
@@ -36,13 +34,6 @@ module ChemistryKit
|
|
36
34
|
populate_with_hash hash
|
37
35
|
end
|
38
36
|
|
39
|
-
def log=(log_hash)
|
40
|
-
log_hash.each do |key, value|
|
41
|
-
value = 'ChemistryKit::RSpec::JUnitFormatter' if key == :format && value =~ /junit/i
|
42
|
-
@log.send("#{key}=", value) unless value.nil?
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
37
|
def basic_auth=(basic_auth_hash)
|
47
38
|
@basic_auth = ChemistryKit::Config::BasicAuth.new(basic_auth_hash.merge(base_url: base_url))
|
48
39
|
end
|
@@ -54,7 +45,7 @@ module ChemistryKit
|
|
54
45
|
def selenium_connect
|
55
46
|
# return the default log unless the sc log is set
|
56
47
|
if @selenium_connect[:log].nil?
|
57
|
-
@selenium_connect[:log] = @
|
48
|
+
@selenium_connect[:log] = @reporting.path
|
58
49
|
return @selenium_connect
|
59
50
|
end
|
60
51
|
@selenium_connect
|
@@ -115,9 +115,14 @@ module ChemistryKit
|
|
115
115
|
end
|
116
116
|
doc.div(class: 'large-6 columns') do
|
117
117
|
doc.div(class: "#{type}-switch") do
|
118
|
-
|
118
|
+
opts = { onclick: "toggle#{type.capitalize}();", name: "switch-show-#{type}", type: 'radio' }
|
119
|
+
top = opts.merge(id: "show-#{type}")
|
120
|
+
bot = opts.merge(id: "show-#{type}1")
|
121
|
+
top.merge!(checked: 'checked') unless type == 'passing'
|
122
|
+
bot.merge!(checked: 'checked') if type == 'passing'
|
123
|
+
doc.input(top)
|
119
124
|
doc.label(for: "show-#{type}") { doc.text 'Hide' }
|
120
|
-
doc.input(
|
125
|
+
doc.input(bot)
|
121
126
|
doc.label(for: "show-#{type}1") { doc.text 'Show' }
|
122
127
|
doc.span
|
123
128
|
end
|
@@ -34,7 +34,8 @@ module ChemistryKit
|
|
34
34
|
|
35
35
|
def example_group_finished(example_group)
|
36
36
|
@output_html << build_fragment do |doc|
|
37
|
-
|
37
|
+
show = @example_group_status == 'passing' ? 'show' : ''
|
38
|
+
doc.div(class: "row example-group #{@example_group_status} #{show}") do
|
38
39
|
doc.div(class: 'large-12 columns') do
|
39
40
|
doc.h3 do
|
40
41
|
doc.i(class: 'icon-beaker')
|
@@ -99,13 +100,13 @@ module ChemistryKit
|
|
99
100
|
doc.div(class: 'row extra-content') do
|
100
101
|
doc.div(class: 'large-12 columns') do
|
101
102
|
doc.div(class: 'section-container auto', 'data-section' => '') do
|
103
|
+
doc << render_failshot_if_found(example)
|
102
104
|
doc << render_stack_trace(example)
|
103
105
|
doc << render_log_if_found(example, 'server.log')
|
104
106
|
doc << render_log_if_found(example, 'chromedriver.log')
|
105
107
|
doc << render_log_if_found(example, 'firefox.log')
|
106
108
|
doc << render_log_if_found(example, 'sauce_job.log')
|
107
109
|
doc << render_dom_html_if_found(example)
|
108
|
-
doc << render_failshot_if_found(example)
|
109
110
|
end
|
110
111
|
end
|
111
112
|
end
|
@@ -116,12 +117,18 @@ module ChemistryKit
|
|
116
117
|
# TODO: pull out the common code for checking if the log file exists
|
117
118
|
beaker_folder = slugify(@example_group.description)
|
118
119
|
example_folder = slugify(@example_group.description + '_' + example.description)
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
120
|
+
paths = Dir.glob(File.join(Dir.getwd, 'evidence', beaker_folder, example_folder, 'dom_*.html'))
|
121
|
+
number = 0
|
122
|
+
sections = ''
|
123
|
+
paths.each do |path|
|
124
|
+
if File.exist?(path)
|
125
|
+
sections << render_section("Dom HTML #{number}") do |doc|
|
126
|
+
doc << Pygments.highlight(File.read(path), lexer: 'html')
|
127
|
+
end
|
128
|
+
number += 1
|
123
129
|
end
|
124
130
|
end
|
131
|
+
sections
|
125
132
|
end
|
126
133
|
|
127
134
|
# TODO: replace the section id with a uuid or something....
|
@@ -190,7 +197,8 @@ module ChemistryKit
|
|
190
197
|
|
191
198
|
def render_example(status, example)
|
192
199
|
build_fragment do |doc|
|
193
|
-
|
200
|
+
show = status == 'passing' ? 'hide' : ''
|
201
|
+
doc.div(class: "row example #{status} #{show}") do
|
194
202
|
doc.div(class: 'large-12 columns') do
|
195
203
|
doc.div(class: 'row example-heading') do
|
196
204
|
doc.div(class: 'large-9 columns') do
|
data/spec/support/config.yaml
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'chemistrykit/config/reporting'
|
5
|
+
|
6
|
+
describe ChemistryKit::Config::Reporting do
|
7
|
+
|
8
|
+
VALID_REPORTS_PATH = 'evidence'
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
@reporting = ChemistryKit::Config::Reporting.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should be initialized with no arguments' do
|
15
|
+
@reporting.should be_an_instance_of ChemistryKit::Config::Reporting
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should return "evidence" for the log path' do
|
19
|
+
@reporting.path.should eq VALID_REPORTS_PATH
|
20
|
+
end
|
21
|
+
end
|
@@ -9,19 +9,14 @@ describe ChemistryKit::Configuration do
|
|
9
9
|
VALID_CONCURRENCY = 1
|
10
10
|
VALID_RETRIES_ON_FAILURE = 1
|
11
11
|
VALID_CONFIG_FILE = 'config.yaml'
|
12
|
-
|
13
|
-
VALID_JUNIT = 'results_junit.xml'
|
14
|
-
VALID_FORMAT_JUNIT = 'junit'
|
15
|
-
VALID_JUNIT_FORMAT_OUT = 'ChemistryKit::RSpec::JUnitFormatter'
|
12
|
+
VALID_REPORTING_PATH = 'evidence'
|
16
13
|
|
17
14
|
before(:each) do
|
18
15
|
@valid_selenium_connect_hash = { log: 'evidence', host: 'localhost' }
|
19
|
-
@valid_log_hash = { path: VALID_LOG_PATH, results_file: VALID_JUNIT, format: VALID_FORMAT_JUNIT }
|
20
16
|
@valid_config_hash = {
|
21
17
|
base_url: VALID_BASE_URL,
|
22
18
|
concurrency: VALID_CONCURRENCY,
|
23
19
|
selenium_connect: @valid_selenium_connect_hash,
|
24
|
-
log: @valid_log_hash,
|
25
20
|
retries_on_failure: VALID_RETRIES_ON_FAILURE
|
26
21
|
}
|
27
22
|
end
|
@@ -32,10 +27,8 @@ describe ChemistryKit::Configuration do
|
|
32
27
|
config.retries_on_failure.should eq VALID_RETRIES_ON_FAILURE
|
33
28
|
config.base_url.should eq VALID_BASE_URL
|
34
29
|
|
35
|
-
#
|
36
|
-
config.
|
37
|
-
config.log.results_file.should eq VALID_JUNIT
|
38
|
-
config.log.format.should eq VALID_JUNIT_FORMAT_OUT
|
30
|
+
# reporting configurations
|
31
|
+
config.reporting.path.should eq VALID_REPORTING_PATH
|
39
32
|
|
40
33
|
# selenium connect configurations
|
41
34
|
config.selenium_connect.should eq @valid_selenium_connect_hash
|
@@ -49,10 +42,8 @@ describe ChemistryKit::Configuration do
|
|
49
42
|
config = ChemistryKit::Configuration.new({})
|
50
43
|
config.concurrency.should eq VALID_CONCURRENCY
|
51
44
|
config.retries_on_failure.should eq VALID_RETRIES_ON_FAILURE
|
52
|
-
config.
|
53
|
-
config.
|
54
|
-
config.log.format.should eq VALID_JUNIT_FORMAT_OUT
|
55
|
-
config.selenium_connect.should eq({ log: VALID_LOG_PATH })
|
45
|
+
config.reporting.path.should eq VALID_REPORTING_PATH
|
46
|
+
config.selenium_connect.should eq({ log: VALID_REPORTING_PATH })
|
56
47
|
config.basic_auth.should be_nil
|
57
48
|
config.split_testing.should be_nil
|
58
49
|
end
|
@@ -72,18 +63,13 @@ describe ChemistryKit::Configuration do
|
|
72
63
|
end.to raise_error ArgumentError, 'The config key: "bad" is unknown!'
|
73
64
|
end
|
74
65
|
|
75
|
-
it 'should correct the format to JUnit' do
|
76
|
-
config = ChemistryKit::Configuration.new(@valid_config_hash)
|
77
|
-
config.log.format.should eq VALID_JUNIT_FORMAT_OUT
|
78
|
-
end
|
79
|
-
|
80
66
|
it 'selenium_connect log should default to the main log' do
|
81
|
-
config = ChemistryKit::Configuration.new({
|
82
|
-
config.selenium_connect.should eq({ log:
|
67
|
+
config = ChemistryKit::Configuration.new({})
|
68
|
+
config.selenium_connect.should eq({ log: VALID_REPORTING_PATH })
|
83
69
|
end
|
84
70
|
|
85
71
|
it 'mainlog should not overide selenium_connect log' do
|
86
|
-
config = ChemistryKit::Configuration.new
|
72
|
+
config = ChemistryKit::Configuration.new selenium_connect: { log: 'sc-log' }
|
87
73
|
config.selenium_connect.should eq({ log: 'sc-log' })
|
88
74
|
end
|
89
75
|
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chemistrykit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.9.0
|
5
|
-
prerelease:
|
4
|
+
version: 3.9.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Dave Haeffner
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-08-
|
13
|
+
date: 2013-08-26 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: thor
|
@@ -99,7 +99,7 @@ dependencies:
|
|
99
99
|
requirements:
|
100
100
|
- - ~>
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: 3.
|
102
|
+
version: 3.7.0
|
103
103
|
type: :runtime
|
104
104
|
prerelease: false
|
105
105
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -107,7 +107,7 @@ dependencies:
|
|
107
107
|
requirements:
|
108
108
|
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 3.
|
110
|
+
version: 3.7.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: parallel_tests
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -204,7 +204,7 @@ dependencies:
|
|
204
204
|
- - ~>
|
205
205
|
- !ruby/object:Gem::Version
|
206
206
|
version: 0.5.2
|
207
|
-
description:
|
207
|
+
description: Improved reporting features and configuration for sauce permissions
|
208
208
|
email:
|
209
209
|
- dave@arrgyle.com
|
210
210
|
- jason@arrgyle.com
|
@@ -239,10 +239,10 @@ files:
|
|
239
239
|
- features/exit_status.feature
|
240
240
|
- features/global-config.feature
|
241
241
|
- features/load_page_objects.feature
|
242
|
-
- features/logging.feature
|
243
242
|
- features/multi-config.feature
|
244
243
|
- features/new.feature
|
245
244
|
- features/reporting.feature
|
245
|
+
- features/sauce.feature
|
246
246
|
- features/split_testing.feature
|
247
247
|
- features/step_definitions/steps.rb
|
248
248
|
- features/support/env.rb
|
@@ -257,6 +257,7 @@ files:
|
|
257
257
|
- lib/chemistrykit/cli/helpers/formula_loader.rb
|
258
258
|
- lib/chemistrykit/cli/new.rb
|
259
259
|
- lib/chemistrykit/config/basic_auth.rb
|
260
|
+
- lib/chemistrykit/config/reporting.rb
|
260
261
|
- lib/chemistrykit/config/split_testing.rb
|
261
262
|
- lib/chemistrykit/configuration.rb
|
262
263
|
- lib/chemistrykit/formula/base.rb
|
@@ -323,6 +324,7 @@ files:
|
|
323
324
|
- spec/unit/lib/chemistrykit/chemist_spec.rb
|
324
325
|
- spec/unit/lib/chemistrykit/cli/helpers/formula_loader_spec.rb
|
325
326
|
- spec/unit/lib/chemistrykit/config/basic_auth_spec.rb
|
327
|
+
- spec/unit/lib/chemistrykit/config/reporting_spec.rb
|
326
328
|
- spec/unit/lib/chemistrykit/config/split_testing_spec.rb
|
327
329
|
- spec/unit/lib/chemistrykit/configuration_spec.rb
|
328
330
|
- spec/unit/lib/chemistrykit/formula/base_spec.rb
|
@@ -347,9 +349,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
347
349
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
348
350
|
none: false
|
349
351
|
requirements:
|
350
|
-
- - ! '
|
352
|
+
- - ! '>='
|
351
353
|
- !ruby/object:Gem::Version
|
352
|
-
version:
|
354
|
+
version: '0'
|
355
|
+
segments:
|
356
|
+
- 0
|
357
|
+
hash: -3683118535885590803
|
353
358
|
requirements: []
|
354
359
|
rubyforge_project:
|
355
360
|
rubygems_version: 1.8.25
|
@@ -366,10 +371,10 @@ test_files:
|
|
366
371
|
- features/exit_status.feature
|
367
372
|
- features/global-config.feature
|
368
373
|
- features/load_page_objects.feature
|
369
|
-
- features/logging.feature
|
370
374
|
- features/multi-config.feature
|
371
375
|
- features/new.feature
|
372
376
|
- features/reporting.feature
|
377
|
+
- features/sauce.feature
|
373
378
|
- features/split_testing.feature
|
374
379
|
- features/step_definitions/steps.rb
|
375
380
|
- features/support/env.rb
|
@@ -395,6 +400,7 @@ test_files:
|
|
395
400
|
- spec/unit/lib/chemistrykit/chemist_spec.rb
|
396
401
|
- spec/unit/lib/chemistrykit/cli/helpers/formula_loader_spec.rb
|
397
402
|
- spec/unit/lib/chemistrykit/config/basic_auth_spec.rb
|
403
|
+
- spec/unit/lib/chemistrykit/config/reporting_spec.rb
|
398
404
|
- spec/unit/lib/chemistrykit/config/split_testing_spec.rb
|
399
405
|
- spec/unit/lib/chemistrykit/configuration_spec.rb
|
400
406
|
- spec/unit/lib/chemistrykit/formula/base_spec.rb
|
data/features/logging.feature
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
#logging.feature
|
2
|
-
|
3
|
-
## NOTE Pending until after release candidate
|
4
|
-
|
5
|
-
# Feature: Log handling
|
6
|
-
# In order to examine the results of my test suite
|
7
|
-
# As a test harness user
|
8
|
-
# I want to see all of the logs in a central location
|
9
|
-
|
10
|
-
# Background: Setup the project
|
11
|
-
# Given I run `ckit new logging-test`
|
12
|
-
# And I cd to "logging-test"
|
13
|
-
# And a file named "formulas/bookie.rb" with:
|
14
|
-
# """
|
15
|
-
# module Formulas
|
16
|
-
# class Bookie < Formula
|
17
|
-
# def open(url)
|
18
|
-
# @driver.get url
|
19
|
-
# end
|
20
|
-
# end
|
21
|
-
# end
|
22
|
-
# """
|
23
|
-
# And a file named "beakers/first_beaker.rb" with:
|
24
|
-
# """
|
25
|
-
# describe "First", :depth => 'shallow' do
|
26
|
-
# let(:book) { Formulas::Bookie.new(@driver) }
|
27
|
-
|
28
|
-
# it "loads an external web page" do
|
29
|
-
# book.open "http://www.google.com"
|
30
|
-
# end
|
31
|
-
# end
|
32
|
-
# """
|
33
|
-
# And a file named "beakers/second_beaker.rb" with:
|
34
|
-
# """
|
35
|
-
# describe "Second", :depth => 'shallow' do
|
36
|
-
# let(:book) { Formulas::Bookie.new(@driver) }
|
37
|
-
|
38
|
-
# it "loads an external web page" do
|
39
|
-
# book.open "http://www.google.com"
|
40
|
-
# end
|
41
|
-
# end
|
42
|
-
# """
|
43
|
-
|
44
|
-
# Scenario: I can output junit xml results by default
|
45
|
-
# When I run `ckit brew`
|
46
|
-
# Then the stdout should contain "2 examples, 0 failures"
|
47
|
-
# And the following files should exist:
|
48
|
-
# | evidence/results_junit.xml |
|
49
|
-
|
50
|
-
# Scenario: I can output custom junit xml results
|
51
|
-
# Given a file named "config.yaml" with:
|
52
|
-
# """
|
53
|
-
# log:
|
54
|
-
# path: 'my_evidence'
|
55
|
-
# results_file: 'my_results.xml'
|
56
|
-
# format: 'junit'
|
57
|
-
# selenium_connect:
|
58
|
-
# log: 'evidence'
|
59
|
-
# host: 'localhost'
|
60
|
-
# """
|
61
|
-
# When I run `ckit brew`
|
62
|
-
# Then the stdout should contain "2 examples, 0 failures"
|
63
|
-
# And the following files should exist:
|
64
|
-
# | my_evidence/my_results.xml |
|
65
|
-
|
66
|
-
# Scenario: I can output html results
|
67
|
-
# Given a file named "config.yaml" with:
|
68
|
-
# """
|
69
|
-
# log:
|
70
|
-
# results_file: 'report.html'
|
71
|
-
# format: 'html'
|
72
|
-
# """
|
73
|
-
# And I run `ckit brew`
|
74
|
-
# Then the stdout should contain "2 examples, 0 failures"
|
75
|
-
# And the following files should exist:
|
76
|
-
# | evidence/report.html |
|
77
|
-
|
78
|
-
# Scenario: I define one log location to rule them all
|
79
|
-
# Given a file named "config.yaml" with:
|
80
|
-
# """
|
81
|
-
# log:
|
82
|
-
# path: 'my_evidence'
|
83
|
-
# selenium_connect:
|
84
|
-
# host: 'localhost'
|
85
|
-
# """
|
86
|
-
# When I run `ckit brew`
|
87
|
-
# Then the stdout should contain "2 examples, 0 failures"
|
88
|
-
# And the following files should exist:
|
89
|
-
# | my_evidence/results_junit.xml |
|
90
|
-
# | my_evidence/first/first_loads_an_external_web_page/server.log |
|
91
|
-
# | my_evidence/second/second_loads_an_external_web_page/server.log |
|
92
|
-
|
93
|
-
# Scenario: I can runtime override the results output file name
|
94
|
-
# When I run `ckit brew --results_file results_junit_01.xml`
|
95
|
-
# Then the stdout should contain "2 examples, 0 failures"
|
96
|
-
# And the following files should exist:
|
97
|
-
# | evidence/results_junit_01.xml |
|
98
|
-
|