Значение вложенных шагов корнишона

Я пишу тестовые примеры Gherkin и определения шагов Java в своем проекте. Я новичок в Gherkin и пытаюсь понять значение вложенных шагов. Не могли бы вы помочь мне понять, включает ли второй сценарий вложенные шаги?

В моем примере я хотел бы повторно использовать код 1-го сценария во втором сценарии с учетом логики оператора. Есть ли лучший способ повторно использовать или переписать логику? Примечание. Пример ниже написан только для того, чтобы объяснить мой вопрос. Это может быть не очень хороший огурец.

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

person kav12345    schedule 13.08.2017    source источник


Ответы (1)


Вложенные шаги относятся к вызову определенных шагов внутри «основного». В вашем примере первый сценарий имеет функцию входа в систему, которая будет/может использоваться во всех других сценариях, требующих входа пользователя в систему.

Таким образом, во втором сценарии будет шаг Given, который вызывает действие/шаги входа в систему из первого сценария. Есть несколько способов сделать это:

1. Если вы определяете эти шаги в одном и том же классе, это просто вопрос вызова одних и тех же методов внутри другого шага/метода.

Вот так:

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. Использование пикоконтейнера -> подробности здесь

Сначала вам нужно добавить эти зависимости к вашему pom.xml:

<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>

Вы можете разделить определения шагов.

Вот так:

public class TestStepsOne {

    // Same as above, without the nested one

}

и второй класс:

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 -> подробности здесь , включая примеры

Вот так:

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.
    }
}

Надеюсь это поможет

person Daniel Fintinariu    schedule 13.08.2017
comment
Спасибо за объяснение. Я хотел бы попробовать использовать пико-контейнер. Чтобы использовать его, я должен просто добавить зависимость и иметь параметризованный конструктор? Как это работает? Также мой вызов CommonSteps (или класс TestStepsOne в вашем примере) имеет параметризованный конструктор. Будет ли это обработано? - person kav12345; 14.08.2017
comment
Пожалуйста, взгляните на веб-сайт, связанный с пикоконтейнером, он объясняет это лучше, чем я мог бы в комментарии (также предоставляет примеры реализации). - person Daniel Fintinariu; 15.08.2017