当涉及到应该使用rspec(非集成测试)测试什么以及什么不应该测试时,我很挣扎.
使用已经使用Cucumber测试的rspec进行单元测试是否正确(例如,如果Cucumber测试失败,单元测试将100%失败,如果Cucumber测试成功,单元测试将100%成功)?
具体来说,我有三个我想解决的例子.
>这是RSpec书中的一个案例.
他们有以下黄瓜方案:
Given I am not yet playing When I start a new game Then I should see "Welcome to Codebreaker!" And I should see "Enter guess:"
他们在之后建立了两个rspec测试:
describe "#start" do it "sends a welcome message" do end it "prompts for the first guess" do end end
Given I am at the login page When I fill in the right username and password Then I should be at the index page
>有时我们会测试已经使用Cucumber测试过的助手:
Given Mike has spent 283 minutes online When I go to the Mike's profile page Then I should see "4:43" for "Time online:"
我应该测试帮助者在“4:43”中打破283分钟,但事实证明它已经用黄瓜测试了.
它可能不是最好的例子,但它说明了我在说什么.
对我来说,那些测试是重复的.
你能否评论一下上面的例子?
当有黄瓜测试时,是否有关于应该用rspec测试什么的原则或指南?
解决方法
根据一般准则,您应该使用Cucumber来测试整个应用程序堆栈,这称为用户体验.此应用程序堆栈可能由许多较小的独立对象组成,但与使用您的应用程序的用户对这些细节不感兴趣相同,您的黄瓜测试不应该关注它们,而是将注意力集中在应用程序的外层.
另一方面,RSpec(在您的设置中!)应该主要关注那些小对象,构建应用程序的块.
书中的小应用示例存在一个很大的问题:它们很小!
应用程序外层与其内部之间的边界模糊不清.整个应用程序使用两个对象构建!很难区分应该测试什么.随着应用程序规模的扩大,用户体验测试(黄瓜)和对象状态测试/消息期望测试(RSpec)变得越来越明显.
使用你的第二个例子:
有了这个Cucumber的故事:
Given I am at the login page When I fill in the right username and password Then I should be at the index page
Rspec的:
你可能会有某种用户模型:
>测试用户名语法(例如必须以大写字母开头)
>测试密码必须是7个字符有数字等…
您可以拥有某种身份验证对象:
>测试有效和无效登录等
>测试异常被抛出….
如果您的身份验证数据库位于不同的服
> mock连接和身份验证数据库,并测试数据库是否从身份验证对象接收请求.
和yada yada yada …永远你的黄瓜测试将保护您的应用程序用户登录的一般目的.即使您在引擎盖下添加或更改行为,只要此测试通过,您就可以确信用户可以登录.
>你应该测试一次(在一个地方)
>对象负责测试其传入按摩(对象公共接口)的状态(返回值)
>当您的对象依赖于其他对象(发送其消息)时,请不要测试该对象对其负责的状态(返回值).
>当你的对象依赖于其他对象(发送它的消息)时,模拟第二个对象并测试它是否收到你的消息.
一般来说,你的问题太宽泛,你找不到一个答案,不同的人会有不同的想法.你应该关注的是尽可能好地测试,随着时间的推移,你一定会找到适合自己的方式.没有一个伟大的测试套装比没有好.
因为好的设计有助于编写好的测试我会推荐Sandix Metz的Practical Object-Oriented Design in Ruby: An Agile Primer(这是我读过的最好的书之一)