假设我有一个用户可以上传他的头像的应用程序,然后他被重定向到他裁剪它的裁剪页面。我可能有像上传那样的Cucumber场景
Scenario: Registered user wants to upload avatar
Given I follow "Upload picture"
When I attach the file "spec/fixtures/kitten.jpg" to "user_avatar"
And I press "Upload"
Then I should see "Picture was successfuly uploaded."
And I should be on the user crop page
然后我想创建用于裁剪头像的场景,该场景将直接跟随第一个。它可能看起来像这样
Scenario: User just uploaded avatar
Given I just uploaded "spec/fixtures/kitten.jpg" as my avatar
When I crop it to 100x100 px
And I press "Crop"
Then my avatar should have 100x100 px
And I should see "Picture successfuly cropped."
但是在这里我必须定义
Given I just uploaded "spec/fixtures/kitten.jpg" as my avatar
做与前一个场景完全相同的事情,对我来说看起来像是巨大的重复。更不用说如果我想在这之后继续第三种情况,我将不得不复制第二种情况。
对于小例子,可能会将所有这些放在一个大的场景中,但即使在这种情况下,它看起来也会非常难看。
一般来说,让一些场景相互关联并将其状态传递给下一个场景的正确策略是什么?
答案 0 :(得分:3)
一般来说,你不希望彼此有条件地进行测试。它们应该能够以任何顺序独立运行。当您开始将测试耦合在一起时,它将开始使故障更难调试。
鉴于我刚上传了“spec / fixtures / kitten.jpg”,因为我的头像并不需要与第一个cuke完全相同。您可以轻松地在文件系统上创建文件,并在Cucumber步骤中创建任何所需的模型。您已经知道上传部分有效,因此您无需在第二个示例的裁剪之前执行完整上传。
或者,或者,您可以制作一个包含以下内容的步骤:
Given I follow "Upload picture"
When I attach the file "spec/fixtures/kitten.jpg" to "user_avatar"
And I press "Upload"
并在规格中重复使用。这样,您可以在第一次测试中测试着陆页和闪光灯,在第二次测试中测试裁剪。闪存和着陆页的值对于第二次测试无关紧要。
答案 1 :(得分:0)
我对此的感觉是,您的目标应该是让所有测试都自包含,并且还要针对基于活动的方法,而不是基于任务。我会提倡这样的事情:
(注意:我在这里使用groovy,因为我对Ruby不太满意)
Scenario: User just uploaded avatar
Given I just uploaded "spec/fixtures/kitten.jpg" as my avatar
When I crop it to 100x100 px
And I press "Crop"
Then my avatar should have 100x100 px
And I should see "Picture successfuly cropped."
步骤定义应该调用一个可以重用的方法:
Given(~'I just uploaded "(.+)" as my avatar') { avatar ->
uploadAvatar(avatar)
}
def uploadAvatar(avatar) {
//place the previous steps in here.
}
看起来比你之前做的简单得多。
注意:活动与任务可以用这个例子来解释:想象一下我们正在测试ATM。活动是“识别银行”,“提取资金”等......, 任务是:“接近ATM”,“输入引脚”,“验证引脚”,“选择数量”,“按下确定”等...,
对我来说,活动可以更好地解释系统行为并保持UI开放,这意味着您的测试不那么脆弱。