能否在Gherkin的DataTable中使用参数?Cucumber场景示例问询
在Cucumber中复用参数组合的实现方案
Cucumber本身不支持在Scenario Outline的Examples表格中直接使用<eat>+<left>这种参数组合语法,不过可以通过以下几种方式实现你的核心需求:
1. 提前计算固定值(最简单方案)
如果参数组合的逻辑固定,直接在Examples表格中填入计算后的结果即可:
Scenario Outline: eating Given there are <start> cucumbers When I eat <eat> cucumbers Then I should have <left> cucumbers with <total> Examples: | start | eat | left | total | | 12 | 5 | 7 | 12 | | 20 | 5 | 15 | 20 |
优点:无需额外代码,直观易懂;缺点:参数变化时需要手动重新计算。
2. 在步骤定义中动态计算(推荐方案)
把参数组合的逻辑移到步骤定义的代码中,不需要在Examples里传递组合后的参数:
调整后的Gherkin用例
Scenario Outline: eating Given there are <start> cucumbers When I eat <eat> cucumbers Then I should have <left> cucumbers where the sum of eaten and remaining equals the initial count Examples: | start | eat | left | | 12 | 5 | 7 | | 20 | 5 | 15 |
步骤定义示例(Java)
// 用场景上下文存储参数值 public class ScenarioContext { private static final ThreadLocal<Map<String, Object>> context = ThreadLocal.withInitial(HashMap::new); public static void set(String key, Object value) { context.get().put(key, value); } public static <T> T get(String key) { return (T) context.get().get(key); } } @Given("there are {int} cucumbers") public void thereAreCucumbers(int start) { ScenarioContext.set("start", start); } @When("I eat {int} cucumbers") public void iEatCucumbers(int eat) { ScenarioContext.set("eat", eat); } @Then("I should have {int} cucumbers where the sum of eaten and remaining equals the initial count") public void verifySum(int left) { int start = ScenarioContext.get("start"); int eat = ScenarioContext.get("eat"); assert start == eat + left : "Sum of eaten and remaining cucumbers doesn't match initial count"; }
这种方式把业务逻辑放在代码层,保持用例的简洁性,同时支持灵活的参数组合。
3. 自定义参数解析(适配复杂场景)
如果一定要在Examples表格中保留组合表达式,可以在步骤定义中解析表达式并计算:
Gherkin用例
Scenario Outline: eating Given there are <start> cucumbers When I eat <eat> cucumbers Then I should have <left> cucumbers with <total> Examples: | start | eat | left | total | | 12 | 5 | 7 | eat+left | | 20 | 5 | 15 | eat+left |
步骤定义示例(Java)
@Then("I should have {int} cucumbers with {string}") public void verifyTotal(int left, String totalExpression) { int start = ScenarioContext.get("start"); int eat = ScenarioContext.get("eat"); int calculatedTotal = switch(totalExpression) { case "eat+left" -> eat + left; // 可以扩展更多组合逻辑,比如"start-eat"等 default -> throw new IllegalArgumentException("Unsupported expression: " + totalExpression); }; assert start == calculatedTotal : "Calculated total doesn't match expected value"; }
这种方式允许你在Examples中使用自定义表达式,但需要自行维护表达式的解析逻辑。
内容的提问来源于stack exchange,提问作者Roberto Teresa
相关产品推荐
相关产品推荐

