From c29cb899eb0520e132a87c2a00d2983c37437734 Mon Sep 17 00:00:00 2001 From: Dmitry Baev Date: Wed, 22 Jul 2026 13:43:08 +0100 Subject: [PATCH] Preserve manually assigned step statuses --- .../main/java/io/qameta/allure/Allure.java | 6 +++- .../qameta/allure/aspects/StepsAspects.java | 6 +++- .../java/io/qameta/allure/AllureTest.java | 32 ++++++++++++++++++ .../allure/aspects/StepsAspectsTest.java | 33 +++++++++++++++++++ 4 files changed, 75 insertions(+), 2 deletions(-) diff --git a/allure-java-commons/src/main/java/io/qameta/allure/Allure.java b/allure-java-commons/src/main/java/io/qameta/allure/Allure.java index 06efbf8fd..143890b73 100644 --- a/allure-java-commons/src/main/java/io/qameta/allure/Allure.java +++ b/allure-java-commons/src/main/java/io/qameta/allure/Allure.java @@ -175,7 +175,11 @@ public static T step(final ThrowableContextRunnable runnable try { final T result = runnable.run(new DefaultStepContext(key)); - getLifecycle().updateStep(key, step -> step.setStatus(Status.PASSED)); + getLifecycle().updateStep(key, step -> { + if (Objects.isNull(step.getStatus())) { + step.setStatus(Status.PASSED); + } + }); return result; } catch (Throwable throwable) { getLifecycle().updateStep( diff --git a/allure-java-commons/src/main/java/io/qameta/allure/aspects/StepsAspects.java b/allure-java-commons/src/main/java/io/qameta/allure/aspects/StepsAspects.java index d1e942955..a8cf4b3ca 100644 --- a/allure-java-commons/src/main/java/io/qameta/allure/aspects/StepsAspects.java +++ b/allure-java-commons/src/main/java/io/qameta/allure/aspects/StepsAspects.java @@ -130,7 +130,11 @@ public void stepStop() { if (Objects.isNull(key)) { return; } - getLifecycle().updateStep(key, s -> s.setStatus(Status.PASSED)); + getLifecycle().updateStep(key, step -> { + if (Objects.isNull(step.getStatus())) { + step.setStatus(Status.PASSED); + } + }); getLifecycle().stopStep(); } diff --git a/allure-java-commons/src/test/java/io/qameta/allure/AllureTest.java b/allure-java-commons/src/test/java/io/qameta/allure/AllureTest.java index 21df6f327..e9354eb4f 100644 --- a/allure-java-commons/src/test/java/io/qameta/allure/AllureTest.java +++ b/allure-java-commons/src/test/java/io/qameta/allure/AllureTest.java @@ -109,6 +109,38 @@ void shouldCreateStepsFromLambdas() { ); } + @Issue("1133") + @Test + void shouldPreserveManuallySetStatusWhenLambdaStepReturns() { + final AllureResults results = runWithinTestContext( + () -> step( + "step with manually set status", + () -> getLifecycle().updateStep(step -> step.setStatus(Status.FAILED)) + ) + ); + + assertThat(results.getTestResults()) + .flatExtracting(TestResult::getSteps) + .extracting(StepResult::getStatus) + .containsExactly(Status.FAILED); + } + + @Issue("1133") + @Test + void shouldOverrideManuallySetStatusWhenLambdaStepThrows() { + final AllureResults results = runWithinTestContext( + () -> step("failing step with manually set status", () -> { + getLifecycle().updateStep(step -> step.setStatus(Status.SKIPPED)); + throw new AssertionError("some assertion"); + }) + ); + + assertThat(results.getTestResults()) + .flatExtracting(TestResult::getSteps) + .extracting(StepResult::getStatus) + .containsExactly(Status.FAILED); + } + void doSomething() { } diff --git a/allure-java-commons/src/test/java/io/qameta/allure/aspects/StepsAspectsTest.java b/allure-java-commons/src/test/java/io/qameta/allure/aspects/StepsAspectsTest.java index 0c13ed45b..62f4a3428 100644 --- a/allure-java-commons/src/test/java/io/qameta/allure/aspects/StepsAspectsTest.java +++ b/allure-java-commons/src/test/java/io/qameta/allure/aspects/StepsAspectsTest.java @@ -55,6 +55,28 @@ void shouldCreateSteps() { .containsExactly("Simple step", "Simple step"); } + @Issue("1133") + @Test + void shouldPreserveManuallySetStatusWhenAnnotatedStepReturns() { + final AllureResults results = runWithinTestContext(this::stepWithManuallySetStatus); + + assertThat(results.getTestResults()) + .flatExtracting(TestResult::getSteps) + .extracting(StepResult::getStatus) + .containsExactly(Status.FAILED); + } + + @Issue("1133") + @Test + void shouldOverrideManuallySetStatusWhenAnnotatedStepThrows() { + final AllureResults results = runWithinTestContext(this::failingStepWithManuallySetStatus); + + assertThat(results.getTestResults()) + .flatExtracting(TestResult::getSteps) + .extracting(StepResult::getStatus) + .containsExactly(Status.FAILED); + } + @Test void shouldKeepStepStatusWithTrailingOpenStage() { final AllureResults results = runWithinTestContext(() -> stepWithTrailingStage()); @@ -354,6 +376,17 @@ void stepWithDefaultName() { void simpleStep() { } + @Step + void stepWithManuallySetStatus() { + Allure.getLifecycle().updateStep(step -> step.setStatus(Status.FAILED)); + } + + @Step + void failingStepWithManuallySetStatus() { + Allure.getLifecycle().updateStep(step -> step.setStatus(Status.SKIPPED)); + throw new AssertionError("some assertion"); + } + @Step("Method {method}") void stepWithMethodPlaceholder() { }