diff --git a/lib/datadog/ci/contrib/cucumber/instrumentation.rb b/lib/datadog/ci/contrib/cucumber/instrumentation.rb index 7b4a402d..60f1db75 100644 --- a/lib/datadog/ci/contrib/cucumber/instrumentation.rb +++ b/lib/datadog/ci/contrib/cucumber/instrumentation.rb @@ -21,6 +21,14 @@ def formatters @datadog_formatter ||= CI::Contrib::Cucumber::Formatter.new(@configuration) [@datadog_formatter] + existing_formatters end + + def begin_scenario(test_case) + if Datadog::CI.active_test&.skipped_by_itr? + raise ::Cucumber::Core::Test::Result::Skipped, CI::Ext::Test::ITR_TEST_SKIP_REASON + end + + super + end end end end diff --git a/lib/datadog/ci/contrib/cucumber/patcher.rb b/lib/datadog/ci/contrib/cucumber/patcher.rb index a36e9b05..0459ba18 100644 --- a/lib/datadog/ci/contrib/cucumber/patcher.rb +++ b/lib/datadog/ci/contrib/cucumber/patcher.rb @@ -3,13 +3,12 @@ require "datadog/tracing/contrib/patcher" require_relative "instrumentation" -require_relative "step" module Datadog module CI module Contrib module Cucumber - # Patcher enables patching of 'cucumber' module. + # Patches 'cucumber' gem. module Patcher include Datadog::Tracing::Contrib::Patcher @@ -21,7 +20,6 @@ def target_version def patch ::Cucumber::Runtime.include(Instrumentation) - ::Cucumber::Core::Test::Step.include(Datadog::CI::Contrib::Cucumber::Step) end end end diff --git a/lib/datadog/ci/contrib/cucumber/step.rb b/lib/datadog/ci/contrib/cucumber/step.rb deleted file mode 100644 index 90079c3b..00000000 --- a/lib/datadog/ci/contrib/cucumber/step.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -module Datadog - module CI - module Contrib - module Cucumber - # instruments Cucumber::Core::Test::Step from cucumber-ruby-core to change - module Step - def self.included(base) - base.prepend(InstanceMethods) - end - - module InstanceMethods - def execute(*args) - test_span = CI.active_test - if test_span&.skipped_by_itr? - @action.skip(*args) - else - super - end - end - end - end - end - end - end -end diff --git a/sig/datadog/ci/contrib/cucumber/step.rbs b/sig/datadog/ci/contrib/cucumber/step.rbs deleted file mode 100644 index 4020f20b..00000000 --- a/sig/datadog/ci/contrib/cucumber/step.rbs +++ /dev/null @@ -1,16 +0,0 @@ -module Datadog - module CI - module Contrib - module Cucumber - module Step - def self.included: (untyped base) -> untyped - - module InstanceMethods - prepend ::Cucumber::Core::Test::Step - def execute: (*untyped args) -> untyped - end - end - end - end - end -end diff --git a/spec/datadog/ci/contrib/cucumber/features/step_definitions/steps.rb b/spec/datadog/ci/contrib/cucumber/features/step_definitions/steps.rb index 93541356..5cd0a377 100644 --- a/spec/datadog/ci/contrib/cucumber/features/step_definitions/steps.rb +++ b/spec/datadog/ci/contrib/cucumber/features/step_definitions/steps.rb @@ -1,5 +1,17 @@ require_relative "helpers/helper" +Before do + Datadog::CI.active_test.set_tag("cucumber_before_hook_executed", "true") +end + +After do + Datadog::CI.active_test.set_tag("cucumber_after_hook_executed", "true") +end + +AfterStep do + Datadog::CI.active_test.set_tag("cucumber_after_step_hook_executed", "true") +end + Then "datadog" do Helper.help? end diff --git a/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb b/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb index 96189abc..3be05476 100644 --- a/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb +++ b/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb @@ -236,6 +236,11 @@ itr_skipped_test = test_spans.find { |span| span.name == "cucumber scenario" } expect(itr_skipped_test).to have_test_tag(:itr_skipped_by_itr, "true") + + # check that hooks are not executed for skipped tests + expect(itr_skipped_test.get_tag("cucumber_before_hook_executed")).to be_nil + expect(itr_skipped_test.get_tag("cucumber_after_hook_executed")).to be_nil + expect(itr_skipped_test.get_tag("cucumber_after_step_hook_executed")).to be_nil end it "sets session level tags" do diff --git a/vendor/rbs/cucumber/0/cucumber.rbs b/vendor/rbs/cucumber/0/cucumber.rbs index 91843eb5..08304955 100644 --- a/vendor/rbs/cucumber/0/cucumber.rbs +++ b/vendor/rbs/cucumber/0/cucumber.rbs @@ -9,6 +9,7 @@ end class Cucumber::Runtime def formatters: () -> untyped + def begin_scenario: (untyped test_case) -> void end module Cucumber::Formatter @@ -23,6 +24,9 @@ class Cucumber::Core::Test::Result def undefined?: () -> bool def message: () -> String def exception: () -> untyped + + class Skipped < StandardError + end end module Cucumber::Core::Test::Step