#java #cucumber
#java #огурец
Вопрос:
У нас есть несколько пользовательских историй, и мы используем Cucumber-framework для их автоматического тестирования. Это наш feature
файл:
Feature: Gerechten selecteren en leveren
Als koerier gerechten selecteren en leveren
Scenario: update vragen opdrachten
Given er is een lijst van bestellingen
When De koerier met id 1 kiest een bestelling met id 1
Then De koerier met id 1 heeft een actieve bestelling met id 1
Scenario: Melding geven bestelling afgehaald is
Given Er is een actieve bestelling met id 1 bij de koerier met id 1
When Bestelling met id 1 is afgehaald door de koerier met id 1
Then Bestelling met id 1 heeft status afgehaald
Scenario: Melding geven bestelling geleverd is
Given Er is een actieve bestelling met id 1 bij de koerier met id 1 met status afgehaald
When Bestelling met id 1 wordt geleverd door koerier met id 1
Then Bestelling met id 1 heeft status geleverd
And De koerier met id 1 krijgt 10 punten
And De koerier met id 1 zijn actieve bestelling met id 1 is verwijderd
And De koerier met id 1 heeft 1 voltooide bestelling
Scenario: puntentransacties raadplegen
Given De koerier met id 1 heeft een account
When De koerier met id 1 punten opvraagd
Then Voor de koerier met id 1 worden er 10 punten getoond
Он состоит из нескольких сценариев с заданным-когда-то-формат.
Это наш test-code
:
package be.kdg.cucumber;
import io.cucumber.java.en.And;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertNotNull;
public class DeliDishStepDefs {
private Bestellingen bestellingen;
private Gerecht g1;
private Gerecht g2;
private Klant k1;
private Klant k2;
private Bestelling b1;
private Bestelling b2;
private Bestelling b3;
private Koerier c1;
int puntenKoerier;
@BeforeEach
void setUp() {
bestellingen = new Bestellingen();
g1 = new Gerecht(1,"pizza calzone", 12.99);
g2 = new Gerecht(2,"spaghetti bolognaise", 12.99);
k1 = new Klant(1, "Jan De Rijke","kerkstraat 7");
k2 = new Klant(2, "Piet Boedt", "kerkstraat 7");
b1 = new Bestelling(1, g1, k1);
b2 = new Bestelling(2, g1, k2);
b3 = new Bestelling(3, g2, k1);
bestellingen.add(b1);
bestellingen.add(b2);
bestellingen.add(b3);
c1 = new Koerier(1, "Bert Fransens");
}
@Given("er is een lijst van bestellingen")
public void erIsEenLijstVanBestellingen() {
assertNotNull(bestellingen, "Er moet een lijst zijn van bestellingen");
int size = bestellingen.getSize();
assertEquals(3, size, "Er moeten 3 bestellingen zitten in de lijst");
}
@When("De koerier met id {int} kiest een bestelling met id {int}")
public void deKoerierMetIdKiestEenBestellingMetId(int arg0, int arg1) {
if (c1.getId() == arg0) {
if (b1.getId() == arg1) {
c1.setActieveBestelling(b1);
}
}
}
@Then("De koerier met id {int} heeft een actieve bestelling met id {int}")
public void deKoerierMetIdHeeftEenActieveBestellingMetId(int arg0, int arg1) {
assertEquals(arg0, c1.getId(), "De id van de koerier moet " arg0 " zijn");
assertEquals(arg1, b1.getId(), "De id van de bestelling moet " arg1 " zijn");
assertNotNull(c1.getActieveBestelling(), "Er moet een actieve bestelling zijn");
}
@Given("Er is een actieve bestelling met id {int} bij de koerier met id {int}")
public void erIsEenActieveBestellingMetIdBijDeKoerierMetId(int arg0, int arg1) {
assertEquals(arg1, c1.getId(), "De id van de koerier moet " arg1 " zijn");
assertEquals(arg0, c1.getActieveBestelling().getId(), "De actieve bestelling van de koerier" arg1 " moet als id " arg0 " hebben");
assertNotNull(c1.getActieveBestelling(), "Er moet een actieve bestelling zijn");
}
@When("Bestelling met id {int} is afgehaald door de koerier met id {int}")
public void bestellingMetIdIsAfgehaaldDoorDeKoerierMetId(int arg0, int arg1) {
if (c1.getId() == arg1) {
if (b1.getId() == arg0) {
c1.getActieveBestelling().setStatus(BestellingStatus.AFGEHAALD);
}
}
}
@Then("Bestelling met id {int} heeft status afgehaald")
public void bestellingMetIdHeeftStatusAfgehaald(int arg0) {
assertEquals(arg0, b1.getId(), "De id van de bestelling moet " arg0 " zijn");
assertEquals(c1.getActieveBestelling().getStatus(), BestellingStatus.AFGEHAALD, "De bestelling moet een status hebben van afgehaald");
}
@Given("Er is een actieve bestelling met id {int} bij de koerier met id {int} met status afgehaald")
public void erIsEenActieveBestellingMetIdBijDeKoerierMetIdMetStatusAfgehaald(int arg0, int arg1) {
assertEquals(arg1, c1.getId(), "De id van de koerier moet " arg1 " zijn");
assertEquals(arg0, c1.getActieveBestelling().getId(), "De actieve bestelling van de koerier" arg1 " moet als id " arg0 " hebben");
assertNotNull(c1.getActieveBestelling(), "Er moet een actieve bestelling zijn");
assertEquals(c1.getActieveBestelling().getStatus(), BestellingStatus.AFGEHAALD, "De bestelling moet afgehaald zijn");
}
@When("Bestelling met id {int} wordt geleverd door koerier met id {int}")
public void bestellingMetIdWordtGeleverdDoorKoerierMetId(int arg0, int arg1) {
if (c1.getId() == arg1) {
if (b1.getId() == arg0) {
c1.getActieveBestelling().setStatus(BestellingStatus.GELEVERD);
}
}
}
@Then("Bestelling met id {int} heeft status geleverd")
public void bestellingMetIdHeeftStatusGeleverd(int arg0) {
assertEquals(arg0, b1.getId(), "De id van de bestelling moet " arg0 " zijn");
assertEquals(c1.getActieveBestelling().getStatus(), BestellingStatus.GELEVERD, "De bestelling moet een status hebben van geleverd");
}
@And("De koerier met id {int} krijgt {int} punten")
public void deKoerierMetIdKrijgtPunten(int arg0, int arg1) {
if (c1. getId() == arg0) {
c1.addPunten(arg1);
c1.voltooiBestelling();
}
}
@And("De koerier met id {int} zijn actieve bestelling met id {int} is verwijderd")
public void deKoerierMetIdZijnActieveBestellingMetIdIsVerwijderd(int arg0, int arg1) {
assertEquals(arg0, c1.getId(), "De id van de koerier moet " arg0 " zijn");
assertNull(c1.getActieveBestelling(), "De actieve bestelling met id " arg1 " van koer met id " arg0 " moet null zijn");
}
@And("De koerier met id {int} heeft {int} voltooide bestelling")
public void deKoerierMetIdHeeftVoltooideBestelling(int arg0, int arg1) {
assertEquals(arg0, c1.getId(), "De id van de koerier moet " arg0 " zijn");
int size = c1.getSizeBestellingen();
assertEquals(arg1, size, "Het aantal voltooide bestellingen moet " arg1 " zijn");
}
@Given("De koerier met id {int} heeft een account")
public void deKoerierMetIdHeeftEenAccount(int arg0) {
assertEquals(arg0, c1.getId(), "De koerier met deze id bestaat niet");
}
@When("De koerier met id {int} punten opvraagd")
public void deKoerierMetIdPuntenOpvraagd(int arg0) {
if (c1.getId() == arg0) {
puntenKoerier = c1.getPunten();
}
}
@Then("Voor de koerier met id {int} worden er {int} punten getoond")
public void voorDeKoerierMetIdWordenErPuntenGetoond(int arg0, int arg1) {
assertEquals(arg0, c1.getId(), "De id van de koerier moet " arg0 " zijn");
int aantalPunten = c1.getPunten();
assertEquals(arg1, aantalPunten, "Het aantal punten van koerier met id " arg0 " moet " arg1 " zijn");
}
}
Это ошибка, которую мы получаем:
Testing started at 16:15 ...
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :compileTestJava UP-TO-DATE
> Task :processTestResources UP-TO-DATE
> Task :testClasses UP-TO-DATE
> Task :test FAILED
Feature: Gerechten selecteren en leveren
Als koerier gerechten selecteren en leveren
Scenario: update vragen opdrachten # src/test/resources/features/DeliDish.feature:5
Given er is een lijst van bestellingen # null
When De koerier met id 1 kiest een bestelling met id 1 # null
Then De koerier met id 1 heeft een actieve bestelling met id 1 # null
Multiple Failures (3 failures)
io.cucumber.junit.UndefinedThrowable: The step "er is een lijst van bestellingen" is undefined
io.cucumber.junit.UndefinedThrowable: The step "De koerier met id 1 kiest een bestelling met id 1" is undefined
io.cucumber.junit.UndefinedThrowable: The step "De koerier met id 1 heeft een actieve bestelling met id 1" is undefined
org.opentest4j.MultipleFailuresError: Multiple Failures (3 failures)
io.cucumber.junit.UndefinedThrowable: The step "er is een lijst van bestellingen" is undefined
io.cucumber.junit.UndefinedThrowable: The step "De koerier met id 1 kiest een bestelling met id 1" is undefined
io.cucumber.junit.UndefinedThrowable: The step "De koerier met id 1 heeft een actieve bestelling met id 1" is undefined
at org.junit.vintage.engine.execution.TestRun.getStoredResultOrSuccessful(TestRun.java:179)
at org.junit.vintage.engine.execution.RunListenerAdapter.fireExecutionFinished(RunListenerAdapter.java:211)
at org.junit.vintage.engine.execution.RunListenerAdapter.testFinished(RunListenerAdapter.java:177)
at org.junit.vintage.engine.execution.RunListenerAdapter.testFinished(RunListenerAdapter.java:76)
at org.junit.runner.notification.SynchronizedRunListener.testFinished(SynchronizedRunListener.java:56)
at org.junit.runner.notification.RunNotifier$7.notifyListener(RunNotifier.java:190)
at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:72)
at org.junit.runner.notification.RunNotifier.fireTestFinished(RunNotifier.java:187)
at io.cucumber.junit.JUnitReporter$EachTestNotifier.fireTestFinished(JUnitReporter.java:253)
at io.cucumber.junit.JUnitReporter.handleTestCaseResult(JUnitReporter.java:178)
at io.cucumber.junit.JUnitReporter$4.receive(JUnitReporter.java:66)
at io.cucumber.junit.JUnitReporter$4.receive(JUnitReporter.java:62)
at cucumber.runner.AbstractEventPublisher.send(AbstractEventPublisher.java:45)
at cucumber.runner.AbstractEventBus.send(AbstractEventBus.java:9)
at cucumber.runner.ThreadLocalRunnerSupplier$LocalEventBus.send(ThreadLocalRunnerSupplier.java:60)
at cucumber.runner.TestCase.run(TestCase.java:55)
at cucumber.runner.Runner.runPickle(Runner.java:50)
at io.cucumber.junit.PickleRunners$NoStepDescriptions.run(PickleRunners.java:146)
at io.cucumber.junit.FeatureRunner.runChild(FeatureRunner.java:68)
at io.cucumber.junit.FeatureRunner.runChild(FeatureRunner.java:23)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at io.cucumber.junit.Cucumber.runChild(Cucumber.java:142)
at io.cucumber.junit.Cucumber.runChild(Cucumber.java:65)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at io.cucumber.junit.Cucumber$RunCucumber.evaluate(Cucumber.java:172)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:40)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80)
at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:71)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:102)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:82)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:78)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy2.stop(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.base/java.lang.Thread.run(Thread.java:834)
...
Код компилируется и запускается. Но все наши тесты просто терпят неудачу, и все по причине, подобной этой:
The step "er is een lijst van bestellingen" is undefined
Похоже, что, возможно, Cucumber действительно не распознает наш feature
-file?
Полный код на Git: https: //gitlab.com/RobinSel/delidish-cucumber
Комментарии:
1. Подумайте о том, чтобы прочитать инструкции, прилагаемые к вашему домашнему заданию. Смотрите RunCucumberTest .
2. @M.P.Korstanje Спасибо! Однако после изменения атрибута клея на правильный пакет код выполняется без каких-либо ошибок, но выдает сообщение
Test events were not received
в IntelliJ.