如何使用 cucumber 运行ner class 运行 多个特征文件?

How to run multiple feature files using the cucumber runner class?

使用下面这行代码,login.feature中提到的所有场景都可以执行。

@CucumberOptions(features= "src/main/resources/publish/login.feature", format = {"pretty"} )

如果我必须执行多个功能文件,我该如何定义?假设如果我如下定义,将执行发布文件夹中提到的功能。

@CucumberOptions(features= "src/main/resources/publish", format = {"pretty"} )

如果我要运行多个功能和场景在里面,我该如何定义?我必须创建多个 cucumberRunner classes 还是我可以在一个 class 文件中定义。

您可以通过在 cucumber 选项中定义标签值来实现(考虑到您已经在功能文件中对这些场景进行了分组)

例如: features="src/test/resources/FeatureFiles",tags="@feature1scenariogroup1,@feature2cenariogroup2"

在特征文件中定义标签:

Feature: My Feature File
@smoke 
Scenario: Login
Given I open "FireFox" browser
When I navigate to Sectionone "Home" page
And i do something
Then I Validate Something  

@regression 
Scenario: Compose Email
Given I open "FireFox" browser
When I Do An Action

@OnlyOneTime
Scenario:Send Email
....

您可以在使用标签的功能中使用选择性功能文件或选择性场景。请尝试使用此解决方案。

假设您有 n 个特征文件,您需要 运行 只从中选择特征。然后用@tag名称命名每个特征文件。

例如:在此文件夹下,如果您有 n 个功能 - "src/main/resources/publish"

第一个特征文件名:

Login.feature

//文件内部以特征标签名称开头

@Login
Feature: To Login to Email

//Then feature name followed with scenario tag name
@User

//Scenario1:    
Scenario Outline: Navigate and logon to gmail application

Given User launches gmail application
When User updates emailID <emailID>
And User updates pwd <pwd>    
Then User clicks on Login Button


Examples: 
  | emailID    | pwd |
  | a@gmail.com| 123 | 

第二个功能文件名:

CreateEmail.feature

 @Createmail
 Feature: Create email

 Scenario: Blah blah blah...

 //Write all Given when And Then

第三个功能文件名:

SendEmail.feature

 @Sendemail
 Feature: Send email

 Scenario: Blah blah blah...

 //Write all Given when And Then

所以从上面的测试文件。假设您想单独测试第一个和第三个功能,那么您可以使用如下代码:

例如: # 这是针对 运行 特定的功能文件,即 1 和 3。同样,如果同一功能文件中有 n 个场景,您也可以使用场景标签。

 @CucumberOptions(features= "src/main/resources/publish", tags="@Login, @Sendemail",  format = {"pretty"} )

将我的代码修改为 运行 所有启用的功能、场景。 features 是 运行ner class 考虑 features

的要点
@RunWith(Cucumber.class)
@CucumberOptions(
        features = {"classpath:features"},
        plugin = {"html:target/site/cucumber-pretty","json:target/cucumber.json"},
        tags = {"@currentTest"},
        glue={"helpers","stepDefinitions"},
        //      dryRun = true,
        monochrome = true
        )
public class RunCukesTest{

}
@RunWith(Cucumber.class)

@CucumberOptions(
features = {"src/test/java/Features"},
tags= {"@FirstTimeLaunch, @SignUpPage"},
glue= {"testCode"},
plugin = { "pretty", "html:target/htmlreports" }
)

当您作为 Junit 测试 (runner class) 执行时,Features 文件夹(包)中的所有 *.feature 文件将按照文件名的字母顺序执行

你可以简单地写 tags = {"@fileName1, @fileName2"}

我们可以使用@File1、@File2、..添加多个文件

试试这个,下面的代码适用于多个特征文件(标签属性只在你想要 运行 特定场景时有效),我尝试了下面的多个特征文件,它有效:

@CucumberOptions(features = {"src\test\resources\cucumberfeaturefolder\cucumber1.feature",
        "src\test\resources\cucumberfeaturefolder\cucumber2.feature"},
glue= "StepDef")

以下代码适用于我:

(1) BeerCans.feature

Feature: Beer Cans
  Scenario: Counting Beer Cans
    Given I have <opening balance> beer cans
    And I have drunk processed beer cans
    When I go to my fridge
    Then I should have <in stock> beer cans

(2) multiplication.feature

Feature: Multiplication
  I multiply two numbers
  Scenario: multiple a and b
    Given I have variable a
    And I have variable b
    When I multiply a and b
    Then I display the Result

(3) MyStepdefs class

package org.example.njain51.steps; /**
 * @author : Nitin Jain
 * @mailto : official.nitinjain@gmail.com
 * @created : 5/22/2022, Sunday
 **/

import io.cucumber.java.en.And;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;

/**
 What this program snippet doing? 
 **/
public class MyStepdefs {
    @Given("I have <opening balance> beer cans")
    public void iHaveOpeningBalanceBeerCans() {
        System.out.println("I have Opening Balance");
    }

    @And("I have drunk processed beer cans")
    public void iHaveDrunkProcessedBeerCans() {
    }

    @When("I go to my fridge")
    public void iGoToMyFridge() {
        System.out.println("I go to my Fridge");

    }

    @Then("I should have <in stock> beer cans")
    public void iShouldHaveInStockBeetCans() {
        System.out.println("I should have in stock beer cans");
    }


}

(4) 乘法步骤定义 class

package org.example.njain51.steps; /**
 * @author : Nitin Jain
 * @mailto : official.nitinjain@gmail.com
 * @created : 5/22/2022, Sunday
 **/

import io.cucumber.java.en.And;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;

/**
 What this program snippet doing?
 **/
public class MultiplicationStepDef {
    @Given("I have variable a")
    public void iHaveVariableA() {
        System.out.println("I have variable a");
    }

    @And("I have variable b")
    public void iHaveVariableB() {
        System.out.println("I have variable b");
    }

    @When("I multiply a and b")
    public void iMultiplyAAndB() {
        System.out.println("I Multiply a and b");
    }


    @Then("I display the Result")
    public void iDispayTheResult() {
        System.out.println("I Display the result");
    }
}

(5) RunCucumberTest Class 实现多个功能

package org.example.njain51;/**
 * @author : Nitin Jain
 * @mailto : official.nitinjain@gmail.com
 * @created : 5/22/2022, Sunday
 **/

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

@RunWith(Cucumber.class)
@CucumberOptions(
        features = {"src/test/resources/features/BeerCans.feature",
                   "src/test/resources/features/multiplication.feature"},
        glue = {"org.example.njain51.steps"})
public class RunCucumberTest {
}

(6) 当我运行 RunCucumberTest

时输出
C:\Users\offic\.jdks\corretto-1.8.0_292\bin\java.exe -ea -DnodeNamesHandler=org.jetbrains.plugins.cucumber.java.run.CucumberTestTreeNodeManager -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\lib\idea_rt.jar=49946:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\plugins\junit\lib\junit5-rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\plugins\junit\lib\junit-rt.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\charsets.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\access-bridge-64.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\cldrdata.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\dnsns.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\jaccess.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\jfxrt.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\localedata.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\nashorn.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\sunec.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\sunjce_provider.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\sunmscapi.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\sunpkcs11.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\ext\zipfs.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\jce.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\jfr.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\jfxswt.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\jsse.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\management-agent.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\resources.jar;C:\Users\offic\.jdks\corretto-1.8.0_292\jre\lib\rt.jar;D:\mylearning\SAMPLE_PROJECTS\Testing\cucumber-demo\target\test-classes;C:\Users\offic\.m2\repository\io\cucumber\cucumber-java.1.1\cucumber-java-6.1.1.jar;C:\Users\offic\.m2\repository\io\cucumber\cucumber-core.1.1\cucumber-core-6.1.1.jar;C:\Users\offic\.m2\repository\io\cucumber\cucumber-gherkin.1.1\cucumber-gherkin-6.1.1.jar;C:\Users\offic\.m2\repository\io\cucumber\cucumber-gherkin-messages.1.1\cucumber-gherkin-messages-6.1.1.jar;C:\Users\offic\.m2\repository\io\cucumber\messages.1.1\messages-12.1.1.jar;C:\Users\offic\.m2\repository\io\cucumber\tag-expressions.0.0\tag-expressions-3.0.0.jar;C:\Users\offic\.m2\repository\io\cucumber\cucumber-expressions.2.0\cucumber-expressions-10.2.0.jar;C:\Users\offic\.m2\repository\io\cucumber\datatable.3.1\datatable-3.3.1.jar;C:\Users\offic\.m2\repository\io\cucumber\cucumber-plugin.1.1\cucumber-plugin-6.1.1.jar;C:\Users\offic\.m2\repository\io\cucumber\docstring.1.1\docstring-6.1.1.jar;C:\Users\offic\.m2\repository\io\cucumber\html-formatter.0.3\html-formatter-6.0.3.jar;C:\Users\offic\.m2\repository\org\apiguardian\apiguardian-api.1.0\apiguardian-api-1.1.0.jar;C:\Users\offic\.m2\repository\io\cucumber\cucumber-junit.1.1\cucumber-junit-6.1.1.jar;C:\Users\offic\.m2\repository\junit\junit.13\junit-4.13.jar;C:\Users\offic\.m2\repository\org\hamcrest\hamcrest-core.3\hamcrest-core-1.3.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\plugins\cucumber-java\lib\cucumber-jvmFormatter.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 org.example.njain51.RunCucumberTest
I have Opening Balance
I go to my Fridge
I should have in stock beer cans
I have variable a
I have variable b
I Multiply a and b
I Display the result

Process finished with exit code 0