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
相关产品推荐
相关产品推荐

