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

Cucumber Examples表格占位符使用咨询:如何在测试执行时动态生成ID与Primary ID对应测试值

Dynamic Value Generation for Cucumber Examples Tables

Hey there! Great question—this is a super common need when you want test case IDs to drive dynamic values in your Cucumber scenarios. Let’s break down exactly how to make this work, step by step.

First off, a quick correction: you’ll need to use Scenario Outline instead of Scenario when working with Examples tables—this tells Cucumber to loop through each row in the table and run the scenario with those parameters.

Method 1: Parameterize Steps & Generate Values in Step Definitions

This approach keeps your Gherkin clean and moves the dynamic logic to your step implementation code. Here’s how to adjust your scenario:

Updated Gherkin

Scenario Outline: TC-<ID> Negative - Reject - <TEST_CASE_DESCRIPTION>
Given the profile exists with test case ID <ID>
  And primary ID is <PRIMARY_ID_SOURCE>, market <MARKET>, family <FAMILY>
Then the query request is rejected with:
| HTTP RESPONSE CODE | ERROR CODE | DEVELOPER MESSAGE | MORE INFORMATION |
| <HTTP_RESPONSE_CODE> | <ERROR_CODE> | <DEVELOPER_MESSAGE> | <MORE_INFORMATION> |

Examples:
| ID | TEST_CASE_DESCRIPTION       | PRIMARY_ID_SOURCE | MARKET | FAMILY | HTTP_RESPONSE_CODE | ERROR_CODE | DEVELOPER_MESSAGE         | MORE_INFORMATION                          |
| 02 | Invalid "ID"                | 12765hgadjhs       | 156    | EE     | 404                | 007        | Error calling getAccount() | error retrieving account for given id     |
| 03 | Invalid "P ID"              | <ID>               | 156    | EL     | 404                | 007        | Error calling getAccount() | no active account for give p id           |
| 04 | Invalid "ID" and "PID" Combination | <ID>        | 410    | HCC    | 404                | 007        | Error calling getAccount() | no active account for given Id and p id combination |

Step Implementation Example (Java)

In your step definition, you’ll generate the I_<ID> value automatically, and handle the primary ID logic (use the fixed value or generate P_<ID>):

private String currentTestCaseId;

@Given("the profile exists with test case ID {string}")
public void setTestCaseId(String testCaseId) {
    this.currentTestCaseId = testCaseId;
}

@Given("primary ID is {string}, market {string}, family {string}")
public void createProfileWithDynamicIds(String primaryIdSource, String market, String family) {
    // Generate the I_ID value
    String generatedIId = "I_" + currentTestCaseId;
    
    // Generate PRIMARY ID: use fixed value if provided, else P_<ID>
    String generatedPrimaryId = primaryIdSource.equals(currentTestCaseId) 
        ? "P_" + currentTestCaseId 
        : primaryIdSource;
    
    // Now call your profile creation logic with these generated values
    profileService.createProfile(generatedIId, generatedPrimaryId, market, family);
}

Step Implementation Example (JavaScript)

If you’re using JavaScript/TypeScript:

let currentTestCaseId;

Given('the profile exists with test case ID {string}', function (testCaseId) {
    currentTestCaseId = testCaseId;
});

Given('primary ID is {string}, market {string}, family {string}', function (primaryIdSource, market, family) {
    const generatedIId = `I_${currentTestCaseId}`;
    const generatedPrimaryId = primaryIdSource === currentTestCaseId 
        ? `P_${currentTestCaseId}` 
        : primaryIdSource;
    
    return profileService.createProfile(generatedIId, generatedPrimaryId, market, family);
});

Method 2: Transform Data Tables Directly

If you prefer to keep the original table structure in your Gherkin, you can transform the table data in your step definition to replace placeholders with dynamic values:

Gherkin (Minimal Changes)

Scenario Outline: TC-<ID> Negative - Reject - <TEST_CASE_DESCRIPTION>
Given the profiles exists:
| ID | PRIMARY ID | MARKET | FAMILY |
| <I_ID> | <P_ID> | <MARKET> | <FAMILY> |
Then the query request is not processed
| HTTP RESPONSE CODE | ERROR CODE | DEVELOPER MESSAGE | MORE INFORMATION |
| <HTTP_RESPONSE_CODE> | <ERROR_CODE> | <DEVELOPER_MESSAGE> | <MORE_INFORMATION> |

Examples:
| ID | TEST_CASE_DESCRIPTION       | I_ID | P_ID | MARKET | FAMILY | HTTP_RESPONSE_CODE | ERROR_CODE | DEVELOPER_MESSAGE         | MORE_INFORMATION                          |
| 02 | Invalid "ID"                | <ID> | 12765hgadjhs | 156 | EE | 404 | 007 | Error calling getAccount() | error retrieving account for given id |
| 03 | Invalid "P ID"              | <ID> | <ID> | 156 | EL | 404 | 007 | Error calling getAccount() | no active account for give p id |
| 04 | Invalid "ID" and "PID" Combination | <ID> | <ID> | 410 | HCC | 404 | 007 | Error calling getAccount() | no active account for given Id and p id combination |

Step Implementation (Java)

Use Cucumber’s DataTable to modify the rows before processing:

@Given("the profiles exists:")
public void createProfileFromTable(DataTable table, @ParameterType("\\d+") String testCaseId) {
    List<Map<String, String>> profileRows = table.asMaps();
    
    for (Map<String, String> row : profileRows) {
        // Replace <ID> in the ID column with I_<testCaseId>
        row.put("ID", "I_" + testCaseId);
        
        // Replace <ID> in PRIMARY ID column with P_<testCaseId> if needed
        String primaryId = row.get("PRIMARY ID");
        if (primaryId.equals("<ID>")) {
            row.put("PRIMARY ID", "P_" + testCaseId);
        }
    }
    
    // Process the transformed table to create profiles
    profileService.createProfiles(profileRows);
}

Key Takeaways

  • Always use Scenario Outline with Examples tables for parameterized tests
  • Move dynamic value generation logic to your step definitions (keep Gherkin focused on behavior, not implementation details)
  • You can either parameterize your steps directly or transform data tables to replace placeholders

内容的提问来源于stack exchange,提问作者Supritam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:27:33