как установить один раз после аннотированного метода для всех шагов в Cucumber-JVM

Я использую Cucumber-JVM и пытаюсь делать снимок экрана после каждого шага (в случае сбоя). Проблема в том, что я не знаю, как задать методы, которые будут выполняться до и после каждого шага.

Я использовал https://github.com/cucumber/cucumber-java-skeleton в качестве справки. Я добавил в бегунок https://github.com/cucumber/cucumber-java-skeleton/blob/master/src/test/java/skeleton/RunCukesTest.java BeforeClass и AfterClass (объявления JUnit) и методы, обеспечивающие запуск и остановку webrdiver ( до и после каждого сценария). Я знаю, что могу использовать аннотации до и после (огурцы), но методы с этими аннотациями должны быть помещены в тот же класс, который содержит определения шагов. Проблема в том, что у меня много классов с шагами, поэтому я не хочу помещать эти аннотированные методы в каждый класс шага, мне нужно определить их один раз.

Подскажите, пожалуйста, как это сделать.

[редактировать]

Вот мой бегун

package example;



import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;



@RunWith(Cucumber.class)
    @CucumberOptions(
        features = "src/test/resources/"
    )
public class TodoTest {


    @BeforeClass
    public static void beforeClass() {

        System.setProperty("browser", "chrome");


        System.setProperty("remote", "http://localhost:4444/wd/hub");

    }

    @AfterClass
    public static void afterClass() {

    }

}

Мне нужно определить методы, которые будут выполняться до и после каждого шага во всем проекте так же, как эти методы для сценариев.


person master.py    schedule 16.03.2015    source источник
comment
Включите соответствующие фрагменты кода в сам вопрос. Возможно, вы могли бы использовать правило JUnit, как рекомендовано здесь   -  person toniedzwiedz    schedule 16.03.2015


Ответы (1)


Необязательно, чтобы аннотированный метод Before / After находился в одном классе. РЕДАКТИРОВАТЬ: создайте образец проекта, как показано ниже: сохраните классы StepDef в пакете с именем cukes, например src / test / java / cuckes

import cucumber.api.java.en.Given;

public class StepDef
{
    @Given("^order$")
    public void order()
    {
        System.out.println("Test hook");
    }
}

сохраните свой класс Hook в том же пакете, что и выше

import cucumber.api.Scenario;
import cucumber.api.java.After;
import cucumber.api.java.Before;

public class Hook {

    @Before
    public void before(Scenario scenario)
    {
        System.out.println("running scenario: "+scenario.getName());
    }

    @After
    public void after(Scenario scenario)
    {
        scenario.write("Test string to output in reports.");
        System.out.println("Finished running scenario: "+scenario.getName());
    }
}

Храните свой раннер (в данном случае JUnitRunner) в том же пакете.

import org.junit.runner.RunWith;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

@CucumberOptions(features={"src/test/resources/test.feature"},glue={"cukes"},plugin={"pretty","html:target/report"})
@RunWith(Cucumber.class)
public class JUnitRunner
{

}

В папке src / test / resources создайте папку cukes с именем и сохраните файл test.feature

Feature: Test feature
Scenario: To test scenario
Given order

Теперь запустите JUnitRunner, и вы должны увидеть вывод на консоли:

Feature: Test feature
passed
Test hook
To test scenario

Взгляните на это репозиторий на github. у него есть хорошие примеры в огурце: CucumberJVMExamples. Отличная работа, проделанная мистером Прадипом. Это должно ответить на все ваши вопросы

person Mrunal Gosar    schedule 16.03.2015
comment
Спасибо за комментарий! Можете ли вы показать мне какой-нибудь рабочий пример, потому что я до сих пор не знаю, как его установить. - person master.py; 16.03.2015
comment
Пожалуйста, проверьте мою правку сейчас. Позвольте мне знать, если это помогает. - person Mrunal Gosar; 16.03.2015
comment
Мрунал, еще раз спасибо, но, видимо, я полностью новичок в Java ... Что это означает: Вставить ниже код, в который находятся ваши пошаговые определения? Должен ли я создать класс, содержащий эти методы? И что еще? Каждый класс, содержащий StepDefinitions, должен наследовать это содержимое? Как именно мне это сделать? Еще раз спасибо и с нетерпением ждем вашей помощи :) - person master.py; 16.03.2015
comment
Пожалуйста, проверьте URL, который я добавил. Это должно ответить на все ваши вопросы. Сообщите мне, если вам все еще понадобится помощь. - person Mrunal Gosar; 17.03.2015
comment
Большое спасибо! Поправьте меня, если я ошибаюсь, driver = Hooks.driver; это ключ к моему вопросу? Как мне этого избежать? Возможно, все классы, содержащие определения шагов, должны расширять класс Hook? Или есть другой способ использовать эти крючки? Я новичок в Java и Cucumber-JVM, поэтому, пожалуйста, проявите понимание :) Еще раз спасибо! - person master.py; 17.03.2015
comment
Я добавил полный пример с огурцом. этот рабочий пример должен дать вам четкое представление. также в отношении вашего запроса ваши stepdefs должны будут либо расширять класс Hook, либо вам нужно будет сделать экземпляр драйвера статическим, а затем использовать тот же экземпляр везде, если вы не хотите продолжать расширять класс Hook - person Mrunal Gosar; 17.03.2015
comment
Если у вас есть инъекция зависимостей, это было бы более чистым решением. Композиция, а не наследование - лучший подход. Последнее, как правило, приводит к появлению иерархий с тяжелым верхом, в которых функциональность передается суперклассу, чтобы ее можно было использовать повторно. Это усложняет повторное использование. Лучше определить небольшие хорошо сфокусированные утилиты и внедрить туда, где они необходимы, то есть модульные. - person Big Kahuna; 24.03.2017