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

.NET6+SpecFlow3.9中如何在Cucumber步骤传递JSON请求体

解决SpecFlow中Examples表格传递完整JSON参数的问题

一、Feature文件的正确写法

方式1:单引号包裹JSON(适配表格场景)

在Examples表格的JSON字段外层添加单引号,避免SpecFlow按空格拆分参数。示例:

Scenario Outline: 提交JSON请求
    Given 我准备了请求体: <RequestBody>
    When 发送POST请求到接口
    Then 响应状态码应为200

    Examples:
        | RequestBody                                                                 |
        | '{"username":"test","password":"123456","roles":["admin","user"]}' |

方式2:DocString(适合复杂JSON结构)

如果JSON层级多、格式复杂,可直接用DocString传递,无需依赖表格参数:

Scenario: 提交复杂JSON请求
    Given 我准备了请求体:
    """
    {
        "username": "test",
        "password": "123456",
        "roles": ["admin", "user"],
        "profile": {
            "age": 30,
            "email": "test@example.com"
        }
    }
    """
    When 发送POST请求到接口
    Then 响应状态码应为200

二、对应C#步骤定义写法

适配表格单引号JSON的步骤定义

使用正则表达式捕获完整JSON字符串,步骤定义会自动接收单个参数:

using Newtonsoft.Json;
using TechTalk.SpecFlow;

[Binding]
public class RequestSteps
{
    private string _requestBody;

    [Given(@"我准备了请求体: '(.*)'")]
    public void GivenIPreparedTheRequestBody(string jsonStr)
    {
        _requestBody = jsonStr;
        // 如需反序列化为实体类:
        // var requestModel = JsonConvert.DeserializeObject<YourRequestModel>(jsonStr);
    }

    // 其他步骤逻辑...
}

说明:正则中的'(.*)'会精准匹配单引号包裹的全部内容,确保JSON作为单个参数传递,不会被拆分。

适配DocString的步骤定义

直接接收string类型参数,SpecFlow会自动将DocString的完整内容传入:

[Given(@"我准备了请求体:")]
public void GivenIPreparedTheRequestBody(string jsonStr)
{
    _requestBody = jsonStr;
    // 反序列化逻辑同上
}

三、额外注意事项

  • 若JSON本身包含单引号,需转义为\';也可改用双引号包裹JSON,同时将步骤定义的正则调整为"(.*)",注意避免和Gherkin语法冲突。
  • 推荐使用Newtonsoft.Json或System.Text.Json处理JSON序列化/反序列化,保证类型安全。
  • SpecFlow 3.9.0原生支持上述参数捕获方式,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:30:10