Извлечение имени шага огурца во время выполнения - PullRequest
0 голосов
/ 18 мая 2018

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

Я вижу, что класс StepDefinitionMatch получаетшаги, но я не уверен, как я могу получить доступ к шагам во время выполнения.Любая помощь?Добавление снимка стека вызовов, если это поможет.

public StepDefinitionMatch(List<Argument> arguments, StepDefinition stepDefinition, String featurePath, Step step, LocalizedXStreams localizedXStreams) {
    super(arguments, stepDefinition.getLocation(false));
    this.stepDefinition = stepDefinition;
    this.featurePath = featurePath;
    this.step = step;
    this.localizedXStreams = localizedXStreams;
}

enter image description here

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Один из способов получить переменные времени выполнения - использовать опцию плагина.Хотя это выглядит как злоупотребление интерфейсом Reporter для доступа к переменной StepDefinitionMatch для Cucumber версии 1.2.5 .

. Для этого создайте пользовательский класс, который реализует Reporterинтерфейс.

public class CustomFormatter implements Reporter{

    public  CustomFormatter() { }

    @Override
    public void before(Match match, Result result) {}

    @Override
    public void result(Result result) {}

    @Override
    public void after(Match match, Result result) {}

    @Override
    public void match(Match match) {
        ThreadLocalStepDefinitionMatch.set((StepDefinitionMatch)match);
    }

    @Override
    public void embedding(String mimeType, byte[] data) {}

    @Override
    public void write(String text) {}
}

Класс ThreadLocal для хранения переменной StepDefinitionMatch.

public class ThreadLocalStepDefinitionMatch {

    private static final ThreadLocal<StepDefinitionMatch> threadStepDefMatch = new InheritableThreadLocal<StepDefinitionMatch>();

    private ThreadLocalStepDefinitionMatch() {
    }

    public static StepDefinitionMatch get() {
        return threadStepDefMatch.get();
    }

    public static void set(StepDefinitionMatch match) {
        threadStepDefMatch.set(match);
    }

    public static void remove() {
        threadStepDefMatch.remove();
    }
}

Объявление пользовательского плагина в классе бегуна

@CucumberOptions(plugin = { "pretty", "html:report", "json:reports.json",
        "rerun:target/rerun.txt", "cusform.CustomFormatter" }

Наконецдоступ к переменной StepDefinitionMatch в классе определения шага

@When("^user gets count from \"([^\"]*)\"$")
    public void userGetsCountFromAndStores(String arg) {
        StepDefinitionMatch match = ThreadLocalStepDefinitionMatch.get();
        System.out.println(match.getStepName());
        System.out.println(match.getPattern());
        System.out.println(match.getArguments());
    }

Вывод на консоль дает следующее

user gets count from "Car1"
^user gets count from "([^"]*)"$
[Car1]

Вы используете довольно старую версию Cucumber, если вы обновляетек огурцу 2 будут некоторые изменения.StepDefinitionMatch заменено на PickleTestStep.Объявление в бегуне остается прежним.Класс ThreadLocal меняет сохраненный класс на PickleTestStep.

Пользовательский форматер становится

public class CustomFormatter implements Formatter {

    public CustomFormatter() {}

    private EventHandler<TestStepStarted> stepStartedHandler = new EventHandler<TestStepStarted>() {
        @Override
        public void receive(TestStepStarted event) {
            handleTestStepStarted(event);
        }
    };

    @Override
    public void setEventPublisher(EventPublisher publisher) {
        publisher.registerHandlerFor(TestStepStarted.class, stepStartedHandler);
    }

    private void handleTestStepStarted(TestStepStarted event) { 
        if(event.testStep instanceof PickleTestStep) {
            ThreadLocalPickleStep.set((PickleTestStep)event.testStep);
        }

    }
}

Доступ к переменной StepDefinitionMatch в классе определения шага

@When("^user gets count from \"([^\"]*)\"$")
    public void userGetsCountFromAndStores(String arg) {

        System.out.println(ThreadLocalPickleStep.get().getStepText());
        System.out.println(ThreadLocalPickleStep.get().getPattern());
        System.out.println(ThreadLocalPickleStep.get().getDefinitionArgument());
    }

Вывод такой же, как и раньше.

0 голосов
/ 04 июня 2019

Вот что я сделал в огурце 4,

Создайте класс прослушивателя событий и добавьте его в качестве плагина для опций огурца:

public class TestStepWatch implements ConcurrentEventListener {
    private EventHandler<TestStepStarted> stepHandler = new EventHandler<TestStepStarted>()
    {
        @Override
        Public Void receive(TestStepStarted event)
        {
            handleTestStep(event)
        }

        private synchronized void handleTestStep(TestStepStarted event)
        {
            System.out.println("Running step:"+ event.testStep.getStepText());
        }
    }
}
0 голосов
/ 18 мая 2018

Просто дождитесь выпуска Cucumber 3.0.0, вы можете получить доступ к именам шагов, используя аннотации @AfterStep и @BeforeStep.

https://github.com/cucumber/cucumber-jvm/blob/master/CHANGELOG.md https://github.com/cucumber/cucumber-jvm/pull/1323

Благодаря Аникет (Кодирующий Йог) https://github.com/coding-yogi

...