Java 如何在上钩前完成所有黄瓜场景步骤?

Java 如何在上钩前完成所有黄瓜场景步骤?,java,cucumber,cucumber-jvm,serenity-bdd,cucumber-serenity,Java,Cucumber,Cucumber Jvm,Serenity Bdd,Cucumber Serenity,我想访问钩子之前的@中的所有黄瓜场景步骤。有办法做到这一点吗 我尝试在before钩子方法中传递cucumber scenario对象,但它只提供基本信息,如scenario.getName(),scenario.getId()。我需要的是类似于getSteps()的东西,它为我提供了该特定场景中所有步骤的列表 我要找的是这样的东西 @Before("@dev") public void testcase(Scenario scenario){ for (Step a : sc

我想访问钩子之前的
@中的所有黄瓜场景步骤。有办法做到这一点吗

我尝试在before钩子方法中传递cucumber scenario对象,但它只提供基本信息,如
scenario.getName()
scenario.getId()
。我需要的是类似于
getSteps()
的东西,它为我提供了该特定场景中所有步骤的
列表

我要找的是这样的东西

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

    for (Step a : scenario.getSteps()) {
        System.out.println("scenario step = " + a.getText());
    }
}
基本上,我希望在测试执行本身开始时获得完整的场景信息

如果我在before方法中传递cucumber.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)

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();
}
公共接口场景{
集合getSourceTagNames();
Result.Type getStatus();
布尔值失败();
void嵌入(字节[]数据,字符串mimeType);
无效写入(字符串文本);
字符串getName();
字符串getId();
字符串getUri();
列出getLines();
}
Java:

请参阅
jvm/core/src/main/java/io/cumber/core/runner/TestCase.java下的
TestCase
接口

我知道这个问题与ruby无关,但我也想用ruby提供解决方案,这样它可能会帮助人们在ruby中寻找解决方案

Ruby:将给出所有步骤的列表

scenario.source[1].steps

试着这样做:

@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

            }

        }

    }
@之前
公共无效设置(场景)引发异常{
tags=(ArrayList)scenario.getSourceTagNames();
System.out.println(“At Hooks:+scenario.getId());
迭代器ite=tags.Iterator();
while(ite.hasNext()){
字符串缓冲区=ite.next().toString();
if(buffer.startsWith(“”){
字段f=scenario.getClass().getDeclaredField(“testCase”);
f、 setAccessible(true);
TestCase r=(TestCase)f.get(场景);
List testSteps=r.getTestSteps().stream().filter(PickleStepTestStep的x->x实例)
.map(x->(PickleStepTestStep)x).collect(collector.toList());
对于(pickleStepTestStepTS:testSteps){
System.out.println(ts.getStepText());//将打印测试用例步骤
}
}
}

使用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());
}
依赖项:(您只需要'cumber-java8'或'cumber-java')


Scenario类的全名是什么?cucumber.api.Scenario.classe您是否尝试过
TestCase.getTestSteps
?cucumber不会提供此信息。Serenity可能有可用的信息,但获取这些信息并不容易。您想解决什么问题?我会在这方面支持John。如果是为了报告purposes看一下插件基础结构。谢谢你的回答,场景界面我已经知道并尝试过使用它。但正如你提到的那样,这并不能解决我的目的,它提供的信息非常有限,这就是为什么我发布了这个问题来解决问题。还有其他类提供了场景的详细信息,比如但问题是如何在hooks方法中使用它们。问题是您无法直接访问步骤数据(PickeStepTestStep),因为cucumber hooks限制了您对场景对象的访问,即使在使用@BeforeStep时也是如此。
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;
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'