2 回答
TA贡献1757条经验 获得超7个赞
就 Step 与要测试的方案相关而言,最好在单个 Step 类文件中找到这些步骤。对于场景大纲,它可以是这样的:从袋子中添加/删除土豆。
:在给定袋子有“10”个土豆而不是你使用它的一个场景中使用变量,从长远来看会有所帮助。
TA贡献1773条经验 获得超3个赞
关于如何构建功能文件和步骤定义,有很多不同的意见,其中很多都归结为偏好和项目的需求。我在这里的所有想法都是关于通过浏览器对大型项目进行系统测试的,这可能与每个人无关。
也就是说,我运气最好,功能与步骤之间存在1对1的关系。我喜欢使用一个步骤 def 来提供单个功能文件,并避免重用步骤作为保持代码 DRY 的主要策略(这就是页面对象的用途!偶尔重用一个步骤是有意义的(例如,鉴于我已经登录),但我的经验是,它会导致建立这些非常小的原子步骤的大库,这些步骤很难找到,难以重用,并将小黄瓜推向极致。
1对1方法(除了在黄瓜文档中违反这种反模式之外)的明显抱怨是,它会导致重复的代码,但我发现任何你想多次做的事情都可能是一个通用的操作,可以向下推送到页面对象。这在步骤定义中留下的很少,除了特定于正在测试的业务规则的代码,无论如何您都不需要复制这些代码。
如此简短的回答,我将与该功能的其他步骤保持在同一类中。但就像你说的,你的例子很简单,所以我猜测你的项目最终会是什么需求。i_remove_one_potato()
例如大纲,您应该能够执行如下操作
Scenario Outline: I add/remove potatoes from bag
Given the bag has <initial> potatoes
When I <add_remove> <delta> potatoes
Then I should be told <outcome> potatoes
Examples:
| add_remove | initial | delta | outcome |
| add | 10 | 1 | 11 |
| add | 10 | 10 | 20 |
| remove | 10 | 1 | 9 |
| remove | 10 | 10 | 0 |
我尽量不要用场景大纲过度使用它,但这可能走得太远了。将整个功能归结为一个由通用步骤驱动的编程表可能很诱人,但在某些时候,很难提取出各个业务规则是什么。当一个示例开始失败时,您必须将整个事情分开,并找出作者为什么选择他所做的表值。BDD工具应该照亮该功能,而大型表格往往会掩盖它。对于上面的示例,我可能应该将添加和删除拆分为单独的大纲,因此我不会将不同业务规则的示例混合在一起。
添加回答
举报