ndr_dev_support 5.5.0 → 5.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +21 -0
- data/code_safety.yml +11 -7
- data/lib/minitest/rake_ci_plugin.rb +47 -7
- data/lib/ndr_dev_support/integration_testing.rb +3 -0
- data/lib/ndr_dev_support/integration_testing/flakey_tests.rb +55 -0
- data/lib/ndr_dev_support/version.rb +1 -1
- data/lib/tasks/ci/redmine.rake +3 -2
- data/ndr_dev_support.gemspec +1 -1
- metadata +17 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e945839e116f3076fe950ec01ddeb9a9442bfc1bf2132460bf5d2a15d983d362
|
4
|
+
data.tar.gz: a39d1a0b73260aa8c45ccd48e6f3c1478ac1db86a18952084b0d35bfa2b7c8a3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2052481ce02c0fcb3947778df3132a2ce76d2848f8748970494a490926fcb8764275e953ab1f3169710325a774087deeb901bd70c676cc0b2bd1380945fb0610
|
7
|
+
data.tar.gz: 0a97dd68a18fbbc247a618f9c4fe23b3d66552c8971dba5dd54380f9c019d466c5cccea02bf5b498577ea8230723d95e7f36753c19c1b42556184c79ab7bc571
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
*no unreleased changes*
|
3
3
|
|
4
|
+
## 5.6.0 / 2020-02-14
|
5
|
+
### Added
|
6
|
+
* Add `flakey_test` to the minitest DSL, to allow sporadic failures to be retried
|
7
|
+
* CI: include minitest seed in slack output
|
8
|
+
|
4
9
|
## 5.5.0 / 2020-01-27
|
10
|
+
### Added
|
5
11
|
* bundle master RuboCop config, and allow it to be `required`
|
6
12
|
|
7
13
|
## 5.4.8 / 2020-01-24
|
data/README.md
CHANGED
@@ -135,6 +135,27 @@ Beyond standard Capybara testing DSL, ndr_dev_support bundles some additional fu
|
|
135
135
|
|
136
136
|
When using a headless browser for integration tests, the test database must be consistent between the test runner and the application being tested. With transactional tests in operation, this means that both must share a connection. It is up to the individual project to provide this facility; as of Rails 5.1, it is built in to the framework directly.
|
137
137
|
|
138
|
+
#### Flakey Tests
|
139
|
+
|
140
|
+
It is an unfortunate reality that sometimes tests are written that will fail sporadically. Whilst in such cases the test methodology should be addressed, investigations can be time-consuming.
|
141
|
+
Therefore, `ndr_dev_support` grudgingly provides "flakey test" support, to minimise disruption to CI pipelines whilst root causes are investigated.
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
test 'thing that always passes' do
|
145
|
+
# reliable test
|
146
|
+
end
|
147
|
+
|
148
|
+
flakey_test 'thing that occassionally needs a second or third attempt' do
|
149
|
+
# less reliable test
|
150
|
+
end
|
151
|
+
|
152
|
+
flakey_test 'thing that often needs multiple attempts', attempts: 10 do
|
153
|
+
# really unreliable test (gulp...)
|
154
|
+
end
|
155
|
+
```
|
156
|
+
|
157
|
+
If tests still fail, they'll fail as normal. If tests pass after flakey failure, they'll be flagged to the RakeCI server, and rendered in purple on Slack.
|
158
|
+
|
138
159
|
### Deployment support
|
139
160
|
|
140
161
|
There are various capistrano plugins in the `ndr_dev_support/capistrano` directory - see each one for details.
|
data/code_safety.yml
CHANGED
@@ -19,7 +19,7 @@ file safety:
|
|
19
19
|
CHANGELOG.md:
|
20
20
|
comments:
|
21
21
|
reviewed_by: josh.pencheon
|
22
|
-
safe_revision:
|
22
|
+
safe_revision: 8995f6ed25fa308e541c3d33396b0a30c4f4db80
|
23
23
|
CODE_OF_CONDUCT.md:
|
24
24
|
comments:
|
25
25
|
reviewed_by: timgentry
|
@@ -35,7 +35,7 @@ file safety:
|
|
35
35
|
README.md:
|
36
36
|
comments:
|
37
37
|
reviewed_by: josh.pencheon
|
38
|
-
safe_revision:
|
38
|
+
safe_revision: a2f178853da640112cf3063ca1d640157c9edb9f
|
39
39
|
Rakefile:
|
40
40
|
comments:
|
41
41
|
reviewed_by: josh.pencheon
|
@@ -67,7 +67,7 @@ file safety:
|
|
67
67
|
lib/minitest/rake_ci_plugin.rb:
|
68
68
|
comments:
|
69
69
|
reviewed_by: josh.pencheon
|
70
|
-
safe_revision:
|
70
|
+
safe_revision: 958ef09c5cf50bb50348e6bff949e3e5989254f9
|
71
71
|
lib/ndr_dev_support.rb:
|
72
72
|
comments:
|
73
73
|
reviewed_by: josh.pencheon
|
@@ -115,7 +115,7 @@ file safety:
|
|
115
115
|
lib/ndr_dev_support/integration_testing.rb:
|
116
116
|
comments:
|
117
117
|
reviewed_by: josh.pencheon
|
118
|
-
safe_revision:
|
118
|
+
safe_revision: a2f178853da640112cf3063ca1d640157c9edb9f
|
119
119
|
lib/ndr_dev_support/integration_testing/drivers/chrome.rb:
|
120
120
|
comments:
|
121
121
|
reviewed_by: josh.pencheon
|
@@ -140,6 +140,10 @@ file safety:
|
|
140
140
|
comments:
|
141
141
|
reviewed_by: josh.pencheon
|
142
142
|
safe_revision: f1a32b1f2d1851b87a883dbf8620aa0e921e436c
|
143
|
+
lib/ndr_dev_support/integration_testing/flakey_tests.rb:
|
144
|
+
comments:
|
145
|
+
reviewed_by: josh.pencheon
|
146
|
+
safe_revision: a2f178853da640112cf3063ca1d640157c9edb9f
|
143
147
|
lib/ndr_dev_support/rake_ci/brakeman_helper.rb:
|
144
148
|
comments:
|
145
149
|
reviewed_by: josh.pencheon
|
@@ -211,7 +215,7 @@ file safety:
|
|
211
215
|
lib/ndr_dev_support/version.rb:
|
212
216
|
comments:
|
213
217
|
reviewed_by: josh.pencheon
|
214
|
-
safe_revision:
|
218
|
+
safe_revision: 8995f6ed25fa308e541c3d33396b0a30c4f4db80
|
215
219
|
lib/tasks/audit_code.rake:
|
216
220
|
comments: Identical to the version reviewed by josh.pencheon when contained within
|
217
221
|
ndr_support
|
@@ -256,7 +260,7 @@ file safety:
|
|
256
260
|
lib/tasks/ci/redmine.rake:
|
257
261
|
comments:
|
258
262
|
reviewed_by: josh.pencheon
|
259
|
-
safe_revision:
|
263
|
+
safe_revision: 958ef09c5cf50bb50348e6bff949e3e5989254f9
|
260
264
|
lib/tasks/ci/rugged.rake:
|
261
265
|
comments:
|
262
266
|
reviewed_by: josh.pencheon
|
@@ -284,7 +288,7 @@ file safety:
|
|
284
288
|
ndr_dev_support.gemspec:
|
285
289
|
comments:
|
286
290
|
reviewed_by: josh.pencheon
|
287
|
-
safe_revision:
|
291
|
+
safe_revision: a2f178853da640112cf3063ca1d640157c9edb9f
|
288
292
|
test/daemon/ci_server_test.rb:
|
289
293
|
comments:
|
290
294
|
reviewed_by: josh.pencheon
|
@@ -5,12 +5,35 @@ require 'ndr_dev_support/rake_ci/concerns/commit_metadata_persistable'
|
|
5
5
|
|
6
6
|
# The plugin needs to extend Minitest
|
7
7
|
module Minitest
|
8
|
-
def self.plugin_rake_ci_init(
|
9
|
-
reporter << RakeCIReporter.new if RakeCIReporter.enabled?
|
8
|
+
def self.plugin_rake_ci_init(options)
|
9
|
+
reporter << RakeCIReporter.new(options[:io], options) if RakeCIReporter.enabled?
|
10
|
+
end
|
11
|
+
|
12
|
+
# Intermediate Reporter than can also track flakey failures
|
13
|
+
class FlakeyStatisticsReporter < StatisticsReporter
|
14
|
+
attr_accessor :flakey_results
|
15
|
+
|
16
|
+
def initialize(*)
|
17
|
+
super
|
18
|
+
|
19
|
+
self.flakey_results = []
|
20
|
+
end
|
21
|
+
|
22
|
+
def record(result)
|
23
|
+
super
|
24
|
+
|
25
|
+
return unless result.respond_to?(:flakes)
|
26
|
+
|
27
|
+
flakey_results << result if result.flakes.any?
|
28
|
+
end
|
29
|
+
|
30
|
+
def flakes
|
31
|
+
flakey_results.sum { |result| result.flakes.length }
|
32
|
+
end
|
10
33
|
end
|
11
34
|
|
12
35
|
# RakeCI Minitest Reporter
|
13
|
-
class RakeCIReporter <
|
36
|
+
class RakeCIReporter < FlakeyStatisticsReporter
|
14
37
|
def self.enable!
|
15
38
|
@enabled = true
|
16
39
|
end
|
@@ -55,6 +78,10 @@ module Minitest
|
|
55
78
|
snippets_for results.reject(&:skipped?).reject(&:error?)
|
56
79
|
end
|
57
80
|
|
81
|
+
def flake_snippets
|
82
|
+
snippets_for flakey_results
|
83
|
+
end
|
84
|
+
|
58
85
|
# Adapted from Rails' TestUnit reporter
|
59
86
|
def snippets_for(results, limit = 5)
|
60
87
|
executable = defined?(Rails) ? 'bin/rails test ' : 'bundle exec rake test TEST='
|
@@ -78,7 +105,7 @@ module Minitest
|
|
78
105
|
def current_statistics
|
79
106
|
@current_statistics ||= {
|
80
107
|
total_time: total_time, runs: count, assertions: assertions, failures: failures,
|
81
|
-
errors: errors, skips: skips
|
108
|
+
errors: errors, skips: skips, flakes: flakes
|
82
109
|
}
|
83
110
|
end
|
84
111
|
|
@@ -106,6 +133,7 @@ module Minitest
|
|
106
133
|
@current_attachments << failures_attachment if failures.positive?
|
107
134
|
@current_attachments << errors_attachment if errors.positive?
|
108
135
|
@current_attachments << pass_attachment if passing?
|
136
|
+
@current_attachments << flakes_attachment if flakes.positive?
|
109
137
|
@current_attachments
|
110
138
|
end
|
111
139
|
|
@@ -113,7 +141,15 @@ module Minitest
|
|
113
141
|
{
|
114
142
|
color: 'danger',
|
115
143
|
text: 'test failure'.pluralize(failures) + failure_snippets,
|
116
|
-
footer:
|
144
|
+
footer: footer
|
145
|
+
}
|
146
|
+
end
|
147
|
+
|
148
|
+
def flakes_attachment
|
149
|
+
{
|
150
|
+
color: '#bb44ff',
|
151
|
+
text: 'flakey test'.pluralize(flakes) + flake_snippets,
|
152
|
+
footer: footer
|
117
153
|
}
|
118
154
|
end
|
119
155
|
|
@@ -121,7 +157,7 @@ module Minitest
|
|
121
157
|
{
|
122
158
|
color: 'warning',
|
123
159
|
text: 'test error'.pluralize(errors) + error_snippets,
|
124
|
-
footer:
|
160
|
+
footer: footer
|
125
161
|
}
|
126
162
|
end
|
127
163
|
|
@@ -129,7 +165,7 @@ module Minitest
|
|
129
165
|
{
|
130
166
|
color: 'good',
|
131
167
|
text: newly_passing? ? 'Tests now pass! :tada:' : 'Tests passed',
|
132
|
-
footer:
|
168
|
+
footer: footer
|
133
169
|
}
|
134
170
|
end
|
135
171
|
|
@@ -150,5 +186,9 @@ module Minitest
|
|
150
186
|
def name
|
151
187
|
'minitest'
|
152
188
|
end
|
189
|
+
|
190
|
+
def footer
|
191
|
+
"bundle exec rake ci:minitest --seed #{options[:seed]}"
|
192
|
+
end
|
153
193
|
end
|
154
194
|
end
|
@@ -18,6 +18,9 @@ end
|
|
18
18
|
# Include our custom DSL extensions, that also cover screenshotting:
|
19
19
|
require 'ndr_dev_support/integration_testing/dsl'
|
20
20
|
|
21
|
+
# Include support for retrying tests that sporadically fail:
|
22
|
+
require 'ndr_dev_support/integration_testing/flakey_tests'
|
23
|
+
|
21
24
|
# Keeps the selenium webdrivers automatically updated:
|
22
25
|
require 'webdrivers'
|
23
26
|
Webdrivers.cache_time = 24.hours
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module NdrDevSupport
|
2
|
+
module IntegrationTesting
|
3
|
+
# Grudging handling of flakey integration tests. Allows tests to be declared
|
4
|
+
# with `flakey_test`. Our CI reporter gathers information on flakey failures.
|
5
|
+
module FlakeyTests
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
class_attribute :attempts_per_test, default: {}
|
10
|
+
end
|
11
|
+
|
12
|
+
class_methods do
|
13
|
+
def flakey_test(description, attempts: 3, &block)
|
14
|
+
test(description, &block).tap do |test_name|
|
15
|
+
self.attempts_per_test = attempts_per_test.merge(test_name.to_s => attempts)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def flakes
|
21
|
+
@flakes ||= []
|
22
|
+
end
|
23
|
+
|
24
|
+
def run
|
25
|
+
attempts_remaining = attempts_per_test[name]
|
26
|
+
return super unless attempts_remaining
|
27
|
+
|
28
|
+
previous_failure = failures.last
|
29
|
+
failed_attempts = []
|
30
|
+
|
31
|
+
loop do
|
32
|
+
break if attempts_remaining < 1
|
33
|
+
|
34
|
+
super
|
35
|
+
|
36
|
+
# No failure was added; we passed!
|
37
|
+
break if failures.last == previous_failure
|
38
|
+
|
39
|
+
# Ran out of attempts:
|
40
|
+
break if (attempts_remaining -= 1) < 1
|
41
|
+
|
42
|
+
# Loop round and have another go:
|
43
|
+
failed_attempts << failures.pop
|
44
|
+
end
|
45
|
+
|
46
|
+
# Attempts were only flakey if we eventually passed:
|
47
|
+
flakes.concat(failed_attempts) if failures.last == previous_failure
|
48
|
+
|
49
|
+
self
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
ActionDispatch::IntegrationTest.include(NdrDevSupport::IntegrationTesting::FlakeyTests)
|
data/lib/tasks/ci/redmine.rake
CHANGED
@@ -41,7 +41,8 @@ namespace :ci do
|
|
41
41
|
resolved_tickets.map! { |ticket_id| "https://#{hostname}/issues/#{ticket_id}" }
|
42
42
|
|
43
43
|
old_attachment = @attachments.detect { |att| att[:text] =~ /Tests( now)? pass/ }
|
44
|
-
basic_text
|
44
|
+
basic_text = old_attachment.try(:[], :text) || 'Tests passed'
|
45
|
+
footer = old_attachment.try(:[], :footer) || 'bundle exec rake ci:minitest'
|
45
46
|
|
46
47
|
@attachments.delete(old_attachment) if old_attachment
|
47
48
|
|
@@ -51,7 +52,7 @@ namespace :ci do
|
|
51
52
|
title: "#{issue_s.capitalize} Resolved",
|
52
53
|
text: "#{basic_text}, so #{issue_s} #{resolved_tickets.join(', ')}" \
|
53
54
|
" #{resolved_tickets.count == 1 ? 'has' : 'have'} been resolved",
|
54
|
-
footer:
|
55
|
+
footer: footer,
|
55
56
|
mrkdwn_in: ['text']
|
56
57
|
}
|
57
58
|
@attachments << attachment
|
data/ndr_dev_support.gemspec
CHANGED
@@ -36,6 +36,7 @@ Gem::Specification.new do |spec|
|
|
36
36
|
# Integration test dependencies:
|
37
37
|
spec.add_dependency 'capybara', '>= 3.20'
|
38
38
|
spec.add_dependency 'capybara-screenshot'
|
39
|
+
spec.add_dependency 'minitest', '~> 5.0'
|
39
40
|
spec.add_dependency 'poltergeist', '>= 1.8.0'
|
40
41
|
spec.add_dependency 'selenium-webdriver'
|
41
42
|
spec.add_dependency 'show_me_the_cookies'
|
@@ -55,7 +56,6 @@ Gem::Specification.new do |spec|
|
|
55
56
|
spec.add_dependency 'capistrano', '~> 2.15'
|
56
57
|
|
57
58
|
spec.add_development_dependency 'bundler'
|
58
|
-
spec.add_development_dependency 'minitest', '~> 5.0'
|
59
59
|
spec.add_development_dependency 'mocha'
|
60
60
|
spec.add_development_dependency 'rake', '~> 10.0'
|
61
61
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ndr_dev_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NCRS Development Team
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: minitest
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '5.0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '5.0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: poltergeist
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -332,20 +346,6 @@ dependencies:
|
|
332
346
|
- - ">="
|
333
347
|
- !ruby/object:Gem::Version
|
334
348
|
version: '0'
|
335
|
-
- !ruby/object:Gem::Dependency
|
336
|
-
name: minitest
|
337
|
-
requirement: !ruby/object:Gem::Requirement
|
338
|
-
requirements:
|
339
|
-
- - "~>"
|
340
|
-
- !ruby/object:Gem::Version
|
341
|
-
version: '5.0'
|
342
|
-
type: :development
|
343
|
-
prerelease: false
|
344
|
-
version_requirements: !ruby/object:Gem::Requirement
|
345
|
-
requirements:
|
346
|
-
- - "~>"
|
347
|
-
- !ruby/object:Gem::Version
|
348
|
-
version: '5.0'
|
349
349
|
- !ruby/object:Gem::Dependency
|
350
350
|
name: mocha
|
351
351
|
requirement: !ruby/object:Gem::Requirement
|
@@ -415,6 +415,7 @@ files:
|
|
415
415
|
- lib/ndr_dev_support/integration_testing/drivers/poltergeist.rb
|
416
416
|
- lib/ndr_dev_support/integration_testing/drivers/switchable.rb
|
417
417
|
- lib/ndr_dev_support/integration_testing/dsl.rb
|
418
|
+
- lib/ndr_dev_support/integration_testing/flakey_tests.rb
|
418
419
|
- lib/ndr_dev_support/rake_ci/brakeman_helper.rb
|
419
420
|
- lib/ndr_dev_support/rake_ci/commit_cop.rb
|
420
421
|
- lib/ndr_dev_support/rake_ci/commit_cop/concerns/deputisable.rb
|