mirror of
https://github.com/thoughtbot/shoulda-matchers.git
synced 2022-11-09 12:01:38 -05:00
Speed up running unit tests with Zeus
This is an effort to vastly decrease the time it takes to run a single unit test file and therefore increase productivity and happiness for people working on this project. If you want to run a unit test file, now you can use `zeus rspec` instead of `rspec` -- assuming you run `zeus start` first -- and it will run a LOT faster. Because test files tend to have long file paths, you can even use a shorter version of those paths. So instead of saying: zeus rspec spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb you can say: zeus rspec active_record/validate_uniqueness_of_matcher_spec.rb
This commit is contained in:
parent
14b5658826
commit
3ee734bb7e
17 changed files with 191 additions and 31 deletions
|
@ -37,6 +37,13 @@ request.
|
||||||
appraisal 4.2 rspec <path of test file to run>
|
appraisal 4.2 rspec <path of test file to run>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can also run unit tests by running `zeus start` in one shell, and then
|
||||||
|
running the following in another:
|
||||||
|
|
||||||
|
```
|
||||||
|
zeus rspec <path of test file to run>
|
||||||
|
```
|
||||||
|
|
||||||
And to run the entire test suite again:
|
And to run the entire test suite again:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
1
Gemfile
1
Gemfile
|
@ -6,6 +6,7 @@ gem 'pry', github: 'pry/pry'
|
||||||
gem 'pry-byebug'
|
gem 'pry-byebug'
|
||||||
gem 'rake', '~> 10.0'
|
gem 'rake', '~> 10.0'
|
||||||
gem 'rspec', '~> 3.2'
|
gem 'rspec', '~> 3.2'
|
||||||
|
gem 'zeus'
|
||||||
|
|
||||||
# YARD
|
# YARD
|
||||||
gem 'yard'
|
gem 'yard'
|
||||||
|
|
|
@ -47,6 +47,8 @@ GEM
|
||||||
thor (0.19.1)
|
thor (0.19.1)
|
||||||
yajl-ruby (1.1.0)
|
yajl-ruby (1.1.0)
|
||||||
yard (0.8.7.3)
|
yard (0.8.7.3)
|
||||||
|
zeus (0.15.4)
|
||||||
|
method_source (>= 0.6.7)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
@ -62,6 +64,4 @@ DEPENDENCIES
|
||||||
redcarpet
|
redcarpet
|
||||||
rspec (~> 3.2)
|
rspec (~> 3.2)
|
||||||
yard
|
yard
|
||||||
|
zeus
|
||||||
BUNDLED WITH
|
|
||||||
1.10.6
|
|
||||||
|
|
48
README.md
48
README.md
|
@ -221,6 +221,52 @@ Shoulda::Matchers.configure do |config|
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Running tests
|
||||||
|
|
||||||
|
### Unit tests
|
||||||
|
|
||||||
|
Unit tests are the most common kind of tests in this gem, and the best way to
|
||||||
|
run them is by using [Zeus].
|
||||||
|
|
||||||
|
You'll want to run `zeus start` in one shell, then in another shell, instead of
|
||||||
|
using `rspec` to run tests, you can use `zeus rspec`. So for instance, you might
|
||||||
|
say:
|
||||||
|
|
||||||
|
```
|
||||||
|
zeus rspec spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb
|
||||||
|
```
|
||||||
|
|
||||||
|
As a shortcut, you can also drop the initial part of the path and say this
|
||||||
|
instead:
|
||||||
|
|
||||||
|
```
|
||||||
|
zeus rspec active_model/validate_inclusion_of_matcher_spec.rb
|
||||||
|
```
|
||||||
|
|
||||||
|
### Acceptance tests
|
||||||
|
|
||||||
|
The gem uses [Appraisal] to test against multiple versions of Rails and Ruby.
|
||||||
|
This means that if you're trying to run a single test file, you'll need to
|
||||||
|
specify which appraisal to use. For instance, you can't simply say:
|
||||||
|
|
||||||
|
```
|
||||||
|
rspec spec/acceptance/active_model_integration_spec.rb
|
||||||
|
```
|
||||||
|
|
||||||
|
Instead, you need to say
|
||||||
|
|
||||||
|
```
|
||||||
|
bundle exec appraisal 4.2 rspec spec/acceptance/active_model_integration_spec.rb
|
||||||
|
```
|
||||||
|
|
||||||
|
### All tests
|
||||||
|
|
||||||
|
You can run all tests by saying:
|
||||||
|
|
||||||
|
```
|
||||||
|
bundle exec rake
|
||||||
|
```
|
||||||
|
|
||||||
## Generating documentation
|
## Generating documentation
|
||||||
|
|
||||||
YARD is used to generate documentation, which can be viewed [online][rubydocs].
|
YARD is used to generate documentation, which can be viewed [online][rubydocs].
|
||||||
|
@ -284,3 +330,5 @@ We are [available for hire][hire].
|
||||||
[contributors]: https://github.com/thoughtbot/shoulda-matchers/contributors
|
[contributors]: https://github.com/thoughtbot/shoulda-matchers/contributors
|
||||||
[shoulda]: http://github.com/thoughtbot/shoulda
|
[shoulda]: http://github.com/thoughtbot/shoulda
|
||||||
[shoulda-context]: http://github.com/thoughtbot/shoulda-context
|
[shoulda-context]: http://github.com/thoughtbot/shoulda-context
|
||||||
|
[Zeus]: https://github.com/burke/zeus
|
||||||
|
[Appraisal]: https://github.com/thoughtbot/appraisal
|
||||||
|
|
88
custom_plan.rb
Normal file
88
custom_plan.rb
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
require 'zeus/rails'
|
||||||
|
require_relative 'spec/support/tests/current_bundle'
|
||||||
|
|
||||||
|
class CustomPlan < Zeus::Plan
|
||||||
|
def initialize
|
||||||
|
super
|
||||||
|
@rails_plan = Zeus::Rails.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def boot
|
||||||
|
ENV['BUNDLE_GEMFILE'] = File.expand_path(
|
||||||
|
"../gemfiles/#{latest_appraisal}.gemfile",
|
||||||
|
__FILE__
|
||||||
|
)
|
||||||
|
|
||||||
|
require 'bundler/setup'
|
||||||
|
|
||||||
|
$LOAD_PATH << File.expand_path('../lib', __FILE__)
|
||||||
|
$LOAD_PATH << File.expand_path('../spec', __FILE__)
|
||||||
|
|
||||||
|
require_relative 'spec/support/unit/load_environment'
|
||||||
|
end
|
||||||
|
|
||||||
|
def after_fork
|
||||||
|
# @rails_plan.reconnect_activerecord
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_environment
|
||||||
|
require_relative 'spec/unit_spec_helper'
|
||||||
|
end
|
||||||
|
|
||||||
|
def rspec
|
||||||
|
ARGV.replace(file_paths_to_run)
|
||||||
|
RSpec::Core::Runner.invoke
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def latest_appraisal
|
||||||
|
current_bundle.latest_appraisal
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_bundle
|
||||||
|
Tests::CurrentBundle.instance
|
||||||
|
end
|
||||||
|
|
||||||
|
def file_paths_to_run
|
||||||
|
if given_file_paths.empty?
|
||||||
|
['spec/unit']
|
||||||
|
else
|
||||||
|
given_file_paths.map do |given_path|
|
||||||
|
determine_file_path_to_run(given_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def determine_file_path_to_run(given_rspec_argument)
|
||||||
|
expanded_file_path, location =
|
||||||
|
expand_rspec_argument(given_rspec_argument)
|
||||||
|
|
||||||
|
if File.exist?(expanded_file_path)
|
||||||
|
if location
|
||||||
|
expanded_file_path + location
|
||||||
|
else
|
||||||
|
expanded_file_path
|
||||||
|
end
|
||||||
|
else
|
||||||
|
given_rspec_argument
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def expand_rspec_argument(rspec_argument)
|
||||||
|
match = rspec_argument.match(/\A(.+?)(:\d+|\[[\d:]+\])?\Z/)
|
||||||
|
file_path, location = match.captures
|
||||||
|
expanded_file_path = File.expand_path(
|
||||||
|
"../spec/unit/shoulda/matchers/#{file_path}",
|
||||||
|
__FILE__
|
||||||
|
)
|
||||||
|
|
||||||
|
[expanded_file_path, location]
|
||||||
|
end
|
||||||
|
|
||||||
|
def given_file_paths
|
||||||
|
ARGV
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Zeus.plan = CustomPlan.new
|
|
@ -8,6 +8,7 @@ gem "pry", :github => "pry/pry"
|
||||||
gem "pry-byebug"
|
gem "pry-byebug"
|
||||||
gem "rake", "~> 10.0"
|
gem "rake", "~> 10.0"
|
||||||
gem "rspec", "~> 3.2"
|
gem "rspec", "~> 3.2"
|
||||||
|
gem "zeus"
|
||||||
gem "yard"
|
gem "yard"
|
||||||
gem "redcarpet"
|
gem "redcarpet"
|
||||||
gem "pygments.rb"
|
gem "pygments.rb"
|
||||||
|
|
|
@ -177,6 +177,8 @@ GEM
|
||||||
json (>= 1.8.0)
|
json (>= 1.8.0)
|
||||||
yajl-ruby (1.2.1)
|
yajl-ruby (1.2.1)
|
||||||
yard (0.8.7.6)
|
yard (0.8.7.6)
|
||||||
|
zeus (0.15.4)
|
||||||
|
method_source (>= 0.6.7)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
@ -215,6 +217,4 @@ DEPENDENCIES
|
||||||
turbolinks
|
turbolinks
|
||||||
uglifier (>= 1.3.0)
|
uglifier (>= 1.3.0)
|
||||||
yard
|
yard
|
||||||
|
zeus
|
||||||
BUNDLED WITH
|
|
||||||
1.10.6
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ gem "pry", :github => "pry/pry"
|
||||||
gem "pry-byebug"
|
gem "pry-byebug"
|
||||||
gem "rake", "~> 10.0"
|
gem "rake", "~> 10.0"
|
||||||
gem "rspec", "~> 3.2"
|
gem "rspec", "~> 3.2"
|
||||||
|
gem "zeus"
|
||||||
gem "yard"
|
gem "yard"
|
||||||
gem "redcarpet"
|
gem "redcarpet"
|
||||||
gem "pygments.rb"
|
gem "pygments.rb"
|
||||||
|
|
|
@ -179,6 +179,8 @@ GEM
|
||||||
json (>= 1.8.0)
|
json (>= 1.8.0)
|
||||||
yajl-ruby (1.2.1)
|
yajl-ruby (1.2.1)
|
||||||
yard (0.8.7.6)
|
yard (0.8.7.6)
|
||||||
|
zeus (0.15.4)
|
||||||
|
method_source (>= 0.6.7)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
@ -217,6 +219,4 @@ DEPENDENCIES
|
||||||
turbolinks
|
turbolinks
|
||||||
uglifier (>= 1.3.0)
|
uglifier (>= 1.3.0)
|
||||||
yard
|
yard
|
||||||
|
zeus
|
||||||
BUNDLED WITH
|
|
||||||
1.10.6
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ gem "pry", :github => "pry/pry"
|
||||||
gem "pry-byebug"
|
gem "pry-byebug"
|
||||||
gem "rake", "~> 10.0"
|
gem "rake", "~> 10.0"
|
||||||
gem "rspec", "~> 3.2"
|
gem "rspec", "~> 3.2"
|
||||||
|
gem "zeus"
|
||||||
gem "yard"
|
gem "yard"
|
||||||
gem "redcarpet"
|
gem "redcarpet"
|
||||||
gem "pygments.rb"
|
gem "pygments.rb"
|
||||||
|
|
|
@ -174,6 +174,8 @@ GEM
|
||||||
json (>= 1.8.0)
|
json (>= 1.8.0)
|
||||||
yajl-ruby (1.2.1)
|
yajl-ruby (1.2.1)
|
||||||
yard (0.8.7.6)
|
yard (0.8.7.6)
|
||||||
|
zeus (0.15.4)
|
||||||
|
method_source (>= 0.6.7)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
@ -212,6 +214,4 @@ DEPENDENCIES
|
||||||
turbolinks
|
turbolinks
|
||||||
uglifier (>= 1.3.0)
|
uglifier (>= 1.3.0)
|
||||||
yard
|
yard
|
||||||
|
zeus
|
||||||
BUNDLED WITH
|
|
||||||
1.10.6
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ gem "pry", :github => "pry/pry"
|
||||||
gem "pry-byebug"
|
gem "pry-byebug"
|
||||||
gem "rake", "~> 10.0"
|
gem "rake", "~> 10.0"
|
||||||
gem "rspec", "~> 3.2"
|
gem "rspec", "~> 3.2"
|
||||||
|
gem "zeus"
|
||||||
gem "yard"
|
gem "yard"
|
||||||
gem "redcarpet"
|
gem "redcarpet"
|
||||||
gem "pygments.rb"
|
gem "pygments.rb"
|
||||||
|
|
|
@ -197,6 +197,8 @@ GEM
|
||||||
json (>= 1.8.0)
|
json (>= 1.8.0)
|
||||||
yajl-ruby (1.2.1)
|
yajl-ruby (1.2.1)
|
||||||
yard (0.8.7.6)
|
yard (0.8.7.6)
|
||||||
|
zeus (0.15.4)
|
||||||
|
method_source (>= 0.6.7)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
@ -235,6 +237,4 @@ DEPENDENCIES
|
||||||
turbolinks
|
turbolinks
|
||||||
uglifier (>= 1.3.0)
|
uglifier (>= 1.3.0)
|
||||||
yard
|
yard
|
||||||
|
zeus
|
||||||
BUNDLED WITH
|
|
||||||
1.10.6
|
|
||||||
|
|
|
@ -24,6 +24,10 @@ EOT
|
||||||
path.dirname == root.join('gemfiles')
|
path.dirname == root.join('gemfiles')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def current_or_latest_appraisal
|
||||||
|
current_appraisal || latest_appraisal
|
||||||
|
end
|
||||||
|
|
||||||
def latest_appraisal
|
def latest_appraisal
|
||||||
available_appraisals.sort.last
|
available_appraisals.sort.last
|
||||||
end
|
end
|
||||||
|
|
12
spec/support/unit/load_environment.rb
Normal file
12
spec/support/unit/load_environment.rb
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
require_relative '../tests/current_bundle'
|
||||||
|
require_relative 'rails_application'
|
||||||
|
|
||||||
|
Tests::CurrentBundle.instance.assert_appraisal!
|
||||||
|
|
||||||
|
$test_app = UnitTests::RailsApplication.new
|
||||||
|
$test_app.create
|
||||||
|
$test_app.load
|
||||||
|
|
||||||
|
require 'active_record/base'
|
||||||
|
|
||||||
|
ENV['RAILS_ENV'] = 'test'
|
|
@ -1,19 +1,4 @@
|
||||||
require_relative 'support/tests/current_bundle'
|
require_relative 'support/unit/load_environment'
|
||||||
|
|
||||||
Tests::CurrentBundle.instance.assert_appraisal!
|
|
||||||
|
|
||||||
#---
|
|
||||||
|
|
||||||
require File.expand_path('../support/unit/rails_application', __FILE__)
|
|
||||||
|
|
||||||
$test_app = UnitTests::RailsApplication.new
|
|
||||||
$test_app.create
|
|
||||||
$test_app.load
|
|
||||||
|
|
||||||
require 'active_record/base'
|
|
||||||
|
|
||||||
ENV['BUNDLE_GEMFILE'] ||= app.gemfile_path
|
|
||||||
ENV['RAILS_ENV'] = 'test'
|
|
||||||
|
|
||||||
require 'rspec/rails'
|
require 'rspec/rails'
|
||||||
require 'shoulda-matchers'
|
require 'shoulda-matchers'
|
||||||
|
|
11
zeus.json
Normal file
11
zeus.json
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"command": "ruby -rubygems -r./custom_plan -eZeus.go",
|
||||||
|
|
||||||
|
"plan": {
|
||||||
|
"boot": {
|
||||||
|
"test_environment": {
|
||||||
|
"rspec": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue