flakey_spec_catcher 0.7.1 → 0.7.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bbde8c00cdc9c8c24d9d81572fe3217d73114d7d360a87ff4f08adea746aae55
4
- data.tar.gz: 8142ae2b56440f6a53db1b03c3e736a5556aed9c31945e0ccfbfc3a5d9df5b3b
3
+ metadata.gz: 765b9037e2fff584368572be0d907ce9d3dba0ce04b283615526947cd3fe2ab2
4
+ data.tar.gz: 18a09d27cf2e5850d0ddd65e8fe6006ffdd365f2fb164f624187aeea17baf841
5
5
  SHA512:
6
- metadata.gz: 69f5f46b6dc7a8cf31c030b16a3a129dc5768b60214abc9cf603facc4ad3c94d2ee2df7a08838c9b033d91941dc7af4b388861f94b0f539466a107b2dfd10a7c
7
- data.tar.gz: 72325c48ca9c58ab7f65f569905b3a4782b9678cf608f86c9b8982f4b6cc70c797e5a6ee6ab04c7d35c1c9275c35d48d9b1f38b1e9d60e08bf8caf357db08db2
6
+ metadata.gz: 8ec0601d6583dd288459019b2c686ed83323290d10053be001683e40bcd478850aa3f50b27f88b6c3df5f88cad3cf55ebaf37b7d070833236cb4edb01716af4a
7
+ data.tar.gz: a97d0fbe2bb48992a938105556cba87fa25ed48e8dff0404b7c0ad4d9fc59c4242bf74c26550418d1e1385dc5ec144de9dca3d1b0bce03af13e6091b247d5bc5
data/README.md CHANGED
@@ -1,12 +1,27 @@
1
- # Flakey Spec Catcher (FSC)
1
+ # Flakey Spec Catcher
2
2
 
3
3
  ### About:
4
4
 
5
- This gem is intended to catch and prevent the merging of flakey ruby specs.
6
- Currently, it will run the equivalent of a git diff between the current branch's
7
- commit and origin/master to detect any changes to files that contain `_spec.rb`.
8
- For these files, it will re-run either the changed tests or the whole spec
9
- file's test suite a specified number of times.
5
+ This gem is intended to catch and prevent the merging of flakey RSpec tests.
6
+
7
+ There are two primary usecases for flakey_spec_catcher (FSC):
8
+
9
+ 1. Git Detection - Make changes to specs, add them to a git commit and then
10
+ allow FSC to detect changes and re-run only the new/edited tests in your
11
+ commit many times.
12
+
13
+ 2. Manual Re-runs - Specify a test to re-run many times regardless of whether it has
14
+ corresponding changes in yuor commit.
15
+
16
+ FSC detects changes by running the equivalent of a git diff
17
+ between the current branch's commit and the HEAD of Source Control Management (SCM)
18
+ to detect any changes to files that contain `_spec.rb`. For these files, it will
19
+ re-run either the changed tests or the whole spec file's test suite a specified
20
+ number of times based on user configurations.
21
+
22
+ If all re-runs that FSC triggers pass, the result of running it
23
+ will be a status code of 0. If a single re-run fails, a non-zero exit status
24
+ will result.
10
25
 
11
26
  Note that `flakey_spec_catcher` will only detect committed changes, so make sure
12
27
  to add any changed spec files to the commit and amend it if you're testing
@@ -15,27 +30,70 @@ locally.
15
30
  All that's required is to install the gem and then call its executable,
16
31
  `flakey_spec_catcher`.
17
32
 
33
+ ### Why use FSC?
34
+
35
+ FSC allows you to specify a usage with which to re-run
36
+ tests. The default usage is inserting all test cases manually into
37
+ RSpec::Core::Runner API and then clearing all example and test data between
38
+ each re-run. So long as RSpec is configured to not reset browser+server
39
+ configurations between test runs or test suites, re-running tests this way
40
+ will be the fastest way to ensure that tests are not flakey.
41
+ If providing a custom usage, FSC will run each re-run
42
+ as a separate process and will likely incur more significant overhead, however,
43
+ it may require less tweaking of your existing RSpec configuration.
44
+
45
+ If you have setup your environment to use the default usage
46
+ (RSpec::Core::Runner), FSC will use an RSpec listener to
47
+ combine your test results and give you a consolidated summary of how many re-runs
48
+ of each test case failed with a specific assertion.
49
+
50
+ FSC is ideal for testing in continuous integration since it will
51
+ run only created/edited tests and can run them many times in an efficient manner.
52
+ So long as silent mode is not enabled, FSC will return an exit
53
+ status that can be used to fail a build if flakey specs are detected.
54
+
55
+ ### What do I need to run FSC?
56
+
57
+ You'll need to be running in a git repository for FSC to detect
58
+ changes. You'll also need to have at least one commit merged in SCM so that
59
+ FSC has a baseline for comparison.
60
+
61
+ Ensure that your gem dependencies meet the base requirements specified by
62
+ flakey_spec_catcher.gemspec
63
+
64
+ ### Tips for running FSC efficiently
65
+
66
+ In order to run FSC in the most efficient way via RSpec::Core::Runner,
67
+ you'll need to ensure that your browser+server connections do not reset before/after
68
+ each example or example group if using Selenium. If RSpec has additional dependencies,
69
+ you'll also need to ensure that FSC has access to any needed gems.
70
+ It's best to do this by adding flakey_speec_catcher to your Gemfile via bundler
71
+ and then running it with `bundle exec flakey_spec_catcher`
72
+
73
+ ### In what cases if FSC not suitable?
74
+
75
+ Since FSC by default re-runs tests at the smallest possible level of
76
+ change (a single test case or example), it is not suitable to allow it to run
77
+ on non-idempotent tests, or any kind of test that cannot be re-run on its own repeatedly.
78
+ For any such tests, applicable test files may be excluded or specific examples may
79
+ be tagged and those tags can then be excluded in runtime.
80
+
18
81
  ### Install:
19
82
 
20
83
  ```sh
21
84
  gem install flakey_spec_catcher
22
85
  ```
23
86
 
24
- Or add it to your Gemfile
25
-
26
- ```ruby
27
- # Gemfile
28
- gem 'flakey_spec_catcher'
29
- ```
30
-
31
- and install with Bundler:
87
+ Or add it using bundler
32
88
 
33
89
  ```sh
90
+ bundle add flakey_spec_catcher
34
91
  bundle install
35
92
  ```
36
93
 
37
94
  ### Configuration:
38
95
 
96
+ #### Environment Variables
39
97
  In some cases, certain environment variables can be configured:
40
98
 
41
99
  - `FSC_REPEAT_FACTOR`: Number of times the examples in each file will be run.
@@ -44,8 +102,8 @@ In some cases, certain environment variables can be configured:
44
102
  - `FSC_IGNORE_FILES`: Specify changed files that will be exempt from FSC
45
103
  re-runs. Regex matching is allowed.
46
104
 
47
- - `FSC_IGNORE_BRANCHES`: Ignore any committed changes related to the specified
48
- branch(es).
105
+ - `FSC_IGNORE_BRANCHES`: Disable running flakey_spec_catcher in git detection
106
+ mode on any commits occurring on a specified branch.
49
107
 
50
108
  - `FSC_SILENT_MODE`: If 'true', FSC will return back with a exit status 0
51
109
  regardless of the result. If 'false', FSC will return a non-zero exit status
@@ -60,6 +118,20 @@ In some cases, certain environment variables can be configured:
60
118
  'spec/ui' with `bundle exec rspec` and want your 'spec/api' changes to be
61
119
  re-run with `parallel_rspec`, you could specify the following value:
62
120
  `FSC_USAGE_PATTERNS='{ spec/ui/** => bundle exec rspec }, { spec/api => parallel_rspec }'`
121
+ Note that by specifying a usage pattern, you will be running a separate process
122
+ for each re-run and runtimes will suffer. This should only be used when re-running
123
+ via RSpec::Core::Runner (default usage) is not suitable
124
+
125
+ - `FSC_EXCLUDED_TAGS`: Specify tags to exclude from re-runs. If a given example/testcase
126
+ matches any of the specified tags, then that testcase will be excluded from the
127
+ re-run queue. Tags may contain a corresponding value that is either a symbol or string and
128
+ multiple tag name value pairs may be specified in a comma separated list.
129
+ For example, if a testcase contains a description such as
130
+ `it 'tests controller functionality', :tag1 => 'enabled' do`
131
+ then this test could be excluded using
132
+ `FSC_EXCLUDED_TAGS=':tag1 => enabled'.
133
+ Note: examples do not inherit the tags from their parent example groups or parent contexts.
134
+
63
135
 
64
136
  Any of these environment variables can be overriden in the commit message by adding the environment variable key and
65
137
  usage/value according to the accepted values specified above.
@@ -75,20 +147,127 @@ FSC_USAGE_PATTERNS = '{ spec/ui => bundle exec rspec }, { spec/api => parallel_r
75
147
 
76
148
  ```
77
149
 
150
+ #### Command Line Arguments
151
+ ```
152
+ -t, --test=TEST_NAME Specify one or more specs in comma separated list
153
+ -u, --usage=USAGE Specify a re-run usage for the manual re-run
154
+ -r, --repeat=REPEAT_FACTOR Specify a repeat factor for the manual re-run(s)
155
+ -e --excluded-tags=EXCLUDED Specify tags to exclude in a comma separated list
156
+ -v, --version Prints current flakey_spec_catcher_version
157
+ -h, --help Displays available flakey_spec_catcher cli overrides
158
+ ```
159
+
160
+ Examples:
161
+
162
+ ```
163
+ # Re-run spec/test_spec.rb:4 50 times using RSpec::Core::Runner
164
+ flakey_spec_catcher --test='spec/test_spec.rb:4' --repeat='50'
165
+
166
+ # Re-run all tests in spec/test_spec.rb 50 times each using 'bundle exec rspc' for
167
+ # each re-run (at a file level since no line number is specified)
168
+ flakey_spec_catcher --test='spec/test_spec.rb' --repeat='50' --usage='bundle exec rspec'
169
+
170
+ # Re-run all tests found by git detection and exclude tests that
171
+ # have the tags :flakey or :unsuccessful => true
172
+ flakey_spec_catcher --excluded-tags=':flakey, :unsuccessful => true'
173
+
174
+ ```
175
+
78
176
  ### Manually re-running a test:
79
177
 
80
178
  Once the gem has been installed, you may manually specify a test to run along with a custom usage
81
179
  (if none is provided, the specified test will run with RSpec::Core::Runner) and a repeat_factor.
82
180
  If no repeat_factor is provided, FSC will check ENV['FSC_REPEAT_FACTOR'] to see if a value
83
- has been configured. If none was provided, it will fall back on the default of 20 re-runs
181
+ has been configured. If none was provided, it will fall back on the default of 20 re-runs
84
182
 
85
183
  Usage Examples:
86
184
  ```
185
+ # Re-run api/spec/user_spec.rb:3 using RSpec::Core::Runner (default usage) 15 times
87
186
  flakey_spec_catcher --test='api/spec/user_spec.rb:3' --repeat='15'
187
+
188
+ # Re-run all files matching the glob api/spec/*_spec.rb in a separate process using
189
+ # 'bundle exec parallel_rspec' FSC_REPEAT_FACTOR times each
88
190
  flakey_spec_catcher --test='api/spec/*_spec.rb' --usage='bundle exec parallel_rspec'
191
+
192
+ # Re-run api/spec/admin_spec.rb in a separate process using rspec, 10 times each
89
193
  flakey_spec_catcher --test='api/spec/admin_spec.rb' --repeat='10' --usage='rspec'
90
194
  ```
91
195
 
196
+ ### Additional Git Detection Examples
197
+
198
+ ```sh
199
+ # Run git detection mode and exclude tests that have the tags :flakey or :unsuccessful => true
200
+ # run each test 20 times (default) each
201
+ bundle exec flakey_spec_catcher --excluded-tags=':flakey, :unsuccessful => true'
202
+ ```
203
+
204
+ ```sh
205
+ export FSC_REPEAT_FACTOR='10'
206
+ export FSC_RERUN_FILE_ONLY='true'
207
+ export FSC_IGNORE_FILES='test_spec.rb'
208
+
209
+ # Run git detection mode, exclude any tests that match /test_spec.rb/ 10 times each
210
+ # if a change is found in any other *_spec.rb file, all tests in that file will be re-run
211
+ bundle exec flakey_spec_catcher
212
+
213
+ ```
214
+
215
+ ### Full example
216
+ 1. In a repo, changes are made to spec files that are then added to a git commit.
217
+ 2. Run flakey_spec_catcher with any desired user configurations
218
+
219
+ Example Output:
220
+ ```Flakey Spec Catcher Settings:
221
+ Current Branch: master
222
+ Remote: origin
223
+ Current Sha: 12341234123412341234123412341234
224
+ Base Sha: 56785678567856785678567856785678
225
+ Repeat factor: 20
226
+ Changed Specs Detected: ["api/spec/changed_spec1.rb:2", "api/spec/changed_spec.rb:3",
227
+ "ui/spec/new_spec.rb:3", "ui/spec/new_spec.rb: 5",
228
+ ]
229
+
230
+ ********************************************
231
+ Re-run Preview
232
+ Running api/spec/changed_spec1.rb:2 20 times
233
+ Running api/spec/changed_spec1.rb:3 20 times
234
+ Running ui/spec/new_spec.rb:3 20 times
235
+ Running ui/spec/new_spec.rb:5 20 times
236
+ ********************************************
237
+
238
+ ********** SUMMARY **********
239
+ 2 example(s) ran 20 times without any failures
240
+
241
+ *************************************************
242
+ No Flakiness Detected!
243
+ *************************************************
244
+ ```
245
+
246
+ If any of the tests were flakey, output would resemble something like
247
+
248
+ ```********** SUMMARY **********
249
+ 1 example(s) ran 20 times without any failures
250
+
251
+ Test Description (./api/spec/test_spec.rb:2)
252
+
253
+ FAILED 15 / 20 times
254
+ 5 times with exception message:
255
+ expected: 1
256
+ got: 0
257
+
258
+ (compared using ==)
259
+ 5 times with exception message:
260
+ expected: 1
261
+ got: 2
262
+
263
+ (compared using ==)
264
+ 5 times with exception message:
265
+ expected: 1
266
+ got: 3
267
+
268
+ (compared using ==)
269
+ ```
270
+
92
271
  ### How FSC works:
93
272
 
94
273
  1. GitController runs a git diff and creates a ChangeSummary object to
@@ -98,15 +277,18 @@ flakey_spec_catcher --test='api/spec/admin_spec.rb' --repeat='10' --usage='rspec
98
277
  3. After representing all changed code blocks as ChangeContext objects within
99
278
  a ChangeCapsule (one per file), ChangeCapsules are stored in the
100
279
  CapsuleManager.
101
- 4. User Configurations are parsed using the UserConfig class and an instance
102
- is stored as an attribute in the Runner class.
103
- 5. UserConfig and CapsuleManager objects are used to initialize a RerunManager
280
+ 4. Command line interface overrides are retrieved using the CLIOverride class
281
+ and a referece to a CLIOverride instance is set in the UserConfig instance.
282
+ 5. User Configurations are parsed using the UserConfig class for environment variables
283
+ and are set for any user configurations that don't have an existing CLIOverride
284
+ provided value.
285
+ 6. UserConfig and CapsuleManager objects are used to initialize a RerunManager
104
286
  object which creates a RerunCapsule object for each ChangeContext and pairs it
105
287
  with an rspec usage based on user configurations.
106
- 6. RerunManager flattens the number of re-runs based on user settings and
288
+ 7. RerunManager determines thee re-runs based on user settings and
107
289
  passes back the identified file/test changes to the Runner along with their
108
290
  specified usages.
109
- 7. Runner will re-run each of the changes at a file level or the specific
291
+ 8. Runner will re-run each of the changes at a file level or the specific
110
292
  context-level of each test and will exit with a 0 if all changes passed all of
111
293
  their re-runs or a non-zero exit status (passed from RSpec).
112
294
 
@@ -155,13 +337,22 @@ code health and code coverage are both assessed in SonarQube.
155
337
  See: <https://sonarqube.core.inseng.net/dashboard?id=tab%3Aflakey_spec_catcher>
156
338
 
157
339
  To test your FSC changes, we've setup some scripts that will build docker images
158
- and run tests in the latest ruby versions.
340
+ and run the FSC specs in the latest ruby versions.
159
341
 
160
342
  ```sh
161
343
  bash bin/build
162
344
  bash bin/test
163
345
  ```
164
346
 
347
+ To build the gem locally and test out FSC in another repository:
348
+
349
+ ```sh
350
+ gem build flakey_spec_catcher.gemspec
351
+ gem install flakey_spc_catcher-<MAJOR-MINOR-PATCH>.gem
352
+ <cd to repo for testing>
353
+ flakey_spec_catcher <ARGS>
354
+ ```
355
+
165
356
  ### License:
166
357
 
167
358
  MIT. See LICENSE.txt for details.
@@ -14,7 +14,8 @@ module FlakeySpecCatcher
14
14
  attr_reader :enable_runs
15
15
 
16
16
  USER_CONFIG_ENV_VARS = %w[FSC_REPEAT_FACTOR FSC_IGNORE_FILES FSC_IGNORE_BRANCHES
17
- FSC_SILENT_MODE FSC_RERUN_FILE_ONLY FSC_USAGE_PATTERNS].freeze
17
+ FSC_SILENT_MODE FSC_RERUN_FILE_ONLY FSC_USAGE_PATTERNS
18
+ FSC_EXCLUDED_TAGS].freeze
18
19
 
19
20
  def initialize(cli_override: CliOverride.new)
20
21
  apply_env_var_settings
@@ -150,6 +151,8 @@ module FlakeySpecCatcher
150
151
  @rerun_file_only = env_var_string_to_bool(env_value)
151
152
  when 'FSC_USAGE_PATTERNS'
152
153
  @rspec_usage_patterns = env_var_string_to_pairs(env_value)
154
+ when 'FSC_EXCLUDED_TAGS'
155
+ @excluded_tags = env_var_string_to_tags(env_value)
153
156
  end
154
157
  end
155
158
  # rubocop:enable Metrics/CyclomaticComplexity
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FlakeySpecCatcher
4
- VERSION = '0.7.1'
4
+ VERSION = '0.7.2'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flakey_spec_catcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Watson
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-01-10 00:00:00.000000000 Z
13
+ date: 2020-01-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec