Commit 5d3cda04 authored by Dan Davison's avatar Dan Davison

Merge branch 'qa-shl-return-no-of-examples-only' into 'master'

Add ability to fetch number of tests a scenario would run

See merge request gitlab-org/gitlab!77526
parents 679823cc 84dfb98e
...@@ -9,6 +9,7 @@ module QA ...@@ -9,6 +9,7 @@ module QA
extend self extend self
attr_writer :personal_access_token, :admin_personal_access_token attr_writer :personal_access_token, :admin_personal_access_token
attr_accessor :dry_run
ENV_VARIABLES = Gitlab::QA::Runtime::Env::ENV_VARIABLES ENV_VARIABLES = Gitlab::QA::Runtime::Env::ENV_VARIABLES
......
...@@ -30,6 +30,13 @@ module QA ...@@ -30,6 +30,13 @@ module QA
Runtime::Scenario.define(opt.name, value) Runtime::Scenario.define(opt.name, value)
end end
next
elsif opt.name == :count_examples_only
parser.on(opt.arg, opt.desc) do |value|
QA::Runtime::Env.dry_run = true
Runtime::Scenario.define(opt.name, value)
end
next next
end end
......
...@@ -13,6 +13,7 @@ module QA ...@@ -13,6 +13,7 @@ module QA
'Specify FEATURE_FLAGS as comma-separated flag=state pairs, e.g., "flag1=enabled,flag2=disabled"' 'Specify FEATURE_FLAGS as comma-separated flag=state pairs, e.g., "flag1=enabled,flag2=disabled"'
attribute :parallel, '--parallel', 'Execute tests in parallel' attribute :parallel, '--parallel', 'Execute tests in parallel'
attribute :loop, '--loop', 'Execute test repeatedly' attribute :loop, '--loop', 'Execute test repeatedly'
attribute :count_examples_only, '--count-examples-only', 'Return the number of examples without running them'
end end
end end
end end
...@@ -40,7 +40,8 @@ module QA ...@@ -40,7 +40,8 @@ module QA
## ##
# Perform before hooks, which are different for CE and EE # Perform before hooks, which are different for CE and EE
# #
Runtime::Release.perform_before_hooks
Runtime::Release.perform_before_hooks unless Runtime::Env.dry_run
Runtime::Feature.enable(options[:enable_feature]) if options.key?(:enable_feature) Runtime::Feature.enable(options[:enable_feature]) if options.key?(:enable_feature)
Runtime::Feature.disable(options[:disable_feature]) if options.key?(:disable_feature) && (@feature_enabled = Runtime::Feature.enabled?(options[:disable_feature])) Runtime::Feature.disable(options[:disable_feature]) if options.key?(:disable_feature) && (@feature_enabled = Runtime::Feature.enabled?(options[:disable_feature]))
......
...@@ -9,6 +9,7 @@ module QA ...@@ -9,6 +9,7 @@ module QA
attr_accessor :tty, :tags, :options attr_accessor :tty, :tags, :options
DEFAULT_TEST_PATH_ARGS = ['--', File.expand_path('./features', __dir__)].freeze DEFAULT_TEST_PATH_ARGS = ['--', File.expand_path('./features', __dir__)].freeze
DEFAULT_STD_ARGS = [$stderr, $stdout].freeze
def initialize def initialize
@tty = false @tty = false
...@@ -68,8 +69,15 @@ module QA ...@@ -68,8 +69,15 @@ module QA
ParallelRunner.run(args.flatten) ParallelRunner.run(args.flatten)
elsif Runtime::Scenario.attributes[:loop] elsif Runtime::Scenario.attributes[:loop]
LoopRunner.run(args.flatten) LoopRunner.run(args.flatten)
elsif Runtime::Scenario.attributes[:count_examples_only]
args.unshift('--dry-run')
out = StringIO.new
RSpec::Core::Runner.run(args.flatten, $stderr, out).tap do |status|
abort if status.nonzero?
end
$stdout.puts out.string.match(/(\d+) examples,/)[1]
else else
RSpec::Core::Runner.run(args.flatten, $stderr, $stdout).tap do |status| RSpec::Core::Runner.run(args.flatten, *DEFAULT_STD_ARGS).tap do |status|
abort if status.nonzero? abort if status.nonzero?
end end
end end
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
RSpec.describe QA::Scenario::Test::Integration::Github do RSpec.describe QA::Scenario::Test::Integration::Github do
describe '#perform' do describe '#perform' do
let(:env) { spy('Runtime::Env', knapsack?: false) } let(:env) { spy('Runtime::Env', knapsack?: false, dry_run: false) }
before do before do
stub_const('QA::Runtime::Env', env) stub_const('QA::Runtime::Env', env)
......
...@@ -12,7 +12,7 @@ QaDeprecationToolkitEnv.configure! ...@@ -12,7 +12,7 @@ QaDeprecationToolkitEnv.configure!
Knapsack::Adapters::RSpecAdapter.bind if QA::Runtime::Env.knapsack? Knapsack::Adapters::RSpecAdapter.bind if QA::Runtime::Env.knapsack?
QA::Runtime::Browser.configure! QA::Runtime::Browser.configure! unless QA::Runtime::Env.dry_run
QA::Runtime::AllureReport.configure! QA::Runtime::AllureReport.configure!
QA::Runtime::Scenario.from_env(QA::Runtime::Env.runtime_scenario_attributes) QA::Runtime::Scenario.from_env(QA::Runtime::Env.runtime_scenario_attributes)
......
...@@ -28,6 +28,26 @@ RSpec.describe QA::Specs::Runner do ...@@ -28,6 +28,26 @@ RSpec.describe QA::Specs::Runner do
end end
end end
context 'when count_examples_only is set as an option' do
let(:out) { StringIO.new }
before do
QA::Runtime::Scenario.define(:count_examples_only, true)
out.string = '22 examples,'
allow(StringIO).to receive(:new).and_return(out)
end
it 'sets the `--dry-run` flag' do
expect_rspec_runner_arguments(['--dry-run', '--tag', '~orchestrated', '--tag', '~transient', '--tag', '~geo', *described_class::DEFAULT_TEST_PATH_ARGS], [$stderr, anything])
subject.perform
end
after do
QA::Runtime::Scenario.attributes.delete(:count_examples_only)
end
end
context 'when tags are set' do context 'when tags are set' do
subject { described_class.new.tap { |runner| runner.tags = %i[orchestrated github] } } subject { described_class.new.tap { |runner| runner.tags = %i[orchestrated github] } }
...@@ -158,10 +178,10 @@ RSpec.describe QA::Specs::Runner do ...@@ -158,10 +178,10 @@ RSpec.describe QA::Specs::Runner do
end end
end end
def expect_rspec_runner_arguments(arguments) def expect_rspec_runner_arguments(arguments, std_arguments = described_class::DEFAULT_STD_ARGS)
expect(RSpec::Core::Runner).to receive(:run) expect(RSpec::Core::Runner).to receive(:run)
.with(arguments, $stderr, $stdout) .with(arguments, *std_arguments)
.and_return(0) .and_return(0)
end end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment