SpecFlow中如何跨Feature文件调用执行其他Feature定义的Given步骤
现有2份SpecFlow Feature文件:
Feature 1 环境数据匹配
Feature: Environment data fitting Scenario: Deduction of external environment condition Given External environment decision records are """ Overcast -> Rainy Sun -> Sunny No Sun -> Night """ When The data fitting is completed Then Show current condition as Rainy, if there is Overcast Then Show current condition as Sunny, if there is Sun Then Show current condition as Night, if there is No Sun
Feature 2 决策生成
Feature: Decision making Background: # 期望在此处加载Feature1中定义的外部环境判定记录步骤 # Some how load data from 'Given External environment records are' # from 'Feature: Environment data fitting' Scenario: Deduction of external environment condition Given Accessory decision records are """ Overcast -> Umbrella Sun -> Sunglasses No Sun -> ElectricTorch """ When The model is trained Then Take ElectricTorch, if it is Night Then Take Umbrella, if it is Rainy Then Take Sunglasses, if it is Sunny
诉求:能否在Feature2执行流程中,直接调用Feature1内定义的Given步骤?要求不使用TechTalk.SpecFlow中已标记为*Obsolete*的代码层Given调用方法(即Given($"External environment decision records are", data);这类写法),不编写额外代码,仅通过SpecFlow框架原生能力,直接在.feature文件层面完成步骤复用。
完全可以,不需要写任何额外代码,也不会用到那个被标记为过时的代码层调用API。
首先要明确SpecFlow的核心机制:所有带[Given]/[When]/[Then]标记的步骤绑定方法都是全局生效的,和步骤最初写在哪个Feature文件里没有绑定关系。只要你在任意Feature文件里写的步骤文本,能匹配到已有的步骤绑定正则,SpecFlow就会自动执行对应的实现逻辑,根本不关心这个步骤最早是为哪个Feature写的。
你要在Feature2里复用那个环境记录的Given步骤,不需要什么特殊的跨Feature调用语法,直接把步骤原封不动写到需要的位置就行,包括步骤后面附带的多行docstring参数也要一起带上。比如你可以直接把Feature2的Background块改成这样:
Background: Given External environment decision records are """ Overcast -> Rainy Sun -> Sunny No Sun -> Night """ When The data fitting is completed
运行的时候SpecFlow会自动匹配到Feature1对应的那个Given步骤的实现直接执行,完全满足你的要求。
有个点需要说明:SpecFlow原生没有提供「跨文件直接引用其他Feature中已写好的步骤片段」的类include语法,你没法只写一个类似引用标记就把别的文件里写过的大段步骤直接拉过来执行,必须把要复用的步骤文本(包括配套的表格、多行字符串参数)完整写在当前Feature的对应位置。
如果是同一个Feature里多个Scenario共用的步骤,你可以把公共步骤抽到Background块里只写一次,减少重复;跨文件的公共步骤如果不想重复写大段文本,目前框架原生没有对应的支持,要么老老实实重复写匹配的步骤文本,要么借助构建时的文本预处理工具做文件内容拼接,但后者不属于SpecFlow本身提供的.feature层面能力。
内容的提问来源于stack exchange,提问作者ViV

