You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:15:33