我正在Ruby on Rails应用程序上使用Steak进行验收测试。想象一下,我想测试一个表单的功能。
在第一种情况下,一条消息将通知用户已创建:'用户已创建'
在第二种情况下,错误消息将指示错误。
我可以根据显示的信息进行测试。也就是说,如果显示正确的消息,则第一次测试通过。
或者我可以根据数据库的变化进行测试。也就是说,如果数据库有一个包含输入数据的新用户,则第一次测试通过。
或者我可以断言这两个条件,数据库应该更改并显示相应的消息。
根据行为驱动开发,这种行为的概念适当的方法是什么?
根据实用程序员的说法,测试这种行为的实用方法是什么?
答案 0 :(得分:4)
通常,请保持用户看到的内容。
但是,有时候信息的用户不止一个。也许,一旦数据到达数据库,另一个应用程序就会使用这些数据(对内部项目来说非常典型!)
如果无法将两个应用程序一起自动化,那么断言数据库的内容,或者验证RESTful URL上的资源,都是一个很好的方法。
如果您这样做,它可能会改变您的方案的性质。而不是说Then the database should contain XYZ
,尝试类似:
Given that Fred Brown lives at 25 Warrington Grove, Springfield
When Fred orders a deckchair
Then the warehouse should receive an order:
Deckchair
Quantity: 1
To: Fred Brown
25 Warrington Grove
Springfield
因此,您始终在关注系统的功能,而不仅仅是数据 - 即使仓库在您的方案中没有真正收到它,您也会显示为什么数据必须在那个特定的地方和形式。
这样,您也可以选择使用真实用户界面或RESTful URL等 - 该步骤与您选择的实施无关。
答案 1 :(得分:3)
我的BDD实践涉及使用Cucumber。我尽最大努力保持用户看到的内容。也就是说,任何When
和Then
语句都应反映用户输入或用户视觉效果。
在你的情况下,我会确保之后出现成功消息,然后我会(如果可能的话)在屏幕上查找指示应用程序知道该对象的数据。例如,如果您在博文中添加评论,则应填写帖子,点击“接受”按钮,查看“已发布消息”成功消息,然后在页面上将您的内容视为新帖子。< / p>
您应该使用单元和有时控制器测试来备份用户驱动的BDD测试,以确保幕后的所有内容都能正常运行。
我倾向于使用RSpec并验证事情是否已添加到数据库中,方法正在返回预期结果等。但我也使用Cucumber确保用户看到用户期望看到的内容(但我并不是真的让黄瓜关心数据库中的内容。
我希望这会有所帮助。如果您不使用黄瓜,我强烈推荐它与RSpec一起进行BDD测试。你应该查看这本书(以电子PDF格式提供) - 我从那开始,它通过我的测试实践帮助吨:
答案 2 :(得分:0)
我同意保持用户看到的内容,直到某一点。
如果有某种层可能会在内存中保留一个值,那么它可能会在网站上显示,就好像它在数据库中一样,当它实际上没有被写到数据库中时...那么它使用db级别的一些检查来备份“用户看到的内容”可能是一个好主意。