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