如何在Cucumber-TestNG中获取场景参数与步骤定义?
解决Cucumber TestNG 7.3.4中获取场景参数和步骤语句的问题
1. 获取场景运行时参数(Scenario Outline实例参数)
有两种实用方式:
方式一:在步骤定义的@Before钩子中获取
在步骤定义类里,通过@Before钩子注入TestCase和Scenario对象,直接从公开API提取参数:
import io.cucumber.java.Before; import io.cucumber.plugin.event.TestCase; import io.cucumber.java.Scenario; import io.cucumber.core.gherkin.PickleArgument; @CucumberContextConfiguration @ContextConfiguration(...) // 配置你的Spring上下文路径 public class StepDefinitions { @Before public void collectScenarioParams(TestCase testCase, Scenario scenario) { // 获取替换参数后的场景名称(格式如"场景名 - Sunday, Nope") String scenarioName = scenario.getName(); // 遍历获取所有参数的键值对 for (PickleArgument arg : testCase.getPickle().getArguments()) { String paramName = arg.getName(); String paramValue = arg.getValue(); // 可将参数存入全局变量或上下文,供后续步骤使用 } } }
方式二:在测试类中重写runScenario方法
若需在TestNG测试类层面获取参数,重写AbstractTestNGCucumberTests的runScenario方法:
import io.cucumber.testng.AbstractTestNGCucumberTests; import io.cucumber.testng.PickleWrapper; import io.cucumber.testng.FeatureWrapper; import io.cucumber.core.gherkin.Pickle; import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; @CucumberOptions(features = "classpath:features", glue = "com.your.package.steps") public class CucumberTestRunner extends AbstractTestNGCucumberTests { @Override protected void runScenario(PickleWrapper pickleWrapper, FeatureWrapper featureWrapper) { Pickle pickle = pickleWrapper.getPickle(); // 遍历输出所有场景参数 pickle.getArguments().forEach(arg -> { System.out.printf("参数名:%s,参数值:%s%n", arg.getName(), arg.getValue()); }); super.runScenario(pickleWrapper, featureWrapper); } }
2. 获取完整的步骤定义语句
无需访问包私有方法,通过公开的Pickle对象即可获取:
在@Before钩子中获取所有步骤语句
@Before public void collectStepStatements(TestCase testCase) { testCase.getPickle().getSteps().forEach(step -> { String fullStepText = step.getText(); // 示例输出:"Given today is Sunday" // 按需处理步骤文本 }); }
在测试类的runScenario方法中获取
@Override protected void runScenario(PickleWrapper pickleWrapper, FeatureWrapper featureWrapper) { Pickle pickle = pickleWrapper.getPickle(); // 遍历输出所有步骤语句 pickle.getSteps().forEach(step -> { System.out.println("步骤语句:" + step.getText()); }); super.runScenario(pickleWrapper, featureWrapper); }
关键说明
- Cucumber 7.x中,
TestCase.getPickle()和PickleWrapper.getPickle()均为公开API,返回的Pickle对象直接提供getArguments()(参数集合)和getSteps()(步骤列表)方法,完全替代了原包私有方法的功能。 - 如果仅需单个步骤的参数,直接通过步骤定义的参数绑定即可(如
@Given("today is {string}")中的String day),但需要全局场景参数时,上述钩子或重写方法更适用。
内容的提问来源于stack exchange,提问作者Johnyb
相关产品推荐
相关产品推荐

