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

Specflow中Scenario Outline每次运行示例用例后如何存储生成的ID?

问题根本原因

Specflow默认绑定类的生命周期为单场景(Scenario)级别:Scenario Outline的每一行示例都会被当做独立的Scenario执行,每次执行前都会重新实例化绑定类,类的实例字段会被重置为默认值null,这就是你第二条用例执行后全局变量为空的原因。同时你目前只声明了2个存储字段,无法容纳4条示例生成的ID。

解决方案

根据你的存储需求,可以选择以下三种方案:

方案1:同一条示例内使用ID(仅本条用例生效)

使用Specflow内置的ScenarioContext存储本条示例的专属变量,无需自行声明全局字段:

[Binding]
public class UserSteps
{
    private readonly ScenarioContext _scenarioContext;

    // Specflow自动注入当前场景的上下文
    public UserSteps(ScenarioContext scenarioContext)
    {
        _scenarioContext = scenarioContext;
    }

    [When("I store the UserNumber")]
    public void WhenIStoreTheUserNumber()
    {
        string userNum = driver.FindElement(By.Id("UserId")).Text;
        // 存入当前场景上下文,本条示例所有步骤都可读取
        _scenarioContext["CurrentUserNumber"] = userNum;
    }

    // 后续步骤读取示例
    [Then("I can get the current user number")]
    public void ThenICanGetCurrentUserNumber()
    {
        string currentNum = _scenarioContext.Get<string>("CurrentUserNumber");
        // 你的校验逻辑
    }
}

方案2:同一个Feature内跨示例存储所有ID

使用Specflow内置的FeatureContext存储整个Feature文件共享的变量,所有示例执行完后仍可读取所有ID:

[When("I store the UserNumber")]
public void WhenIStoreTheUserNumber()
{
    string userNum = driver.FindElement(By.Id("UserId")).Text;
    // 初始化存储列表
    if (!FeatureContext.Current.ContainsKey("AllUserNumbers"))
    {
        FeatureContext.Current["AllUserNumbers"] = new List<string>();
    }
    // 追加当前示例的ID到全局列表
    ((List<string>)FeatureContext.Current["AllUserNumbers"]).Add(userNum);
}

方案3:持久化存储ID到本地

如果需要测试结束后仍保留所有ID,可通过AfterScenario钩子在每条示例执行完成后自动写入本地文件:

[AfterScenario]
public void SaveUserIdAfterScenario()
{
    if (_scenarioContext.TryGetValue("CurrentUserNumber", out string userNum))
    {
        // 追加写入本地文本文件
        File.AppendAllText("UserIds.txt", $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} {userNum}{Environment.NewLine}");
    }
}

静态变量方案补充

如果需要跨Feature全局存储ID,可以将存储字段声明为静态,静态字段属于类级别,不会随实例重建重置:

public class User
{
    // 静态列表存储所有ID,全局共享
    public static List<string> AllUserIds = new List<string>();
    
    public void GetUserNum()
    {
        string UserNumPath = driver.FindElement(By.Id("UserId")).Text;
        AllUserIds.Add(UserNumPath);
    }
}

注意多线程并行测试时,静态变量读写需要加锁避免并发冲突。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:15:05