Как выполнить все шаги сценария с огурцом до зацепа?

Я хочу получить доступ ко всем этапам сценария огурца в @before хуке. Есть ли способ сделать это?

Я попытался передать объект сценария огурца в методе хука before, но он предоставляет только базовую информацию, такую ​​как scenario.getName(), scenario.getId(). Мне нужно что-то вроде getSteps(), которое дает мне List<String> всех шагов этого конкретного сценария.

Я ищу что-то вроде этого

    @Before("@dev")
public void testcase(Scenario scenario){

    for (Step a : scenario.getSteps()) {
        System.out.println("scenario step = " + a.getText());
    }
}

Обычно мне нужна полная информация о сценарии в самом начале выполнения теста.

Если я передаю аргумент класса cucumber.api.TestCase в методе before, я могу получить доступ к методу getTestSteps(), но это приведет к исключению ниже.

cucumber.runtime.CucumberException: When a hook declares an argument it must be of type cucumber.api.Scenario. public void com.thermofisher.bid.spa.kingfisher.ui.steps.Hooks.poc(cucumber.api.TestCase)

person DEVYANSH MITTAL    schedule 24.05.2019    source источник
comment
Какое полное название класса сценария?   -  person Qingfei Yuan    schedule 24.05.2019
comment
cucumber.api.Scenario.class   -  person DEVYANSH MITTAL    schedule 24.05.2019
comment
Вы пробовали с TestCase.getTestSteps?   -  person supputuri    schedule 24.05.2019
comment
Пробовали с этим, но проблема в том, что хук before принимает в качестве агрумента только сценарий. В противном случае выбросите вышеупомянутое исключение. Есть ли способ передать тестовый пример в качестве аргумента   -  person DEVYANSH MITTAL    schedule 25.05.2019
comment
Cucumber не предоставит вам эту информацию. У Serenity может быть доступная информация, но получить ее будет нетривиально. Какую проблему ты пытаешься решить?   -  person John Smart    schedule 25.05.2019
comment
Я иду вторым Джоном по этому поводу. Если это для целей отчетности, взгляните на инфраструктуру плагина.   -  person M.P. Korstanje    schedule 26.05.2019
comment
Привет, Джон, поэтому проблема, которую я пытаюсь решить, состоит в том, чтобы создать ручной тестовый пример из файла сценария / функции gherkin и подтолкнуть его к слиянию / JIRA с использованием атласских API, чтобы уменьшить ручные усилия в нашем рабочем процессе. Не могли бы вы дать мне знать, как получить информацию, о которой вы говорите, от безмятежности?   -  person DEVYANSH MITTAL    schedule 26.05.2019
comment
@JohnSmart, подумайте об этом: хук Before используется для вызова перед выполнением сценария. Это можно сделать, чтобы записать, какой сценарий выполняется. Cucumber также предоставляет BeforeStep хук, но вместо того, чтобы разрешать доступ к PickleStepTestStep, он заставляет вас либо использовать без аргументов, либо один аргумент, который также должен быть объектом сценария. Это бесполезно в контексте Шага. Можно было бы предположить, что, если я хочу регистрировать информацию, относящуюся к шагу, можно использовать этот хук с аргументом PickleStep, чтобы вы могли регистрировать текст шага, номер строки и т. Д.   -  person hfontanez    schedule 27.08.2019


Ответы (4)


Попробуйте что-то вроде этого:

@Before
public void setUp(Scenario scenario) throws Exception{

    tags = (ArrayList<String>) scenario.getSourceTagNames();
    System.out.println("At Hooks: " + scenario.getId());
    Iterator ite = tags.iterator();

    while (ite.hasNext()) {

        String buffer = ite.next().toString();
        if (buffer.startsWith("<tagOfATestCase>")) {

            Field f = scenario.getClass().getDeclaredField("testCase");
            f.setAccessible(true);
            TestCase r = (TestCase) f.get(scenario);

            List<PickleStepTestStep> testSteps = r.getTestSteps().stream().filter(x -> x instanceof PickleStepTestStep)
                    .map(x -> (PickleStepTestStep) x).collect(Collectors.toList());

            for (PickleStepTestStep ts : testSteps) {

                System.out.println(ts.getStepText());//will print your test case steps

            }

        }

    }
person atrinil    schedule 06.12.2019

Cucumber не предоставляет вам какой-либо прямой метод получения полной информации о сценарии внутри крючка. Существует интерфейс сценария, который может предоставить вам очень ограниченную информацию, например название сценария, а ниже приведены остальные прямые методы этого интерфейса.

public interface Scenario {
    Collection<String> getSourceTagNames();
    Result.Type getStatus();
    boolean isFailed();
    void embed(byte[] data, String mimeType);
    void write(String text);
    String getName();
    String getId();
    String getUri();
    List<Integer> getLines();
}

введите описание изображения здесь

person TheSociety    schedule 24.05.2019
comment
Спасибо за ответ, интерфейс сценария, о котором я уже знаю и пробовал его использовать. Но это не решает мою цель, как вы упомянули, она предоставляет очень ограниченную информацию, поэтому я разместил вопрос, чтобы найти обходной путь. Существуют и другие классы, которые предоставляют детали сценария, такие как cucumber.api.TestCase, но проблема в том, чтобы использовать их в методе хуков. - person DEVYANSH MITTAL; 24.05.2019

Java:

См. Интерфейс TestCase в cucumber-jvm/core/src/main/java/io/cucumber/core/runner/TestCase.java

https://github.com/cucumber/cucumber-jvm/blob/main/core/src/main/java/io/cucumber/core/runner/TestCase.java

testcase.getTestSteps();

Я знаю, что вопрос не относится к Ruby, но хочу предоставить решение и на Ruby, чтобы он мог помочь тем, кто ищет решение на Ruby.

Ruby: выдаст весь список шагов.

scenario.source[1].steps
person supputuri    schedule 24.05.2019
comment
Проблема в том, что вы не можете получить прямой доступ к данным Step (PickeStepTestStep), потому что хуки Cucumber ограничивают ваш доступ к объекту Scenario, даже при использовании @BeforeStep. - person hfontanez; 27.08.2019

В Cucumber 6.10.3 это можно сделать с помощью следующего кода:

Field f = scenario.getClass().getDeclaredField("delegate");
f.setAccessible(true);
io.cucumber.core.backend.TestCaseState sc = (io.cucumber.core.backend.TestCaseState) f.get(scenario);          
Field f1 = sc.getClass().getDeclaredField("testCase");
f1.setAccessible(true);
io.cucumber.plugin.event.TestCase testCase = (io.cucumber.plugin.event.TestCase) f1.get(sc);
        
List<PickleStepTestStep> testSteps = testCase.getTestSteps().stream().filter(x -> x instanceof PickleStepTestStep).map(x -> (PickleStepTestStep) x).collect(Collectors.toList());

for (PickleStepTestStep ts : testSteps) {
       System.out.println(ts.getStep().getKeyword() + ts.getStep().getText());
}

Импорт:

import io.cucumber.java8.Scenario;
import io.cucumber.plugin.event.PickleStepTestStep;
import io.cucumber.core.backend.TestCaseState;
import java.lang.reflect.Field;
import java.util.stream.Collectors;

Зависимости: (вам нужно только 'cucumber-java8' или 'cucumber-java')

compile group: 'io.cucumber', name: 'cucumber-java8', version: '6.10.3'
compile group: 'io.cucumber', name: 'cucumber-java', version: '6.10.3'
compile group: 'io.cucumber', name: 'cucumber-core', version: '6.10.3'
person Francisco Javier Díaz Niño    schedule 11.05.2021