【问题标题】:How to get all the cucumber scenario steps in before hook?如何在钩子之前获取所有黄瓜场景步骤?
【发布时间】:2019-05-24 16:22:54
【问题描述】:

我想访问@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());
    }
}

基本上我想要在测试执行本身开始时获得完整的场景信息。

如果我在 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)

【问题讨论】:

  • Scenario 类的全称是什么?
  • cucumber.api.Scenario.class
  • 你试过TestCase.getTestSteps吗?
  • Cucumber 不会给你这个信息。 Serenity 可能有可用的信息,但获得它并非易事。你想解决什么问题?
  • 我在这件事上是第二个约翰。如果是出于报告目的,请查看插件基础结构。

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


【解决方案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

            }

        }

    }

【讨论】:

    【解决方案2】:

    Cucumber 没有提供任何直接的方法来获取 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();
    }
    

    【讨论】:

    • 感谢您的回答,场景界面我已经知道并尝试使用它。但这并不能解决您提到的我的目的,它提供的信息非常有限,这就是我发布问题以寻求解决方法的原因。还有其他类提供场景的详细信息,如 cucumber.api.TestCase 但问题是如何在 hooks 方法中使用它们。
    【解决方案3】:

    Java:

    参考cucumber-jvm/core/src/main/java/io/cucumber/core/runner/TestCase.java下的TestCase接口

    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
    

    【讨论】:

    • 问题是您无法直接访问 Step 数据 (PickeStepTestStep),因为 Cucumber 挂钩限制了您对 Scenario 对象的访问,即使在使用 @BeforeStep 时也是如此。
    【解决方案4】:

    使用 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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 2018-05-20
      • 2011-04-06
      相关资源
      最近更新 更多