如何在Gherkin中复用已创建对象?SpecFlow场景构建咨询
SpecFlow Feature 文件实现方案
完整 Feature 文件示例
# 绩效评估模板管理 Feature: AppraisalTemplateCreation 作为管理员,我需要创建包含已有问题组和交互组的绩效评估模板 Background: # 第一步:创建问题组及关联问题 Given 已创建名为"技术能力评估"的问题组,包含以下问题 | 标题 | 描述 | |-------------------|--------------------------| | 编程语言掌握程度 | 评估员工的编程语言熟练度 | | 框架使用经验 | 评估员工的框架应用能力 | # 第二步:创建交互组及关联员工 And 已创建名为"跨部门协作组"的交互组,包含以下员工 | 名字 | 姓氏 | |------|------| | 张三 | 李 | | 李四 | 王 | # 第三步:复用已创建的组生成评估模板 And 基于已创建的问题组和交互组,创建名为"年度绩效评估模板"的评估模板 Scenario: 验证创建的评估模板包含正确的关联组 Then 评估模板"年度绩效评估模板"的标题应正确 And 评估模板"年度绩效评估模板"应包含问题组"技术能力评估" And 评估模板"年度绩效评估模板"应包含交互组"跨部门协作组"
Step Definitions 核心实现
在步骤绑定代码中,利用ScenarioContext存储已创建的对象,实现跨步骤复用:
// 存储创建的问题组 [Given(@"已创建名为""(.*)""的问题组,包含以下问题")] public void Given已创建名为的问题组包含以下问题(string title, Table table) { var questions = table.CreateSet<Question>(); var questionGroup = new QuestionGroup { Title = title, Questions = questions.ToList() }; // 存入ScenarioContext供后续步骤使用 ScenarioContext.Current["CreatedQuestionGroup"] = questionGroup; } // 存储创建的交互组 [Given(@"已创建名为""(.*)""的交互组,包含以下员工")] public void Given已创建名为的交互组包含以下员工(string title, Table table) { var employees = table.CreateSet<Employee>(); var interactionGroup = new InteractionGroup { Title = title, Employees = employees.ToList() }; ScenarioContext.Current["CreatedInteractionGroup"] = interactionGroup; } // 复用已存储的组创建评估模板 [Given(@"基于已创建的问题组和交互组,创建名为""(.*)""的评估模板")] public void Given基于已创建的问题组和交互组创建名为的评估模板(string templateTitle) { // 从ScenarioContext取出之前创建的对象 var questionGroup = ScenarioContext.Current.Get<QuestionGroup>("CreatedQuestionGroup"); var interactionGroup = ScenarioContext.Current.Get<InteractionGroup>("CreatedInteractionGroup"); var appraisalTemplate = new AppraisalTemplate { Title = templateTitle, QuestionGroups = new List<QuestionGroup> { questionGroup }, InteractionGroups = new List<InteractionGroup> { interactionGroup } }; // 将模板存入上下文供验证步骤使用 ScenarioContext.Current["CreatedAppraisalTemplate"] = appraisalTemplate; } // 验证步骤示例 [Then(@"评估模板""(.*)""的标题应正确")] public void Then评估模板的标题应正确(string expectedTitle) { var template = ScenarioContext.Current.Get<AppraisalTemplate>("CreatedAppraisalTemplate"); template.Title.Should().Be(expectedTitle); // 使用FluentAssertions断言 }
Feature 文件与流程错误校验方法
- 步骤匹配校验
- 编写完Feature文件后,查看SpecFlow的输出窗口,若存在未绑定的步骤,会自动生成对应的步骤绑定代码框架,检查是否有拼写或格式错误。
- 依赖对象存在性校验
- 在创建评估模板的步骤中,添加空值检查:若
ScenarioContext中未找到之前创建的问题组或交互组,直接抛出异常,确保流程依赖的对象已正确生成。
- 在创建评估模板的步骤中,添加空值检查:若
- 属性完整性校验
- 在验证步骤中,逐一校验评估模板的所有关键属性:标题是否正确、关联的问题组/交互组数量是否符合预期、组内的问题/员工是否完整。
- 边界场景测试
- 补充Scenario测试边界情况:比如创建模板时缺少问题组、缺少交互组、重复关联同一组等,验证系统的错误处理逻辑。
内容的提问来源于stack exchange,提问作者Ali.Rashidi
相关产品推荐
相关产品推荐

