Identify which approach is best to implement parallel execution - Cucumber-JVM 4 supports parallel execution from cucumber v 4.0.0 and we do not need to create individual runner per feature file and You can implement this with JUnit (Do not need to use TestNG & cucumber-jvm-parallel-plugin)
Steps to implement parallel execution starting from cucumber 4.0.0 -
1.Adding correct set of dependency. I have followed JUnit during the implementation.
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>4.2.3</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>4.2.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>datatable</artifactId>
<version>1.1.12</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-picocontainer</artifactId>
<version>4.2.3</version>
<scope>test</scope>
</dependency>
2.Adding Maven-Surefire-Plugin under POM.XML
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<parallel>methods</parallel>
<threadCount>1</threadCount>
<reuserForks>false</reuserForks>
<testErrorIgnore>true</testErrorIgnore>
<testFailureIgnore>true</testFailureIgnore>
<includes>
<include>**/*RunCukeTest.java</include>
</includes>
</configuration>
</plugin>
Note - RunCukeTest is the runner file name and remember, TestNG dependency causes Surefire to ignore JUnit wrapper class. Remove all the TestNG dependencies if not required at all or you would need to define 2 execution one for TestNG & other for JUnit and disable one as per your need.
Once everything is done then you would need to pass browser name you want to run from a source like excel, json etc for each scenario.