首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gherkin嵌套步骤意义

Gherkin嵌套步骤意义
EN

Stack Overflow用户
提问于 2017-08-13 05:23:55
回答 1查看 3.9K关注 0票数 1

我正在我的项目中编写Gherkin测试用例和Java步骤定义。我对Gherkin很陌生,并试图理解嵌套步骤的含义。您能帮助我理解第二个场景是否涉及嵌套步骤吗?

在我的示例中,我想在给定语句逻辑的第二个场景中重用第一个场景代码。是否有最好的方法来重用或重写逻辑?注:下面的例子就是为了解释我的问题而写的。这可能不是个好的Gherkin。

代码语言:javascript
复制
Background:
    Given The application is opened

Scenario: Successful Login
    Given the user name and password are entered
    When login button is clicked
    Then user login is successful

Scenario: Add Address Successful
    Given user login is successful
    And Add Address button is clicked
    And user city, country are entered
    when Submit button is clicked
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-13 18:41:23

嵌套步骤指的是在“主”步骤中调用定义的步骤。在您的示例中,第一个场景具有登录功能,它将/可以在所有其他需要用户登录的场景中使用。

因此,第二个场景将有一个Given步骤,它调用第一个场景的登录操作/步骤。有多种方法可以做到这一点:

1. --如果在同一个类中定义这些步骤,只需在不同的步骤/方法中调用相同的方法。

就像这样:

代码语言:javascript
复制
public class TestStepsOne {

    // Steps from first scenario

    @Given("^the user name and password are entered$")
    public void enterUsernamePassword() throws Throwable {
        System.out.println("User and password entered");
    }

    @When("^login button is clicked$")
    public void clickLoginButton() throws Throwable {
        System.out.println("Clicked login button");
    }

    @Then("^user login is successful$")
    public void isLoggedIn() throws Throwable {
        System.out.println("Logged in!");
    }

    // All together

    @Given("the user is logged in")
    public void loginSuccessfully() throws Throwable {
        enterUsernamePassword();
        clickLoginButton();
        isLoggedIn();
    }
}

现在您可以在任何场景中使用Given the user is logged in,它将执行登录操作。

2.使用图片容器 -> details 这里

首先,您需要将这些依赖项添加到pom.xml中。

代码语言:javascript
复制
<dependency>
    <groupId>org.picocontainer</groupId>
    <artifactId>picocontainer</artifactId>
    <version>2.15</version>
</dependency>
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-picocontainer</artifactId>
    <version>1.2.5</version>
</dependency>

您可以分离步长定义。

就像这样:

代码语言:javascript
复制
public class TestStepsOne {

    // Same as above, without the nested one

}

二等舱:

代码语言:javascript
复制
public class TestStepsTwo {
    private final TestStepsOne testStepsOne;

    public TestStepsTwo(TestStepsOne testStepsOne) {
        this.testStepsOne = testStepsOne;
    }

    @Given("the user is logged in")
    public void loginSuccessfully() throws Throwable {
        testStepsOne.enterUsernamePassword();
        testStepsOne.clickLoginButton();
        testStepsOne.isLoggedIn();
    }
}

3.使用 cuke4duke -> details 这里,包括示例

就像这样:

代码语言:javascript
复制
public class CallingSteps extends Steps {
    public CallingSteps(StepMother stepMother) {
        super(stepMother);
    }

    @When("^I call another step$")
    public void iCallAnotherStep() {
        Given("the user is logged in"); // This will call a step defined somewhere else.
    }
}

希望这能有所帮助

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45657382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档