Skip to content

Commit

Permalink
rspec support for ITR skipping
Browse files Browse the repository at this point in the history
  • Loading branch information
anmarchenko committed Apr 19, 2024
1 parent c0ac3c9 commit 5aed886
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 12 deletions.
8 changes: 6 additions & 2 deletions lib/datadog/ci/contrib/rspec/example.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

require_relative "../../ext/test"
require_relative "../../git/local_repository"
require_relative "../../utils/test_run"
require_relative "ext"

module Datadog
Expand Down Expand Up @@ -42,11 +43,14 @@ def run(*)
CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::RSpec::Integration.version.to_s,
CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(metadata[:file_path]),
CI::Ext::Test::TAG_SOURCE_START => metadata[:line_number].to_s
CI::Ext::Test::TAG_SOURCE_START => metadata[:line_number].to_s,
CI::Ext::Test::TAG_PARAMETERS => Utils::TestRun.test_parameters(
metadata: {"scoped_id" => metadata[:scoped_id]}
)
},
service: datadog_configuration[:service_name]
) do |test_span|
test_span&.set_parameters({}, {"scoped_id" => metadata[:scoped_id]})
metadata[:skip] = CI::Ext::Test::ITR_TEST_SKIP_REASON if test_span&.skipped_by_itr?

result = super

Expand Down
11 changes: 2 additions & 9 deletions lib/datadog/ci/test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
require "json"

require_relative "span"
require_relative "utils/test_run"

module Datadog
module CI
Expand Down Expand Up @@ -104,15 +105,7 @@ def skipped!(exception: nil, reason: nil)
def set_parameters(arguments, metadata = {})
return if arguments.nil?

set_tag(
Ext::Test::TAG_PARAMETERS,
JSON.generate(
{
arguments: arguments,
metadata: metadata
}
)
)
set_tag(Ext::Test::TAG_PARAMETERS, Utils::TestRun.test_parameters(arguments: arguments, metadata: metadata))
end

# Gets the parameters for this test (e.g. Cucumber example or RSpec specs) as a serialized JSON.
Expand Down
9 changes: 9 additions & 0 deletions lib/datadog/ci/utils/test_run.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,15 @@ def self.command
def self.test_full_name(test_name, suite, parameters = nil)
"#{suite}.#{test_name}.#{parameters}"
end

def self.test_parameters(arguments: {}, metadata: {})
JSON.generate(
{
arguments: arguments,
metadata: metadata
}
)
end
end
end
end
Expand Down
2 changes: 2 additions & 0 deletions sig/datadog/ci/utils/test_run.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ module Datadog
def self.command: () -> String

def self.test_full_name: (String test_name, String? test_suite, ?String? parameters) -> String

def self.test_parameters: (?arguments: Hash[untyped, untyped], ?metadata: Hash[untyped, untyped]) -> String
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion spec/datadog/ci/contrib/minitest/instrumentation_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -738,7 +738,7 @@ def test_b_2
expect(skipped).to all have_test_tag(:itr_skipped_by_itr, "true")
end

it "send test session level tags" do
it "sends test session level tags" do
expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "true")
expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test")
expect(test_session_span).to have_test_tag(:itr_tests_skipped, "true")
Expand Down
68 changes: 68 additions & 0 deletions spec/datadog/ci/contrib/rspec/instrumentation_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,12 @@ def expect_failure

expect(test_session_span).not_to have_test_tag(:code_coverage_enabled)

# ITR
expect(test_session_span).not_to have_test_tag(:itr_test_skipping_enabled)
expect(test_session_span).not_to have_test_tag(:itr_test_skipping_type)
expect(test_session_span).not_to have_test_tag(:itr_tests_skipped)
expect(test_session_span).not_to have_test_tag(:itr_test_skipping_count)

expect(test_session_span).to have_pass_status
end

Expand Down Expand Up @@ -646,4 +652,66 @@ def rspec_skipped_session_run
})
end
end

context "when skipping tests" do
include_context "CI mode activated" do
let(:integration_name) { :rspec }
let(:integration_options) { {service_name: "lspec"} }

let(:itr_enabled) { true }
let(:tests_skipping_enabled) { true }
end

context "skipped a single test" do
let(:itr_skippable_tests) do
Set.new([
'SomeTest at ./spec/datadog/ci/contrib/rspec/instrumentation_spec.rb.nested foo.{"arguments":{},"metadata":{"scoped_id":"1:1:1"}}'
])
end

it "skips test" do
rspec_session_run(with_failed_test: true)

expect(test_spans).to have(2).items
expect(test_spans).to have_tag_values_no_order(:status, ["skip", "fail"])

itr_skipped_test = test_spans.find { |span| span.name == "nested foo" }
expect(itr_skipped_test).to have_test_tag(:itr_skipped_by_itr, "true")
end

it "sends test session level tags" do
rspec_session_run(with_failed_test: true)

expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "true")
expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test")
expect(test_session_span).to have_test_tag(:itr_tests_skipped, "true")
expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 1)
end
end

context "skipped all tests" do
let(:itr_skippable_tests) do
Set.new([
'SomeTest at ./spec/datadog/ci/contrib/rspec/instrumentation_spec.rb.nested foo.{"arguments":{},"metadata":{"scoped_id":"1:1:1"}}',
'SomeTest at ./spec/datadog/ci/contrib/rspec/instrumentation_spec.rb.nested fails.{"arguments":{},"metadata":{"scoped_id":"1:1:2"}}'
])
end

it "skips tests and suite" do
rspec_session_run(with_failed_test: true)

expect(test_spans).to have(2).items
expect(test_spans).to all have_skip_status
expect(test_spans).to all have_test_tag(:itr_skipped_by_itr, "true")
expect(first_test_suite_span).to have_skip_status
end

it "sends test session level tags" do
rspec_session_run(with_failed_test: true)

expect(test_session_span).to have_test_tag(:itr_tests_skipped, "true")
expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 2)
end
end
end
end

0 comments on commit 5aed886

Please sign in to comment.