Problem
Cucumber can't find step definitions when run with a CLI runner, but it can find it when running with the junit runner.
That is, when running cucumber-jvm from a linux command line, the feature file is found, but the step definitions file is not found, producing the message, "Undefined scenarios: src/test/java/com/logic/testing/ClassifyDocuments.feature:8"
(See bottom for full message)
However, running via Maven, e.g. 'mvn test', the step definitions are found and the test executes as expected. I've already reviewed similar questions ad nauseum and would appreciate any help before I go bald.
- Do the files need to be organized differently, e.g. using a 'resources' directory?
- Is the glue parameter, com.logic.testing, not correct?
- Is there a problem with the classpath?
Details
Here's the command line statement being issued while in the 'auto-test' folder:
java -cp "/usr/local/bin/cucumber/cucumber-core-1.2.5.jar:/usr/local/bin/cucumber/*:." cucumber.api.cli.Main -g com.logic.testing src/test/java/com/logic/testing/ClassifyDocuments.feature -s
Code is organized like so:
auto-test/
src/test/java
com.logic.testing
StepDefinitions.java
ClassifyDocuments.feature
src/main/java
com.logic.testing
AutoTestController.java (contains a class that is referenced by StepDefinitions.java)
target/test-classes/com/logic/testing/
StepDefinitions.class
target/classes/com/logic/testing/
AutoTestController.class
Within /usr/local/bin/cucumber/ is:
cucumber-core-1.2.5.jar
cucumber-java-1.2.5.jar
cucumber-jvm-deps-1.05.jar
gherkin-2.12.2.jar
ClassifyDocuments.feature file:
Feature: Classify documents in a package
As an auditor
I want to use software
So that I don't have to manually identify subdocuments
Scenario: execute workflow case2 test
Given the workflow case2 test can be configured
And I have been authenticated
When two jobs are submitted with different SLA duration
And the jobs are processed
Then the packages with the shorter SLA duration are completed first
StepDefinitions.java file:
package com.logic.testing;
import java.io.File;
import org.junit.Assert;
import cucumber.api.java.en.And;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
public class StepDefinitions {
AutoTestController atc;
@Given("^the workflow case2 test can be configured$")
public void the_workflow_case2_test_can_be_configured() throws Throwable {
atc = new AutoTestController();
atc.log("~Looking for configuration", log_src);
Assert.assertTrue(atc.getAutoTestConfig("workflow_case2"));
}
@When("^two jobs are submitted with different SLA duration$")
public void two_jobs_are_submitted_with_different_SLA_duration() throws Throwable {
Assert.assertTrue(atc.two_jobs_are_submitted_with_different_SLA_duration());
}
@And("^the jobs are processed$")
public void the_jobs_are_processed() throws Throwable {
Assert.assertTrue(atc.processJobs());
}
@Then("^the packages with the shorter SLA duration are completed first$")
public void the_packages_with_the_shorter_SLA_duration_are_completed_first() throws Throwable {
Assert.assertTrue(atc.checkPackageCompletionTimes("QC_CLASSIFICATION", "READY", 10, 300));
}
}
Error returned after executing the command line statement (yes, it does start with 'UUUUU'):
UUUUU
Undefined scenarios:
src/test/java/com/logic/testing/ClassifyDocuments.feature:8 # Scenario: execute workflow case2 test
1 Scenarios (1 undefined)
5 Steps (5 undefined)
0m0.000s
You can implement missing steps with the snippets below:
@Given("^the workflow case(\\d+) test can be configured$")
public void the_workflow_case_test_can_be_configured(int arg1) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
@Given("^I have been authenticated$")
public void i_have_been_authenticated() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
@When("^two jobs are submitted with different SLA duration$")
public void two_jobs_are_submitted_with_different_SLA_duration() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
@When("^the jobs are processed$")
public void the_jobs_are_processed() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
@Then("^the packages with the shorter SLA duration are completed first$")
public void the_packages_with_the_shorter_SLA_duration_are_completed_first() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
If Cucumber is telling you that your steps are undefined, when you have defined step definitions, this means that Cucumber cannot find your step definitions. You'll need to make sure to specify the path to your step definitions (glue path) correctly.
naming-strategy=long Cucumber will include the feature name in the scenario name. This makes the test results legible. Finally, the @Cucumber annotation has been deprecated in favour of @Suite .
Glue Option helps Cucumber to locate the step definition file. We specify the package to load glue code (step definitions or hooks) in the glue option. When no glue is provided, Cucumber will use the package of the annotated class. For example, if the annotated class is com.
Dry Run is nothing but checking the complete implementation of all the mentioned steps present in the Feature file. Before the execution starts . Dry Run is Checking the implementionation not about the execution of scripts.
Cucumber scans the class path for glue.
So looking at a glance I'd say that your -cp
is wrong. When executed from auto-test
I would expect it to include ./target/classes/
and its descendent's rather then .
.
I have downloaded cucumber-core.jar into c:\cukes folder and my test classes are in target/test-classes folder as I am using maven. also my maven dependencies are in .m2 folder of my profile. below command line code works fine for me.
java -cp "c:/cukes/*;./../../.m2/*;target/test-classes" cucumber.api.cli.Main --glue "stepdefinitions" src/test/resources/features/sample.feature
I guess, you are getting the issue may be because of class path, try the following
java -cp "/usr/local/bin/cucumber/*;target/test-classes;target/classes" cucumber.api.cli.Main -g "com.logic.testing" src/test/java/com/logic/testing/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With