Make Rails 6 integration tests faster
This commit is contained in:
parent
97b97015f4
commit
4dab96cdb1
8
Rakefile
8
Rakefile
|
@ -4,7 +4,7 @@ require 'rspec/core/rake_task'
|
||||||
require 'appraisal'
|
require 'appraisal'
|
||||||
require_relative 'tasks/documentation'
|
require_relative 'tasks/documentation'
|
||||||
require_relative 'spec/support/tests/database'
|
require_relative 'spec/support/tests/database'
|
||||||
require_relative 'spec/support/tests/current_bundle'
|
require_relative 'support/current_bundle'
|
||||||
|
|
||||||
RSpec::Core::RakeTask.new('spec:unit') do |t|
|
RSpec::Core::RakeTask.new('spec:unit') do |t|
|
||||||
t.ruby_opts = '-w -r ./spec/report_warnings'
|
t.ruby_opts = '-w -r ./spec/report_warnings'
|
||||||
|
@ -21,14 +21,14 @@ RSpec::Core::RakeTask.new('spec:acceptance') do |t|
|
||||||
end
|
end
|
||||||
|
|
||||||
task :default do
|
task :default do
|
||||||
if Tests::CurrentBundle.instance.appraisal_in_use?
|
if Shoulda::Matchers::CurrentBundle.instance.appraisal_in_use?
|
||||||
sh 'rake spec:unit --trace'
|
sh 'rake spec:unit --trace'
|
||||||
sh 'rake spec:acceptance --trace'
|
sh 'rake spec:acceptance --trace'
|
||||||
else
|
else
|
||||||
if ENV['CI']
|
if ENV['CI']
|
||||||
exec "appraisal install && appraisal rake --trace"
|
exec "appraisal install && appraisal rake --trace"
|
||||||
else
|
else
|
||||||
appraisal = Tests::CurrentBundle.instance.latest_appraisal
|
appraisal = Shoulda::Matchers::CurrentBundle.instance.latest_appraisal
|
||||||
exec "appraisal install && appraisal #{appraisal} rake --trace"
|
exec "appraisal install && appraisal #{appraisal} rake --trace"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -36,7 +36,7 @@ end
|
||||||
|
|
||||||
namespace :appraisal do
|
namespace :appraisal do
|
||||||
task :list do
|
task :list do
|
||||||
appraisals = Tests::CurrentBundle.instance.available_appraisals
|
appraisals = Shoulda::Matchers::CurrentBundle.instance.available_appraisals
|
||||||
puts "Valid appraisals: #{appraisals.join(', ')}"
|
puts "Valid appraisals: #{appraisals.join(', ')}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
require_relative '../support/current_bundle'
|
||||||
|
|
||||||
|
current_bundle = Shoulda::Matchers::CurrentBundle.instance
|
||||||
|
|
||||||
|
ENV['BUNDLE_GEMFILE'] ||= current_bundle.latest_appraisal.gemfile_path.to_s
|
||||||
|
|
||||||
|
exec('bundle', 'exec', 'rspec', *ARGV)
|
|
@ -1,6 +1,6 @@
|
||||||
require 'zeus'
|
require 'zeus'
|
||||||
require 'zeus/plan'
|
require 'zeus/plan'
|
||||||
require_relative 'spec/support/tests/current_bundle'
|
require_relative 'support/current_bundle'
|
||||||
|
|
||||||
class CouldNotBootZeusError < StandardError
|
class CouldNotBootZeusError < StandardError
|
||||||
def self.create(underlying_error:)
|
def self.create(underlying_error:)
|
||||||
|
@ -64,7 +64,7 @@ class CustomPlan < Zeus::Plan
|
||||||
end
|
end
|
||||||
|
|
||||||
def current_bundle
|
def current_bundle
|
||||||
Tests::CurrentBundle.instance
|
Shoulda::Matchers::CurrentBundle.instance
|
||||||
end
|
end
|
||||||
|
|
||||||
def file_paths_to_run
|
def file_paths_to_run
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
require_relative 'support/tests/current_bundle'
|
require_relative '../support/current_bundle'
|
||||||
|
|
||||||
Tests::CurrentBundle.instance.assert_appraisal!
|
Shoulda::Matchers::CurrentBundle.instance.assert_appraisal!
|
||||||
|
|
||||||
#---
|
#---
|
||||||
|
|
||||||
|
|
|
@ -58,13 +58,37 @@ module AcceptanceTests
|
||||||
|
|
||||||
def create_rails_application
|
def create_rails_application
|
||||||
fs.clean
|
fs.clean
|
||||||
|
|
||||||
|
options = [
|
||||||
|
'--no-rc',
|
||||||
|
'--skip-bundle',
|
||||||
|
'--skip-javascript',
|
||||||
|
'--skip-listen',
|
||||||
|
'--skip-spring',
|
||||||
|
'--skip-sprockets',
|
||||||
|
'--skip-turbolinks',
|
||||||
|
]
|
||||||
|
|
||||||
if rails_version =~ '~> 6.0'
|
if rails_version =~ '~> 6.0'
|
||||||
command = "bundle exec rails new #{fs.project_directory} --skip-bundle --skip-javascript --no-rc"
|
options += [
|
||||||
else
|
'--skip-action-cable',
|
||||||
command = "bundle exec rails new #{fs.project_directory} --skip-bundle --no-rc"
|
'--skip-action-mailbox',
|
||||||
|
'--skip-action-text',
|
||||||
|
'--skip-bootsnap',
|
||||||
|
'--skip-webpack-install',
|
||||||
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
run_command!(command) do |runner|
|
command = [
|
||||||
|
'bundle',
|
||||||
|
'exec',
|
||||||
|
'rails',
|
||||||
|
'new',
|
||||||
|
fs.project_directory.to_s,
|
||||||
|
*options,
|
||||||
|
]
|
||||||
|
|
||||||
|
run_command!(*command) do |runner|
|
||||||
runner.directory = nil
|
runner.directory = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
require 'bundler'
|
|
||||||
require 'appraisal'
|
|
||||||
|
|
||||||
module Tests
|
|
||||||
class CurrentBundle
|
|
||||||
AppraisalNotSpecified = Class.new(ArgumentError)
|
|
||||||
|
|
||||||
include Singleton
|
|
||||||
|
|
||||||
def assert_appraisal!
|
|
||||||
unless appraisal_in_use?
|
|
||||||
message = <<EOT
|
|
||||||
|
|
||||||
|
|
||||||
Please run tests starting with `appraisal <appraisal_name>`.
|
|
||||||
Possible appraisals are: #{available_appraisals}
|
|
||||||
|
|
||||||
EOT
|
|
||||||
raise AppraisalNotSpecified, message
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def appraisal_in_use?
|
|
||||||
path.dirname == root.join('gemfiles')
|
|
||||||
end
|
|
||||||
|
|
||||||
def current_or_latest_appraisal
|
|
||||||
current_appraisal || latest_appraisal
|
|
||||||
end
|
|
||||||
|
|
||||||
def latest_appraisal
|
|
||||||
available_appraisals.sort.last
|
|
||||||
end
|
|
||||||
|
|
||||||
def available_appraisals
|
|
||||||
Appraisal::AppraisalFile.each.map(&:name)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def current_appraisal
|
|
||||||
if appraisal_in_use?
|
|
||||||
File.basename(path, ".gemfile")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def path
|
|
||||||
Bundler.default_gemfile
|
|
||||||
end
|
|
||||||
|
|
||||||
def root
|
|
||||||
Pathname.new('../../../..').expand_path(__FILE__)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,7 +1,7 @@
|
||||||
require_relative '../tests/current_bundle'
|
require_relative '../support/current_bundle'
|
||||||
require_relative 'rails_application'
|
require_relative 'rails_application'
|
||||||
|
|
||||||
Tests::CurrentBundle.instance.assert_appraisal!
|
Shoulda::Matchers::CurrentBundle.instance.assert_appraisal!
|
||||||
|
|
||||||
$test_app = UnitTests::RailsApplication.new
|
$test_app = UnitTests::RailsApplication.new
|
||||||
$test_app.create
|
$test_app.create
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
require "bundler"
|
||||||
|
require "shellwords"
|
||||||
|
require "singleton"
|
||||||
|
|
||||||
|
module Shoulda
|
||||||
|
module Matchers
|
||||||
|
class CurrentBundle
|
||||||
|
include Singleton
|
||||||
|
|
||||||
|
ROOT_DIR = Pathname.new("..").expand_path(__dir__)
|
||||||
|
APPRAISAL_GEMFILES_PATH = ROOT_DIR.join("gemfiles")
|
||||||
|
|
||||||
|
def assert_appraisal!
|
||||||
|
unless appraisal_in_use?
|
||||||
|
raise AppraisalNotSpecified.new(<<~MESSAGE)
|
||||||
|
Please run tests by specifying an appraisal, like:
|
||||||
|
|
||||||
|
bundle exec appraisal <appraisal_name> #{current_command}
|
||||||
|
|
||||||
|
Possible appraisals are:
|
||||||
|
|
||||||
|
#{available_appraisals.map { |appraisal| " - #{appraisal.name}" }.join("\n")}
|
||||||
|
|
||||||
|
Or to simply go with the latest appraisal, use:
|
||||||
|
|
||||||
|
bin/rspec #{shell_arguments}
|
||||||
|
MESSAGE
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def appraisal_in_use?
|
||||||
|
!current_appraisal.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_appraisal
|
||||||
|
if path
|
||||||
|
available_appraisals.find do |appraisal|
|
||||||
|
appraisal.gemfile_path.to_s == path.to_s
|
||||||
|
end
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def latest_appraisal
|
||||||
|
available_appraisals.max_by(&:name)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def path
|
||||||
|
Bundler.default_gemfile
|
||||||
|
end
|
||||||
|
|
||||||
|
def available_appraisals
|
||||||
|
@_available_appraisals ||= Dir.glob(
|
||||||
|
APPRAISAL_GEMFILES_PATH.join("*.gemfile").to_s,
|
||||||
|
).
|
||||||
|
map do |path|
|
||||||
|
FakeAppraisal.new(
|
||||||
|
name: File.basename(path).sub(/\.gemfile$/, ""),
|
||||||
|
gemfile_path: path,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_command
|
||||||
|
Shellwords.join([File.basename($0)] + ARGV)
|
||||||
|
end
|
||||||
|
|
||||||
|
def shell_arguments
|
||||||
|
Shellwords.join(ARGV)
|
||||||
|
end
|
||||||
|
|
||||||
|
class FakeAppraisal
|
||||||
|
attr_reader :name, :gemfile_path
|
||||||
|
|
||||||
|
def initialize(name:, gemfile_path:)
|
||||||
|
@name = name
|
||||||
|
@gemfile_path = gemfile_path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class AppraisalNotSpecified < ArgumentError; end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue