如何在挂钩之前获取所有黄瓜场景步骤?
How to get all the cucumber scenario steps in before hook?
我想访问 @before
挂钩中的所有黄瓜场景步骤。有办法吗?
我尝试在 before hook 方法中传递 cucumber 场景对象,但它只提供基本信息,如 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 方法中传递 class 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 不提供任何直接的方法来获取 Hook 中场景的完整信息。有 Scenario 接口,它可以为您提供非常有限的信息,例如场景名称,下面是该接口的其余直接方法。
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();
}
Java:
参考TestCase
下的界面cucumber-jvm/core/src/main/java/io/cucumber/core/runner/TestCase.java
testcase.getTestSteps();
我知道这个问题与 ruby 无关,但也想在 ruby 中提供解决方案,以便它可以帮助在 [=] 中寻找解决方案的人32=].
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
}
}
}
使用 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'
我想访问 @before
挂钩中的所有黄瓜场景步骤。有办法吗?
我尝试在 before hook 方法中传递 cucumber 场景对象,但它只提供基本信息,如 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 方法中传递 class 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 不提供任何直接的方法来获取 Hook 中场景的完整信息。有 Scenario 接口,它可以为您提供非常有限的信息,例如场景名称,下面是该接口的其余直接方法。
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();
}
Java:
参考TestCase
下的界面cucumber-jvm/core/src/main/java/io/cucumber/core/runner/TestCase.java
testcase.getTestSteps();
我知道这个问题与 ruby 无关,但也想在 ruby 中提供解决方案,以便它可以帮助在 [=] 中寻找解决方案的人32=].
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
}
}
}
使用 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'