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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 266a4e4e0fe8d5aaf551ce205b4d699aec39922d634c34a922cdf825b2e38f0d
4
- data.tar.gz: 1f07112de5ce4ecb8e18aa1b9a2013bd71d6b99e4442aeb27b8a239928242d0b
3
+ metadata.gz: e945839e116f3076fe950ec01ddeb9a9442bfc1bf2132460bf5d2a15d983d362
4
+ data.tar.gz: a39d1a0b73260aa8c45ccd48e6f3c1478ac1db86a18952084b0d35bfa2b7c8a3
5
5
  SHA512:
6
- metadata.gz: d458bf7e248657f21ae473e6809288f91fd0b71dfa660b8706a199c3f4e74f06a02f850d5a3b3008ec5c7ae03545a3720a3a0917ca84f6c69793c629fe1a65bb
7
- data.tar.gz: b6d391962ebe0e2c5522c4e60186f8a3c0dce42df2e11c8534db28f8e6838d1390c0910adf67007ffc419dfbbe8ee2f346e02d8c77b49366b950661d571659bb
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: aa0d11190daa8842da406b933d61c4043823ef9a
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: 2cf2b6e3ce2f054289699527c13cd7d795347ce3
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: 26efe45f35f211e7cb7a04967c51c0b6d116321e
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: 1ecf54219c77969066a142a42b694e805d69f8b4
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: aa0d11190daa8842da406b933d61c4043823ef9a
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: 3c24b66ea4beb348de34330984302f1fe25faefd
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: 83097be1002f924a37fcbd6d9099e08e9ed65621
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(_options)
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 < StatisticsReporter
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: 'bundle exec rake ci:minitest'
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: 'bundle exec rake ci:minitest'
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: 'bundle exec rake ci:minitest'
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)
@@ -2,5 +2,5 @@
2
2
  # This defines the NdrDevSupport version. If you change it, rebuild and commit the gem.
3
3
  # Use "rake build" to build the gem, see rake -T for all bundler rake tasks (and our own).
4
4
  module NdrDevSupport
5
- VERSION = '5.5.0'.freeze
5
+ VERSION = '5.6.0'.freeze
6
6
  end
@@ -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 = old_attachment.try(:[], :text) || 'Tests passed'
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: 'bundle exec rake ci:minitest',
55
+ footer: footer,
55
56
  mrkdwn_in: ['text']
56
57
  }
57
58
  @attachments << attachment
@@ -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.5.0
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-01-27 00:00:00.000000000 Z
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