How to run Cucumber Test in Java and Maven

If you’re writing a program in Java and using Maven, you may want to automate the calls for running your feature files in Maven whenever you try to build your code. Here’s how to run Cucumber Test in Java automatically whenever you try to build your Maven Project.

In this example, we will use our existing code for String Palindrome Cucumber Test and Sign Up Cucumber Test. Previously, if we want to run our Gherkin features, we either right click the feature file and run or create a run configurations. But how about if we have a lot of feature files that we need to run? Or we have Jenkins that automate our builds? In that case we can create a Class that defines the runner configurations which then able to run cucumber test in java. Here’s how:

First, create a Class that ends with Test in name. For example, CucumberTest.java. I noticed that if your class name doesn’t end with Test, maven doesn’t call that Class.

Next, add a @RunWith annotation in your class and put Cucumber.class inside. It defines how JUnit can run your class. Add a new annotation @CucumberOptions that holds the options or arguments that will be passed inside our runner. For example, here’s our CucumberTest class:

package com.javapointers;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(
        features = "src/test/resources",
        glue = "com.javapointers"
)
public class CucumberTest {
}

CucumberOptions interface contains different parameters that can be defined. The most basic are:

  • features – contains the location of your feature files that you want to run
  • glue – determines the base location of your Step Definitions
  • tags – if you want to run specific scenarios, you can add tags to your scenarios and defined them here.

Then, run Maven test in your project either by command or by Maven Tab in your IDE:

Cucumber Maven Run Test

You should see output in your IDE that it is running your features.

Run Cucumber Test in Java with Tags

Earlier, I have mentioned that you can define tags to limit features or scenarios you want to run. Here’s an example on how to do that.

For example, I only want to run my Sign Up Feature and not my String Palindrome Feature. In order to do that, I will need to add a tag in my Sign Up Feature.

@SignUpFeature
Feature: Sign Up Feature

  Scenario: Valid Registration Form Information
    Given User submits a valid registration form
      | John | Doe | jdoe | testPass1 | [email protected] |
    Then System proceeds with registration

  Scenario: Valid Registration Form Information with Header
    Given User submits a valid registration form header
      | FirstName | LastName | Username | Password  | Email          |
      | John      | Doe      | jdoe     | testPass1 | [email protected] |
    Then System proceeds with registration

  Scenario: Valid Registration Form Information with Header and Multiple Rows
    Given User submits valid registration forms
      | FirstName | LastName | Username | Password  | Email              |
      | John      | Doe      | jdoe     | testPass1 | [email protected]     |
      | Anne      | Smith    | asmith   | testPass2 | [email protected]   |
      | Mike      | Stewart  | mstewart | testPass3 | [email protected] |
    Then All Forms will proceed with registration

  Scenario: Invalid Registration Forms
    Given User submits invalid registration forms
      | FirstName | LastName | Username | Password  | Email            |
      |           | Doe      | jdoe     | testPass1 | [email protected]   |
      | Anne      |          | asmith   | testPass2 | [email protected] |
      | Mike      | Stewart  | mstewart | testPass3 | [email protected]   |
    Then All Forms will be declined and not registered

Notice that I have added @SignUpFeature at the top of my feature. Next, we will define it in our CucumberTest class inside CucumberOptions annotation.

package com.javapointers;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(
        features = "src/test/resources",
        glue = "com.javapointers",
        tags = "@SignUpFeature"
)
public class CucumberTest {
}

Then we can run our Maven Test or Install that will only run Scenarios under Sign Up Feature.

Both of our examples doesn’t need any plugin or maven pom configurations. Just add the required dependency and you’re good to go. Here’s our complete pom.xml in case you need it:



    4.0.0

    com.javapointers
    cucumber-data-tables
    1.0-SNAPSHOT

    
        
            io.cucumber
            cucumber-java
            4.4.0
            test
        
        
            io.cucumber
            cucumber-junit
            4.4.0
            test
        
        
        
            org.apache.commons
            commons-lang3
            3.8.1
        
        
        
            commons-validator
            commons-validator
            1.6
        
    



That’s it. In summary, we just need to define a Runner Class that contains the Cucumber Options. You can download the source code using this link.

Share this tutorial!