From bb445dfbbd4ff3d678635134359b25f6c9efac3c Mon Sep 17 00:00:00 2001 From: Piotr Nestorow Date: Thu, 21 Mar 2024 16:51:23 +0100 Subject: [PATCH] Handle skip scenario during execution Signed-off-by: Piotr Nestorow --- execution/result/scenarioResult.go | 8 +++++++ execution/result/stepResult.go | 9 ++++++++ execution/scenarioExecutor.go | 35 ++++++++++++++++++++++++++++-- execution/stepExecutor.go | 5 +++++ version/version.go | 2 +- 5 files changed, 56 insertions(+), 3 deletions(-) diff --git a/execution/result/scenarioResult.go b/execution/result/scenarioResult.go index 40fa5a28f..ec582df03 100644 --- a/execution/result/scenarioResult.go +++ b/execution/result/scenarioResult.go @@ -31,6 +31,14 @@ func (s ScenarioResult) GetFailed() bool { return s.ProtoScenario.GetExecutionStatus() == gauge_messages.ExecutionStatus_FAILED } +func (s ScenarioResult) SetSkippedScenario() { + s.ProtoScenario.ExecutionStatus = gauge_messages.ExecutionStatus_SKIPPED +} + +func (s ScenarioResult) GetSkippedScenario() bool { + return s.ProtoScenario.GetExecutionStatus() == gauge_messages.ExecutionStatus_SKIPPED +} + func (s ScenarioResult) AddItems(protoItems []*gauge_messages.ProtoItem) { s.ProtoScenario.ScenarioItems = append(s.ProtoScenario.ScenarioItems, protoItems...) } diff --git a/execution/result/stepResult.go b/execution/result/stepResult.go index 2983e61f6..2af99a492 100644 --- a/execution/result/stepResult.go +++ b/execution/result/stepResult.go @@ -56,6 +56,15 @@ func (s *StepResult) GetStepFailed() bool { return s.StepFailed } +func (s *StepResult) GetSkippedScenario() bool { + for _, ok := range s.ProtoStep.StepExecutionResult.ExecutionResult.GetSkipScenario() { + if ok { + return true + } + } + return false +} + // GetStackTrace returns the stacktrace for step failure func (s *StepResult) GetStackTrace() string { return s.ProtoStep.GetStepExecutionResult().GetExecutionResult().GetStackTrace() diff --git a/execution/scenarioExecutor.go b/execution/scenarioExecutor.go index 8eace7b48..3ada74a57 100644 --- a/execution/scenarioExecutor.go +++ b/execution/scenarioExecutor.go @@ -73,18 +73,24 @@ func (e *scenarioExecutor) execute(i gauge.Item, r result.Result) { } e.notifyBeforeScenarioHook(scenarioResult) - if !scenarioResult.GetFailed() { + if !(scenarioResult.GetFailed() || scenarioResult.GetSkippedScenario()) { protoContexts := scenarioResult.ProtoScenario.GetContexts() protoScenItems := scenarioResult.ProtoScenario.GetScenarioItems() // context and steps are not appended together since sometime it cause the issue and the steps in step list and proto step list differs. // This is done to fix https://github.com/getgauge/gauge/issues/1629 if e.executeSteps(e.contexts, protoContexts, scenarioResult) { - e.executeSteps(scenario.Steps, protoScenItems, scenarioResult) + if !scenarioResult.GetSkippedScenario() { + e.executeSteps(scenario.Steps, protoScenItems, scenarioResult) + } } // teardowns are not appended to previous call to executeSteps to ensure they are run irrespective of context/step failure e.executeSteps(e.teardowns, scenarioResult.ProtoScenario.GetTearDownSteps(), scenarioResult) } + if scenarioResult.GetSkippedScenario() { + setSkipInfoInResult(scenarioResult, scenario, e.errMap) + } + e.notifyAfterScenarioHook(scenarioResult) scenarioResult.UpdateExecutionTime() } @@ -123,6 +129,9 @@ func (e *scenarioExecutor) notifyBeforeScenarioHook(scenarioResult *result.Scena setScenarioFailure(e.currentExecutionInfo) handleHookFailure(scenarioResult, res, result.AddPreHook) } + if skippedScenario(res.GetSkipScenario()) { + scenarioResult.SetSkippedScenario() + } message.ScenarioExecutionStartingRequest.ScenarioResult = gauge.ConvertToProtoScenarioResult(scenarioResult) e.pluginHandler.NotifyPlugins(message) } @@ -205,6 +214,11 @@ func (e *scenarioExecutor) executeSteps(steps []*gauge.Step, protoItems []*gauge return false } } + if scenarioResult.GetSkippedScenario() { + // The step execution resulted in SkipScenario. + // The rest of steps execution is skipped + break; + } } } return true @@ -222,6 +236,9 @@ func (e *scenarioExecutor) executeStep(step *gauge.Step, protoItem *gauge_messag se := &stepExecutor{runner: e.runner, pluginHandler: e.pluginHandler, currentExecutionInfo: e.currentExecutionInfo, stream: e.stream} res := se.executeStep(step, protoItem.GetStep()) protoItem.GetStep().StepExecutionResult = res.ProtoStepExecResult() + if skippedScenario(res.ProtoStepExecResult().ExecutionResult.SkipScenario) { + scenarioResult.SetSkippedScenario() + } failed = res.GetFailed() recoverable = res.ProtoStepExecResult().GetExecutionResult().GetRecoverableError() } @@ -262,6 +279,11 @@ func (e *scenarioExecutor) executeConcept(item *gauge.Step, protoConcept *gauge_ return cptResult } + if scenarioResult.GetSkippedScenario() { + // The step execution resulted in SkipScenario. + // The rest of steps execution is skipped + break; + } } } cptResult.UpdateConceptExecResult() @@ -277,6 +299,15 @@ func (e *scenarioExecutor) executeConcept(item *gauge.Step, protoConcept *gauge_ return cptResult } +func skippedScenario(result []bool) bool { + for _, ok := range result { + if ok { + return true + } + } + return false +} + func setStepFailure(executionInfo *gauge_messages.ExecutionInfo) { setScenarioFailure(executionInfo) executionInfo.CurrentStep.IsFailed = true diff --git a/execution/stepExecutor.go b/execution/stepExecutor.go index bd9d7b6fc..0010d472e 100644 --- a/execution/stepExecutor.go +++ b/execution/stepExecutor.go @@ -46,6 +46,9 @@ func (e *stepExecutor) executeStep(step *gauge.Step, protoStep *gauge_messages.P e.currentExecutionInfo.CurrentStep.StackTrace = stepExecutionStatus.GetStackTrace() setStepFailure(e.currentExecutionInfo) stepResult.SetStepFailure() + } else if stepResult.GetSkippedScenario() { + e.currentExecutionInfo.CurrentStep.ErrorMessage = stepExecutionStatus.GetErrorMessage() + e.currentExecutionInfo.CurrentStep.StackTrace = stepExecutionStatus.GetStackTrace() } stepResult.SetProtoExecResult(stepExecutionStatus) } @@ -95,3 +98,5 @@ func (e *stepExecutor) notifyAfterStepHook(stepResult *result.StepResult) { m.StepExecutionEndingRequest.StepResult = gauge.ConvertToProtoStepResult(stepResult) e.pluginHandler.NotifyPlugins(m) } + + diff --git a/version/version.go b/version/version.go index 87e212ccf..4aa25933e 100644 --- a/version/version.go +++ b/version/version.go @@ -14,7 +14,7 @@ import ( ) // CurrentGaugeVersion represents the current version of Gauge -var CurrentGaugeVersion = &Version{1, 6, 4} +var CurrentGaugeVersion = &Version{1, 6, 5} // BuildMetadata represents build information of current release (e.g, nightly build information) var BuildMetadata = ""