From 9430519b47138e5d3309bf22906a863618dba418 Mon Sep 17 00:00:00 2001 From: Dmitry Baev Date: Wed, 31 Oct 2018 17:40:04 +0300 Subject: [PATCH 1/2] add tests for cucumberjvm3 --- allure-cucumber3-jvm/build.gradle.kts | 9 + .../cucumber3jvm/AllureCucumber3Jvm.java | 73 ++-- .../cucumber3jvm/AllureCucumber3JvmTest.java | 361 ++++++++++++++++++ .../allure/cucumber3jvm/CucumberTest.java | 11 - .../qameta/allure/cucumber3jvm/Stepdefs.java | 138 ------- .../io/qameta/allure/cucumber3jvm/Steps.java | 124 ------ .../samples/BackgroundFeatureSteps.java | 28 ++ .../samples/BrokenFeatureSteps.java | 15 + .../samples/DatatableFeatureSteps.java | 16 + .../samples/SimpleFeatureSteps.java | 37 ++ .../resources/features/background.feature | 9 + .../test/resources/features/broken.feature | 4 + .../test/resources/features/datatable.feature | 8 + .../resources/features/description.feature | 17 + .../test/resources/features/examples.feature | 11 + .../test/resources/features/failed.feature | 7 + .../test/resources/features/simple.feature | 7 + .../src/test/resources/features/tags.feature | 13 + .../features/test-background.feature | 16 - .../features/test-datatables.feature | 24 -- .../resources/features/test-examples.feature | 35 -- .../features/test-pending-steps.feature | 15 - .../test-steps-with-attachments.feature | 28 -- .../src/test/resources/features/test.feature | 26 -- build.gradle.kts | 1 + 25 files changed, 584 insertions(+), 449 deletions(-) create mode 100644 allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/AllureCucumber3JvmTest.java delete mode 100644 allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/CucumberTest.java delete mode 100644 allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/Stepdefs.java delete mode 100644 allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/Steps.java create mode 100644 allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/BackgroundFeatureSteps.java create mode 100644 allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/BrokenFeatureSteps.java create mode 100644 allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/DatatableFeatureSteps.java create mode 100644 allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/SimpleFeatureSteps.java create mode 100644 allure-cucumber3-jvm/src/test/resources/features/background.feature create mode 100644 allure-cucumber3-jvm/src/test/resources/features/broken.feature create mode 100644 allure-cucumber3-jvm/src/test/resources/features/datatable.feature create mode 100644 allure-cucumber3-jvm/src/test/resources/features/description.feature create mode 100644 allure-cucumber3-jvm/src/test/resources/features/examples.feature create mode 100644 allure-cucumber3-jvm/src/test/resources/features/failed.feature create mode 100644 allure-cucumber3-jvm/src/test/resources/features/simple.feature create mode 100644 allure-cucumber3-jvm/src/test/resources/features/tags.feature delete mode 100644 allure-cucumber3-jvm/src/test/resources/features/test-background.feature delete mode 100644 allure-cucumber3-jvm/src/test/resources/features/test-datatables.feature delete mode 100644 allure-cucumber3-jvm/src/test/resources/features/test-examples.feature delete mode 100644 allure-cucumber3-jvm/src/test/resources/features/test-pending-steps.feature delete mode 100644 allure-cucumber3-jvm/src/test/resources/features/test-steps-with-attachments.feature delete mode 100644 allure-cucumber3-jvm/src/test/resources/features/test.feature diff --git a/allure-cucumber3-jvm/build.gradle.kts b/allure-cucumber3-jvm/build.gradle.kts index d6fe63b24..cb14c95df 100644 --- a/allure-cucumber3-jvm/build.gradle.kts +++ b/allure-cucumber3-jvm/build.gradle.kts @@ -9,7 +9,15 @@ dependencies { compile("io.cucumber:cucumber-core:$cucumberVersion") compile("io.cucumber:cucumber-java:$cucumberVersion") compile(project(":allure-java-commons")) + + testCompile("commons-io:commons-io") testCompile("io.cucumber:cucumber-testng:$cucumberVersion") + testCompile("io.github.glytching:junit-extensions") + testCompile("org.assertj:assertj-core") + testCompile("org.junit.jupiter:junit-jupiter-api") + testCompile("org.slf4j:slf4j-simple") + testCompile(project(":allure-java-commons-test")) + testRuntime("org.junit.jupiter:junit-jupiter-engine") } tasks.named("jar") { @@ -21,6 +29,7 @@ tasks.named("jar") { } tasks.named("test") { + useJUnitPlatform() doFirst { jvmArgs("-javaagent:${agent.singleFile}") } diff --git a/allure-cucumber3-jvm/src/main/java/io/qameta/allure/cucumber3jvm/AllureCucumber3Jvm.java b/allure-cucumber3-jvm/src/main/java/io/qameta/allure/cucumber3jvm/AllureCucumber3Jvm.java index f0e520042..666c083fe 100644 --- a/allure-cucumber3-jvm/src/main/java/io/qameta/allure/cucumber3jvm/AllureCucumber3Jvm.java +++ b/allure-cucumber3-jvm/src/main/java/io/qameta/allure/cucumber3jvm/AllureCucumber3Jvm.java @@ -31,7 +31,6 @@ import io.qameta.allure.model.StatusDetails; import io.qameta.allure.model.StepResult; import io.qameta.allure.model.TestResult; -import io.qameta.allure.util.ResultsUtils; import java.io.ByteArrayInputStream; import java.nio.charset.Charset; @@ -46,6 +45,9 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +import static io.qameta.allure.util.ResultsUtils.getStatus; +import static io.qameta.allure.util.ResultsUtils.getStatusDetails; + /** * Allure plugin for Cucumber JVM 3.0. */ @@ -72,7 +74,11 @@ public class AllureCucumber3Jvm implements Formatter { private final EventHandler stepFinishedHandler = this::handleTestStepFinished; public AllureCucumber3Jvm() { - this.lifecycle = Allure.getLifecycle(); + this(Allure.getLifecycle()); + } + + public AllureCucumber3Jvm(final AllureLifecycle lifecycle) { + this.lifecycle = lifecycle; } @Override @@ -104,10 +110,14 @@ private void handleTestCaseStarted(final TestCaseStarted event) { final LabelBuilder labelBuilder = new LabelBuilder(currentFeature, event.testCase, tags); + final String name = event.testCase.getName(); + final String featureName = currentFeature.getName(); + final TestResult result = new TestResult() .setUuid(getTestCaseUuid(event.testCase)) .setHistoryId(getHistoryId(event.testCase)) - .setName(event.testCase.getName()) + .setFullName(String.format("%s: %s", featureName, name)) + .setName(name) .setLabels(labelBuilder.getScenarioLabels()) .setLinks(labelBuilder.getScenarioLinks()); @@ -128,22 +138,18 @@ private void handleTestCaseStarted(final TestCaseStarted event) { } private void handleTestCaseFinished(final TestCaseFinished event) { - final StatusDetails statusDetails = - ResultsUtils.getStatusDetails(event.result.getError()).orElse(new StatusDetails()); - - if (statusDetails.getMessage() != null && statusDetails.getTrace() != null) { - lifecycle.updateTestCase(getTestCaseUuid(event.testCase), scenarioResult -> - scenarioResult - .setStatus(translateTestCaseStatus(event.result)) - .setStatusDetails(statusDetails)); - } else { - lifecycle.updateTestCase(getTestCaseUuid(event.testCase), scenarioResult -> - scenarioResult - .setStatus(translateTestCaseStatus(event.result))); - } - - lifecycle.stopTestCase(getTestCaseUuid(event.testCase)); - lifecycle.writeTestCase(getTestCaseUuid(event.testCase)); + final String uuid = getTestCaseUuid(event.testCase); + lifecycle.updateTestCase( + uuid, + testResult -> testResult.setStatus(translateTestCaseStatus(event.result)) + ); + final Optional details = getStatusDetails(event.result.getError()); + details.ifPresent(statusDetails -> lifecycle.updateTestCase( + uuid, + testResult -> testResult.setStatusDetails(statusDetails) + )); + lifecycle.stopTestCase(uuid); + lifecycle.writeTestCase(uuid); } private void handleTestStepStarted(final TestStepStarted event) { @@ -212,17 +218,20 @@ private String getHistoryId(final TestCase testCase) { } private Status translateTestCaseStatus(final Result testCaseResult) { - Status allureStatus; - if (testCaseResult.getStatus() == Result.Type.UNDEFINED || testCaseResult.getStatus() == Result.Type.PENDING) { - allureStatus = Status.SKIPPED; - } else { - try { - allureStatus = Status.fromValue(testCaseResult.getStatus().lowerCaseName()); - } catch (IllegalArgumentException e) { - allureStatus = Status.BROKEN; - } + switch (testCaseResult.getStatus()) { + case FAILED: + return getStatus(testCaseResult.getError()) + .orElse(Status.FAILED); + case PASSED: + return Status.PASSED; + case SKIPPED: + case PENDING: + return Status.SKIPPED; + case AMBIGUOUS: + case UNDEFINED: + default: + return null; } - return allureStatus; } private List getExamplesAsParameters(final ScenarioOutline scenarioOutline) { @@ -263,7 +272,7 @@ private void handleHookStep(final TestStepFinished event) { Consumer stepResult = result -> result.setStatus(translateTestCaseStatus(event.result)); if (!Status.PASSED.equals(translateTestCaseStatus(event.result))) { - final StatusDetails statusDetails = ResultsUtils.getStatusDetails(event.result.getError()).get(); + final StatusDetails statusDetails = getStatusDetails(event.result.getError()).get(); final HookTestStep hookTestStep = (HookTestStep) event.testStep; if (hookTestStep.getHookType() == HookType.Before) { final TagParser tagParser = new TagParser(currentFeature, currentTestCase); @@ -289,7 +298,7 @@ private void handlePickleStep(final TestStepFinished event) { final StatusDetails statusDetails; if (event.result.getStatus() == Result.Type.UNDEFINED) { statusDetails = - ResultsUtils.getStatusDetails(new PendingException("TODO: implement me")) + getStatusDetails(new PendingException("TODO: implement me")) .orElse(new StatusDetails()); lifecycle.updateTestCase(getTestCaseUuid(currentTestCase), scenarioResult -> scenarioResult @@ -297,7 +306,7 @@ private void handlePickleStep(final TestStepFinished event) { .setStatusDetails(statusDetails)); } else { statusDetails = - ResultsUtils.getStatusDetails(event.result.getError()) + getStatusDetails(event.result.getError()) .orElse(new StatusDetails()); } diff --git a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/AllureCucumber3JvmTest.java b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/AllureCucumber3JvmTest.java new file mode 100644 index 000000000..bc1e8e9dd --- /dev/null +++ b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/AllureCucumber3JvmTest.java @@ -0,0 +1,361 @@ +package io.qameta.allure.cucumber3jvm; + +import cucumber.runtime.ClassFinder; +import cucumber.runtime.Runtime; +import cucumber.runtime.RuntimeOptions; +import cucumber.runtime.io.MultiLoader; +import cucumber.runtime.io.ResourceLoader; +import cucumber.runtime.io.ResourceLoaderClassFinder; +import cucumber.runtime.model.CucumberFeature; +import gherkin.AstBuilder; +import gherkin.Parser; +import gherkin.TokenMatcher; +import gherkin.ast.GherkinDocument; +import io.github.glytching.junit.extension.system.SystemProperty; +import io.github.glytching.junit.extension.system.SystemPropertyExtension; +import io.qameta.allure.AllureLifecycle; +import io.qameta.allure.Epic; +import io.qameta.allure.model.Attachment; +import io.qameta.allure.model.Label; +import io.qameta.allure.model.Link; +import io.qameta.allure.model.Parameter; +import io.qameta.allure.model.Stage; +import io.qameta.allure.model.Status; +import io.qameta.allure.model.StatusDetails; +import io.qameta.allure.model.StepResult; +import io.qameta.allure.model.TestResult; +import io.qameta.allure.test.AllureResultsWriterStub; +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static java.lang.Thread.currentThread; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; + +/** + * @author charlie (Dmitry Baev). + */ +@Epic("CucumberJVM 3.0 integration") +@SuppressWarnings("unchecked") +class AllureCucumber3JvmTest { + + @Test + void shouldSetName() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/simple.feature"); + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getName) + .containsExactlyInAnyOrder("Add a to b"); + + } + + @Test + void shouldSetStatus() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/simple.feature"); + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getStatus) + .containsExactlyInAnyOrder(Status.PASSED); + } + + @Test + void shouldSetFailedStatus() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/failed.feature"); + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getStatus) + .containsExactlyInAnyOrder(Status.FAILED); + } + + @Test + void shouldSetStatusDetails() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/failed.feature"); + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getStatusDetails) + .extracting(StatusDetails::getMessage) + .containsExactlyInAnyOrder("expected [123] but found [15]"); + } + + @Test + void shouldSetBrokenStatus() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/broken.feature"); + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getStatus) + .containsExactlyInAnyOrder(Status.BROKEN); + } + + @Test + void shouldSetStage() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/simple.feature"); + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getStage) + .containsExactlyInAnyOrder(Stage.FINISHED); + } + + @Test + void shouldSetStart() throws IOException { + final long before = Instant.now().toEpochMilli(); + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/simple.feature"); + final long after = Instant.now().toEpochMilli(); + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getStart) + .allMatch(v -> v >= before && v <= after); + } + + @Test + void shouldSetStop() throws IOException { + final long before = Instant.now().toEpochMilli(); + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/simple.feature"); + final long after = Instant.now().toEpochMilli(); + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getStop) + .allMatch(v -> v >= before && v <= after); + } + + @Test + void shouldSetFullName() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/simple.feature"); + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getFullName) + .containsExactlyInAnyOrder("Simple feature: Add a to b"); + } + + @Test + void shouldSetDescription() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/description.feature"); + + final String expected = "This is description for current feature.\n" + + "It should appear on each scenario in report"; + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getDescription) + .containsExactlyInAnyOrder( + expected, + expected + ); + } + + @Test + void shouldAddDataTableAttachment() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/datatable.feature"); + + final List attachments = writer.getTestResults().stream() + .map(TestResult::getSteps) + .flatMap(Collection::stream) + .map(StepResult::getAttachments) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + + assertThat(attachments) + .extracting(Attachment::getName, Attachment::getType) + .containsExactlyInAnyOrder( + tuple("Data table", "text/tab-separated-values") + ); + + final Attachment dataTableAttachment = attachments.iterator().next(); + final Map attachmentFiles = writer.getAttachments(); + assertThat(attachmentFiles) + .containsKeys(dataTableAttachment.getSource()); + + final byte[] bytes = attachmentFiles.get(dataTableAttachment.getSource()); + final String attachmentContent = new String(bytes, StandardCharsets.UTF_8); + + assertThat(attachmentContent) + .isEqualTo("name\tlogin\temail\n" + + "Viktor\tclicman\tclicman@ya.ru\n" + + "Viktor2\tclicman2\tclicman2@ya.ru\n" + ); + + } + + @Test + void shouldAddBackgroundSteps() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/background.feature"); + + final List testResults = writer.getTestResults(); + + assertThat(testResults) + .hasSize(1) + .flatExtracting(TestResult::getSteps) + .extracting(StepResult::getName) + .containsExactly( + "Given cat is sad", + "And cat is murmur", + "When Pet the cat", + "Then Cat is happy" + ); + } + + @Test + void shouldAddParametersFromExamples() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/examples.feature"); + + final List testResults = writer.getTestResults(); + + assertThat(testResults) + .hasSize(2); + + assertThat(testResults) + .flatExtracting(TestResult::getParameters) + .extracting(Parameter::getName, Parameter::getValue) + .containsExactlyInAnyOrder( + tuple("a", "1"), tuple("b", "3"), tuple("result", "4"), + tuple("a", "2"), tuple("b", "4"), tuple("result", "6") + ); + + } + + @Test + void shouldAddTags() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/tags.feature"); + + final List testResults = writer.getTestResults(); + + assertThat(testResults) + .flatExtracting(TestResult::getLabels) + .extracting(Label::getName, Label::getValue) + .contains( + tuple("tag", "FeatureTag"), + tuple("tag", "good") + ); + } + + @ExtendWith(SystemPropertyExtension.class) + @SystemProperty(name = "allure.link.issue.pattern", value = "https://example.org/issue/{}") + @SystemProperty(name = "allure.link.tms.pattern", value = "https://example.org/tms/{}") + @Test + void shouldAddLinks() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/tags.feature"); + + final List testResults = writer.getTestResults(); + + assertThat(testResults) + .flatExtracting(TestResult::getLinks) + .extracting(Link::getName, Link::getType, Link::getUrl) + .contains( + tuple("OAT-4444", "tms", "https://example.org/tms/OAT-4444"), + tuple("BUG-22400", "issue", "https://example.org/issue/BUG-22400") + ); + } + + @Test + void shouldAddBddLabels() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/tags.feature"); + + final List testResults = writer.getTestResults(); + + assertThat(testResults) + .flatExtracting(TestResult::getLabels) + .extracting(Label::getName, Label::getValue) + .contains( + tuple("feature", "Test Simple Scenarios"), + tuple("story", "Add a to b") + ); + } + + @Test + void shouldThreadHostLabels() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/tags.feature"); + + final List testResults = writer.getTestResults(); + + assertThat(testResults) + .flatExtracting(TestResult::getLabels) + .extracting(Label::getName) + .contains("host", "thread"); + } + + @Test + void shouldCommonLabels() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/tags.feature"); + + final List testResults = writer.getTestResults(); + + assertThat(testResults) + .flatExtracting(TestResult::getLabels) + .extracting(Label::getName, Label::getValue) + .contains( + tuple("package", "Test Simple Scenarios"), + tuple("suite", "Test Simple Scenarios"), + tuple("testClass", "Add a to b") + ); + } + + private void runFeature(final AllureResultsWriterStub writer, + final String featureResource) throws IOException { + + final AllureLifecycle lifecycle = new AllureLifecycle(writer); + final AllureCucumber3Jvm cucumber3Jvm = new AllureCucumber3Jvm(lifecycle); + final ClassLoader classLoader = currentThread().getContextClassLoader(); + final ResourceLoader resourceLoader = new MultiLoader(classLoader); + final ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); + final RuntimeOptions options = new RuntimeOptions(Arrays.asList( + "--glue", "io.qameta.allure.cucumber3jvm.samples", + "--plugin", "null" + )); + final Runtime runtime = new Runtime(resourceLoader, classFinder, classLoader, options); + + options.addPlugin(cucumber3Jvm); + options.noSummaryPrinter(); + + final String gherkin = readResource(featureResource); + Parser parser = new Parser<>(new AstBuilder()); + TokenMatcher matcher = new TokenMatcher(); + GherkinDocument gherkinDocument = parser.parse(gherkin, matcher); + CucumberFeature feature = new CucumberFeature(gherkinDocument, featureResource, gherkin); + + feature.sendTestSourceRead(runtime.getEventBus()); + runtime.runFeature(feature); + } + + private String readResource(final String resourceName) throws IOException { + try (InputStream is = currentThread().getContextClassLoader().getResourceAsStream(resourceName)) { + return IOUtils.toString(is, StandardCharsets.UTF_8); + } + } +} diff --git a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/CucumberTest.java b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/CucumberTest.java deleted file mode 100644 index df59ba140..000000000 --- a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/CucumberTest.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.qameta.allure.cucumber3jvm; - -import cucumber.api.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; - -@CucumberOptions( - features = {"src/test/resources/features/"}, - plugin = {"io.qameta.allure.cucumber3jvm.AllureCucumber3Jvm"}, - tags = {"@good"}) -public class CucumberTest extends AbstractTestNGCucumberTests { -} diff --git a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/Stepdefs.java b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/Stepdefs.java deleted file mode 100644 index 7de811cb1..000000000 --- a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/Stepdefs.java +++ /dev/null @@ -1,138 +0,0 @@ -package io.qameta.allure.cucumber3jvm; - -//import cucumber.api.DataTable; -import io.cucumber.datatable.DataTable; -import cucumber.api.PendingException; -import cucumber.api.java.After; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; -import io.qameta.allure.Allure; -import io.qameta.allure.Attachment; -import java.awt.AWTException; -import java.awt.Rectangle; -import java.awt.Robot; -import java.awt.Toolkit; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import javax.imageio.ImageIO; - -import io.qameta.allure.Step; -import org.testng.Assert; - -public class Stepdefs { - - private int a, b, c; - - @Before - public void setUp() { - System.out.println("Before"); - } - - @After - public void tearDown() { - System.out.println("After"); - } - - @Given("^a is (\\d+)$") - public void a_is(int arg1) throws Throwable { - this.a = arg1; - } - - @Given("^b is (\\d+)$") - public void b_is(int arg1) throws Throwable { - this.b = arg1; - } - - @When("^I add a to b$") - public void i_add_a_to_b() throws Throwable { - this.c = this.a + this.b; - } - - @Then("^result is (\\d+)$") - public void result_is(int arg1) throws Throwable { - Assert.assertEquals(this.c, arg1); - } - - @Attachment(type = "image/png", fileExtension = "png", value = "att") - public byte[] attach() { - try { - BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ImageIO.write(image, "png", baos); - baos.flush(); - byte[] imageInByte = baos.toByteArray(); - baos.close(); - return imageInByte; - } catch (AWTException | IOException e) { - return null; - } - } - - @Given("^users are:$") - public void usersAre(DataTable table) throws Throwable { - } - - @Given("^step with argument (\\d+) and data table:$") - public void stepWithArgumentAndDataTable(int argument, DataTable table) throws Throwable { - } - - @When("^I attach picture to step$") - public void iAttachPictureToStep() throws Throwable { - Allure.addAttachment("Picture of a kitten", - getClass().getClassLoader().getResourceAsStream("images/totally-open-source-kitten.jpeg")); - } - - @Then("^it is displayed in report$") - public void itIsDisplayedInReport() throws Throwable { - sleep(); - } - - private void sleep() throws InterruptedException { -// Thread.sleep(1000 + new Random().nextInt(1000)); - } - - @When("^I execute steps with @Step$") - public void iExecuteStepsWithStep() throws Throwable { - methodWithStepAnnotation(); - } - - @Step("Sub-step step") - private void methodWithStepAnnotation(){ - - } - - @When("^I attach file in sub-step with (.+) in name$") - public void iAttachFileInSubStep(String value) throws Throwable { - subStepWithAttachment(); - } - - @When("^I attach file in sub-step$") - public void iAttachFileInSubStep() throws Throwable { - subStepWithAttachment(); - } - - @Step("Sub-step with attachment File") - @Attachment - private byte[] subStepWithAttachment() throws IOException { - return Files.readAllBytes( - new File(getClass().getClassLoader().getResource("images/totally-open-source-kitten.jpeg").getFile()).toPath() - ); - } - - @When("^call step with PendingException$") - public void callUnimplementedStep() throws Throwable { - // Write code here that turns the phrase above into concrete actions - throw new PendingException(); - } - - @Then("^test case market as unimplemented$") - public void testCaseMarketAsUnimplemented() throws Throwable { - // Write code here that turns the phrase above into concrete actions - throw new PendingException(); - } -} diff --git a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/Steps.java b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/Steps.java deleted file mode 100644 index 0d8697db7..000000000 --- a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/Steps.java +++ /dev/null @@ -1,124 +0,0 @@ -package io.qameta.allure.cucumber3jvm; - -import cucumber.api.PendingException; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; -import cucumber.api.java.ru.Дано; -import cucumber.api.java.ru.Когда; -import cucumber.api.java.ru.То; -import cucumber.api.java.ru.Тогда; -import org.testng.Assert; - -public class Steps { - - private String URL_First; - private String URL_Second; - private String URL_concat; - - private int a; - private int b; - private int c; - private int sum; - - @Дано("^первое число (\\d+)$") - public void первое_число(int digit) throws Throwable { - sleep(); - a = digit; - } - - @Дано("^второе число (\\d+)$") - public void второе_число(int digit) throws Throwable { - sleep(); - b = digit; - } - - @Дано("^третье число (\\d+)$") - public void третье_число(int digit) throws Throwable { - sleep(); - c = digit; - } - - @Когда("^я их складываю$") - public void я_их_складываю() throws Throwable { - sleep(); - sum = a + b + c; - } - - @Тогда("^сумма равна (\\d+)$") - public void сумма_равна(int result) throws Throwable { - sleep(); - Assert.assertEquals(result, sum); - } - - @Дано("^сломанный сценарий$") - public void сломанный_сценарий() throws Throwable { - sleep(); - try { - Object o = 1; - String fail = (String) o; - } catch (Exception e) { - new Stepdefs().attach(); - throw e; - } - } - - @Когда("^отображается отчет$") - public void отображается_отчет() throws Throwable { - sleep(); - } - - @То("^видно исключение$") - public void видно_исключение() throws Throwable { - sleep(); - } - - @То("^шаг с PendingException$") - public void шаг_с_PendingException() throws Throwable { - throw new PendingException(); - } - - @Given("^Anything in given with (.+)$") - public void anything_in_given_with_dots_This_is_an_example(String text) throws Throwable { - sleep(); - } - - @When("^whe run the scenario$") - public void whe_run_the_scenario() throws Throwable { - sleep(); - } - - @Then("^scenario name shuld be complete$") - public void scenario_name_shuld_be_complete() throws Throwable { - sleep(); - } - - @Given("^An URL (.+)$") - public void an_URL(String URL) throws Throwable { - sleep(); - this.URL_First = URL; - } - - @Given("^another URL (.+)$") - public void another_URL(String URL) throws Throwable { - sleep(); - this.URL_Second = URL; - } - - @When("^whe concatenate it$") - public void whe_concatenate_it() throws Throwable { - sleep(); - this.URL_concat = this.URL_First + this.URL_Second; - } - - @Then("^Result should be (.+)$") - public void result_should_be(String expected) throws Throwable { - Assert.assertEquals(expected, URL_concat); - } - - - private void sleep() throws InterruptedException { -// Thread.sleep(1000 + new Random().nextInt(1000)); - } - -} diff --git a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/BackgroundFeatureSteps.java b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/BackgroundFeatureSteps.java new file mode 100644 index 000000000..20ecbca56 --- /dev/null +++ b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/BackgroundFeatureSteps.java @@ -0,0 +1,28 @@ +package io.qameta.allure.cucumber3jvm.samples; + +import cucumber.api.java.en.Given; +import cucumber.api.java.en.Then; +import cucumber.api.java.en.When; + +/** + * @author charlie (Dmitry Baev). + */ +public class BackgroundFeatureSteps { + + @Given("^cat is sad$") + public void catIsSad() { + } + + @Given("^cat is murmur$") + public void catIsMurMur() { + } + + @When("^pet the cat$") + public void petTheCat() { + } + + @Then("^cat is happy$") + public void catIsHappy() { + } + +} diff --git a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/BrokenFeatureSteps.java b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/BrokenFeatureSteps.java new file mode 100644 index 000000000..d164bae25 --- /dev/null +++ b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/BrokenFeatureSteps.java @@ -0,0 +1,15 @@ +package io.qameta.allure.cucumber3jvm.samples; + +import cucumber.api.java.en.Given; + +/** + * @author charlie (Dmitry Baev). + */ +public class BrokenFeatureSteps { + + @Given("^everything is broken$") + public void everythingIsBroken() { + throw new RuntimeException("Oops"); + } + +} diff --git a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/DatatableFeatureSteps.java b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/DatatableFeatureSteps.java new file mode 100644 index 000000000..9f4872e4b --- /dev/null +++ b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/DatatableFeatureSteps.java @@ -0,0 +1,16 @@ +package io.qameta.allure.cucumber3jvm.samples; + +import cucumber.api.java.en.Given; +import io.cucumber.datatable.DataTable; + +/** + * @author charlie (Dmitry Baev). + */ +@SuppressWarnings("unused") +public class DatatableFeatureSteps { + + @Given("^users are:$") + public void usersAre(DataTable table) { + } + +} diff --git a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/SimpleFeatureSteps.java b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/SimpleFeatureSteps.java new file mode 100644 index 000000000..e5a0e2787 --- /dev/null +++ b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/samples/SimpleFeatureSteps.java @@ -0,0 +1,37 @@ +package io.qameta.allure.cucumber3jvm.samples; + +import cucumber.api.java.en.Given; +import cucumber.api.java.en.Then; +import cucumber.api.java.en.When; +import org.testng.Assert; + +/** + * @author charlie (Dmitry Baev). + */ +public class SimpleFeatureSteps { + + private int a; + private int b; + private int c; + + @Given("^a is (\\d+)$") + public void a_is(int arg1) { + this.a = arg1; + } + + @Given("^b is (\\d+)$") + public void b_is(int arg1) { + this.b = arg1; + } + + @When("^I add a to b$") + public void i_add_a_to_b() { + this.c = this.a + this.b; + } + + @Then("^result is (\\d+)$") + public void result_is(int arg1) { + Assert.assertEquals(this.c, arg1); + } + +} diff --git a/allure-cucumber3-jvm/src/test/resources/features/background.feature b/allure-cucumber3-jvm/src/test/resources/features/background.feature new file mode 100644 index 000000000..307f10267 --- /dev/null +++ b/allure-cucumber3-jvm/src/test/resources/features/background.feature @@ -0,0 +1,9 @@ +Feature: Test Scenarios with backgrounds + + Background: + Given cat is sad + And cat is murmur + + Scenario: Scenario with background + When Pet the cat + Then Cat is happy diff --git a/allure-cucumber3-jvm/src/test/resources/features/broken.feature b/allure-cucumber3-jvm/src/test/resources/features/broken.feature new file mode 100644 index 000000000..42bd7ba4f --- /dev/null +++ b/allure-cucumber3-jvm/src/test/resources/features/broken.feature @@ -0,0 +1,4 @@ +Feature: Simple feature + + Scenario: Exception during step + Given everything is broken diff --git a/allure-cucumber3-jvm/src/test/resources/features/datatable.feature b/allure-cucumber3-jvm/src/test/resources/features/datatable.feature new file mode 100644 index 000000000..ea5e94d3b --- /dev/null +++ b/allure-cucumber3-jvm/src/test/resources/features/datatable.feature @@ -0,0 +1,8 @@ +Feature: Test Scenarios with Data Tables + + Scenario: Simple data table + Given users are: + | name | login | email | + | Viktor | clicman | clicman@ya.ru | + | Viktor2 | clicman2 | clicman2@ya.ru | + diff --git a/allure-cucumber3-jvm/src/test/resources/features/description.feature b/allure-cucumber3-jvm/src/test/resources/features/description.feature new file mode 100644 index 000000000..935b6731a --- /dev/null +++ b/allure-cucumber3-jvm/src/test/resources/features/description.feature @@ -0,0 +1,17 @@ +Feature: Descriptions feature + +This is description for current feature. +It should appear on each scenario in report + + Scenario: Add a to b (1) + Given a is 5 + And b is 10 + When I add a to b + Then result is 15 + + Scenario: Add a to b (2) + Given a is 1 + And b is 2 + When I add a to b + Then result is 3 + diff --git a/allure-cucumber3-jvm/src/test/resources/features/examples.feature b/allure-cucumber3-jvm/src/test/resources/features/examples.feature new file mode 100644 index 000000000..ecba7b79e --- /dev/null +++ b/allure-cucumber3-jvm/src/test/resources/features/examples.feature @@ -0,0 +1,11 @@ +Feature: Test Scenarios with Examples + + Scenario Outline: Scenario with Positive Examples + Given a is + And b is + When I add a to b + Then result is + Examples: + | a | b | result | + | 1 | 3 | 4 | + | 2 | 4 | 6 | diff --git a/allure-cucumber3-jvm/src/test/resources/features/failed.feature b/allure-cucumber3-jvm/src/test/resources/features/failed.feature new file mode 100644 index 000000000..a70f8ec79 --- /dev/null +++ b/allure-cucumber3-jvm/src/test/resources/features/failed.feature @@ -0,0 +1,7 @@ +Feature: Simple feature + + Scenario: Add a to b + Given a is 5 + And b is 10 + When I add a to b + Then result is 123 diff --git a/allure-cucumber3-jvm/src/test/resources/features/simple.feature b/allure-cucumber3-jvm/src/test/resources/features/simple.feature new file mode 100644 index 000000000..c5b5f2b5f --- /dev/null +++ b/allure-cucumber3-jvm/src/test/resources/features/simple.feature @@ -0,0 +1,7 @@ +Feature: Simple feature + + Scenario: Add a to b + Given a is 5 + And b is 10 + When I add a to b + Then result is 15 diff --git a/allure-cucumber3-jvm/src/test/resources/features/tags.feature b/allure-cucumber3-jvm/src/test/resources/features/tags.feature new file mode 100644 index 000000000..2632623ee --- /dev/null +++ b/allure-cucumber3-jvm/src/test/resources/features/tags.feature @@ -0,0 +1,13 @@ +@FeatureTag +@tmsLink=OAT-4444 +@flaky +@issue=BUG-22400 +Feature: Test Simple Scenarios + + @good + Scenario: Add a to b + Given a is 5 + And b is 10 + When I add a to b + Then result is 15 + diff --git a/allure-cucumber3-jvm/src/test/resources/features/test-background.feature b/allure-cucumber3-jvm/src/test/resources/features/test-background.feature deleted file mode 100644 index e7958bf01..000000000 --- a/allure-cucumber3-jvm/src/test/resources/features/test-background.feature +++ /dev/null @@ -1,16 +0,0 @@ -@FeatureTag @tmsLink=OAT-4444 @flaky @issue=BUG-22400 -Feature: Test Scenarios with backgrounds - - Background: - Given a is 5 - And b is 10 - - @good - Scenario: Scenario with background - When I add a to b - Then result is 15 - - @bad - Scenario: Bad scenario with background - When I add a to b - Then result is 16 diff --git a/allure-cucumber3-jvm/src/test/resources/features/test-datatables.feature b/allure-cucumber3-jvm/src/test/resources/features/test-datatables.feature deleted file mode 100644 index 09cf9646c..000000000 --- a/allure-cucumber3-jvm/src/test/resources/features/test-datatables.feature +++ /dev/null @@ -1,24 +0,0 @@ -@FeatureTag @tmsLink=OAT-4444 @flaky @issue=BUG-22400 -Feature: Test Scenarios with Data Tables - - @good @link=http://yandex.ru @link.mylink-112-qwe=mylinkname-12 @link.mylink-112-qwe=12_12-12 - Scenario: Simple data table - Given users are: - | name | login | email | - | Viktor | clicman | clicman@ya.ru | - | Viktor2 | clicman2 | clicman2@ya.ru | - And users are: - | name1 | login1 | email1 | - | Viktor | clicman | clicman@ya.ru | - | Viktor2 | clicman2 | clicman2@ya.ru | - - @good - Scenario: Steps with argumets and data tables - Given users are: - | name | login | email | - | Viktor | clicman | clicman@ya.ru | - | Viktor2 | clicman2 | clicman2@ya.ru | - And step with argument 5 and data table: - | name1 | login1 | email1 | - | Viktor | clicman | clicman@ya.ru | - | Viktor2 | clicman2 | clicman2@ya.ru | diff --git a/allure-cucumber3-jvm/src/test/resources/features/test-examples.feature b/allure-cucumber3-jvm/src/test/resources/features/test-examples.feature deleted file mode 100644 index 3c63ae53c..000000000 --- a/allure-cucumber3-jvm/src/test/resources/features/test-examples.feature +++ /dev/null @@ -1,35 +0,0 @@ -@FeatureTag @tmsLink=OAT-4444 @flaky @issue=BUG-22400 -Feature: Test Scenarios with Examples - - @good @tmsLink=OAT-219 @severity=blocker @issue=BUG-12312 @known @muted @goofy=dog @melted @link=http://yandex.ru - Scenario Outline: Scenario with Positive Examples - Given a is - And b is - When I add a to b - Then result is - Examples: - | a | b | result | - | 1 | 3 | 4 | - | 2 | 4 | 6 | - - @good @tmsLink=OAT-219 @severity=blocker @issue=BUG-12312 @known @muted @goofy=dog @melted @link=http://yandex.ru - Scenario Outline: Scenario with Arguments in description: and == - Given a is - And b is - When I add a to b - Then result is - Examples: - | a | b | result | - | 1 | 3 | 4 | - | 2 | 4 | 6 | - - @bad @tmsLink=OAT-219 @severity=blocker @issue=BUG-12312 @known @muted @goofy=dog @melted @link=http://yandex.ru - Scenario Outline: Scenario with Negative Examples - Given a is - And b is - When I add a to b - Then result is - Examples: - | a | b | result | - | 1 | 3 | 6 | - | 2 | 4 | 1 | diff --git a/allure-cucumber3-jvm/src/test/resources/features/test-pending-steps.feature b/allure-cucumber3-jvm/src/test/resources/features/test-pending-steps.feature deleted file mode 100644 index 48229af72..000000000 --- a/allure-cucumber3-jvm/src/test/resources/features/test-pending-steps.feature +++ /dev/null @@ -1,15 +0,0 @@ -Feature: Test Scenarios with Pending Steps - - @skipped - Scenario: Scenario with unimplementd steps - Given первое число 1 - When call unimplemented step - And второе число 2 - Then test case market as unimplemented - - @skipped - Scenario: Scenario with pending steps - Given первое число 1 - When call step with PendingException - And второе число 2 - Then test case market as unimplemented diff --git a/allure-cucumber3-jvm/src/test/resources/features/test-steps-with-attachments.feature b/allure-cucumber3-jvm/src/test/resources/features/test-steps-with-attachments.feature deleted file mode 100644 index e97bca753..000000000 --- a/allure-cucumber3-jvm/src/test/resources/features/test-steps-with-attachments.feature +++ /dev/null @@ -1,28 +0,0 @@ -@FeatureTag @tmsLink=OAT-4444 @flaky @issue=BUG-22400 -Feature: Test Scenarios with Attachments and Steps - - @good - Scenario: Simple Image attachment using Allure.addAttachmnet - When I attach picture to step - Then it is displayed in report - - @good - Scenario: Step with sub step @Step and @Attachment - When I attach file in sub-step - Then it is displayed in report - - @good - Scenario Outline: Outline with steps which contain sub-steps and attachments - When I attach file in sub-step with in name - Then it is displayed in report - - Examples: - | SOMEPARAMETER | - | SOMEVALUE | - | ANOTHERVALUE | - | VALUE WITH SPACE | - - @good - Scenario: Step with sub step @Step - When I execute steps with @Step - Then it is displayed in report diff --git a/allure-cucumber3-jvm/src/test/resources/features/test.feature b/allure-cucumber3-jvm/src/test/resources/features/test.feature deleted file mode 100644 index f319f9e19..000000000 --- a/allure-cucumber3-jvm/src/test/resources/features/test.feature +++ /dev/null @@ -1,26 +0,0 @@ -@FeatureTag @tmsLink=OAT-4444 @flaky @issue=BUG-22400 -Feature: Test Simple Scenarios - - This is description for current feature. - It should appear on each scenario in report - - @good - Scenario: Add a to b - Given a is 5 - And b is 10 - When I add a to b - Then result is 15 - - @good @tmsLink= @tmsLink=ISSUE=12345 - Scenario: Scenario with empty tag and tag with more than one = - Given a is 5 - And b is 10 - When I add a to b - Then result is 15 - - @bad - Scenario: Wrong add a to b - Given a is 5 - And b is 10 - When I add a to b - Then result is 16 diff --git a/build.gradle.kts b/build.gradle.kts index a026be411..d16a0fb4d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -84,6 +84,7 @@ configure(subprojects) { dependency("com.squareup.retrofit2:retrofit:2.4.0") dependency("commons-io:commons-io:2.6") dependency("io.github.benas:random-beans:3.7.0") + dependency("io.github.glytching:junit-extensions:2.3.0") dependency("io.rest-assured:rest-assured:3.1.0") dependency("javax.servlet:javax.servlet-api:4.0.1") dependency("javax.ws.rs:javax.ws.rs-api:2.0.1") From c4a466f0c47c855893cf0c24e11600afa6d5a5d4 Mon Sep 17 00:00:00 2001 From: Dmitry Baev Date: Wed, 31 Oct 2018 18:04:08 +0300 Subject: [PATCH 2/2] fix code style --- .../allure/cucumber3jvm/AllureCucumber3Jvm.java | 1 + .../allure/cucumber3jvm/AllureCucumber3JvmTest.java | 11 +++++++++++ .../src/test/resources/features/undefined.feature | 4 ++++ 3 files changed, 16 insertions(+) create mode 100644 allure-cucumber3-jvm/src/test/resources/features/undefined.feature diff --git a/allure-cucumber3-jvm/src/main/java/io/qameta/allure/cucumber3jvm/AllureCucumber3Jvm.java b/allure-cucumber3-jvm/src/main/java/io/qameta/allure/cucumber3jvm/AllureCucumber3Jvm.java index 666c083fe..4daa67b0a 100644 --- a/allure-cucumber3-jvm/src/main/java/io/qameta/allure/cucumber3jvm/AllureCucumber3Jvm.java +++ b/allure-cucumber3-jvm/src/main/java/io/qameta/allure/cucumber3jvm/AllureCucumber3Jvm.java @@ -217,6 +217,7 @@ private String getHistoryId(final TestCase testCase) { return Utils.md5(testCaseLocation); } + @SuppressWarnings("ReturnCount") private Status translateTestCaseStatus(final Result testCaseResult) { switch (testCaseResult.getStatus()) { case FAILED: diff --git a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/AllureCucumber3JvmTest.java b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/AllureCucumber3JvmTest.java index bc1e8e9dd..5bdb16286 100644 --- a/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/AllureCucumber3JvmTest.java +++ b/allure-cucumber3-jvm/src/test/java/io/qameta/allure/cucumber3jvm/AllureCucumber3JvmTest.java @@ -326,6 +326,17 @@ void shouldCommonLabels() throws IOException { ); } + @Test + void shouldProcessNotImplementedScenario() throws IOException { + final AllureResultsWriterStub writer = new AllureResultsWriterStub(); + runFeature(writer, "features/undefined.feature"); + + final List testResults = writer.getTestResults(); + assertThat(testResults) + .extracting(TestResult::getStatus) + .containsExactlyInAnyOrder((Status) null); + } + private void runFeature(final AllureResultsWriterStub writer, final String featureResource) throws IOException { diff --git a/allure-cucumber3-jvm/src/test/resources/features/undefined.feature b/allure-cucumber3-jvm/src/test/resources/features/undefined.feature new file mode 100644 index 000000000..caa0b507b --- /dev/null +++ b/allure-cucumber3-jvm/src/test/resources/features/undefined.feature @@ -0,0 +1,4 @@ +Feature: Simple feature + + Scenario: Step is not implemented + Given hello my friend