如何在钩子之前获取所有黄瓜方案步骤?

时间:2019-05-24 16:22:54

标签: java cucumber cucumber-jvm serenity-bdd cucumber-serenity

我想访问@before挂钩中的所有黄瓜方案步骤。有办法吗?

我曾尝试通过before hook方法传递黄瓜方案对象,但是它仅提供基本信息,例如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());
    }
}

基本上,我希望在测试执行本身开始时就获得完整的方案信息。

如果我在before方法中传递了类banana.api.TestCase的参数,那么我可以访问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)

4 个答案:

答案 0 :(得分:1)

尝试这样的事情:

@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

            }

        }

    }

答案 1 :(得分:0)

黄瓜不提供任何直接的方法来获取Hook内方案的完整信息。 场景界面可以为您提供非常有限的信息,例如场景名称,下面是该界面的其余直接方法。

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();
}

enter image description here

答案 2 :(得分:0)

Java:

请参考TestCase下的cucumber-jvm/core/src/main/java/cucumber/api/TestCase.java界面

https://github.com/cucumber/cucumber-jvm/blob/master/core/src/main/java/cucumber/api/TestCase.java

testcase.getTestSteps();

我知道问题与红宝石无关,但我也想提供红宝石解决方案,以便它可以帮助某人在红宝石中寻找解决方案。

Ruby::将提供所有步骤列表。

scenario.source[1].steps

答案 3 :(得分:0)

使用 Cucumber 6.10.3 可以做到,代码如下:

int days

进口:

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());
}

依赖项:(你只需要'cucumber-java8'或'cucumber-java')

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;