Class: RSpec::Core::Bisect::ForkRunner Private
Relationships & Source Files | |
Namespace Children | |
Classes:
| |
Inherits: | Object |
Defined in: | rspec-core/lib/rspec/core/bisect/fork_runner.rb |
Overview
A Bisect runner that runs requested subsets of the suite by forking sub-processes. The main process bootstraps ::RSpec
and the application environment (including preloading files specified via ‘–require`) so that the individual spec runs do not have to re-pay that cost. Each spec run happens in a forked process, ensuring that the spec files are not loaded in the main process.
For most projects, bisections that use ‘ForkRunner` instead of ShellRunner
will finish significantly faster, because the ShellRunner
pays the cost of booting ::RSpec
and the app environment on every run of a subset. In contrast, ForkRunner
pays that cost only once.
However, not all projects can use ‘ForkRunner`. Obviously, on platforms that do not support forking (e.g. Windows), it cannot be used. In addition, it can cause problems for some projects that put side-effectful spec bootstrapping logic that should run on every spec run directly at the top level in a file loaded by –require
, rather than in a before(:suite)
hook. For example, consider a project that relies on some top-level logic in spec_helper
to boot a Redis server for the test suite, intending the Redis bootstrapping to happen on every spec run. With ShellRunner
, the bootstrapping logic will happen for each run of any subset of the suite, but for ForkRunner
, such logic will only get run once, when the RunDispatcher
boots the application environment. This might cause problems. The solution is for users to move the bootstrapping logic into a before(:suite)
hook, or use the slower ShellRunner
.
Class Method Summary
- .name Internal use only
- .new(shell_command, spec_runner) ⇒ ForkRunner constructor Internal use only
- .start(shell_command, spec_runner) Internal use only
Instance Method Summary
- #original_results Internal use only
- #run(locations) Internal use only
- #shutdown Internal use only
- #dispatch_run(run_descriptor) private Internal use only
Class Method Details
.name
[ GitHub ]# File 'rspec-core/lib/rspec/core/bisect/fork_runner.rb', line 43
def self.name :fork end
.start(shell_command, spec_runner)
[ GitHub ]Instance Method Details
#dispatch_run(run_descriptor) (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/bisect/fork_runner.rb', line 69
def dispatch_run(run_descriptor) @run_dispatcher.dispatch_specs(run_descriptor) @channel.receive.tap do |result| if result.is_a?(String) raise BisectFailedError.for_failed_spec_run(result) end end end
#original_results
[ GitHub ]# File 'rspec-core/lib/rspec/core/bisect/fork_runner.rb', line 58
def original_results @original_results ||= dispatch_run(ExampleSetDescriptor.new( @shell_command.original_locations, [])) end
#run(locations)
[ GitHub ]# File 'rspec-core/lib/rspec/core/bisect/fork_runner.rb', line 53
def run(locations) run_descriptor = ExampleSetDescriptor.new(locations, original_results.failed_example_ids) dispatch_run(run_descriptor) end
#shutdown
[ GitHub ]# File 'rspec-core/lib/rspec/core/bisect/fork_runner.rb', line 63
def shutdown @channel.close end