举个例子,如果用户输入了一个无效的电话号码,那么应该会弹出一个提示信息"Invalid Telephone Number"。如果我使用Cucumber写出所有检查代码,然后再写RSpec代码,这样做就会导致测试重复了。请问应该如何区分Cucumber测试和RSpec测试?
我感觉在各自的层面上测试都需要重复编写,是否有明确的答案呢?如果没有,我开始认为Cucumber 的设计只是为了避免与RSpec产生冲突。
希望得到帮助,我的头快要爆炸了。谢谢!
你可能会发现在BDDCasts.com上观看屏幕录像很有用。它们会引导你创建应用程序的故事和规范。它确实帮助了我。此外,我也拥有rspec书籍,但仍感到困惑。你甚至可以在他们在Github上的源代码中查看。
对于我来说,测试分为以下两类:
Cucumber用来测试用户所看到的内容(全栈测试)。
Rspec用来测试其他所有东西(模型、控制器等)。
Cucumber是用来解释应用程序某一部分(story)的工具,而不是像RSpec专注于单元测试或行为测试。
所以,在我看来Cucumber测试(stories)不能替代RSpec测试。
RSpec测试往往推动模型和控制器的开发,而stories则倾向于推动视图的开发。
从您的描述中看来,您正在使用Cucumber来同时测试stories和behavior。
Feature: Search users
In order to find people with similar interests as myself
As a user
I want to search for people
Scenario: Search for similar hobbies
Given there is a search page
And there is a list of hobbies
And one of the hobbies is "full contact ironing"
When I select "full contact ironing"
And press search
Then a list of users with the hobby "full contact ironing" are shown
describe "SearchController" do
it "should respond to searches" do
sc = SearchController.new
sc.should respond_to(:search)
end
end
当您运行 RSpec 并看到它失败后,可以开始编写代码:
class SearchController
def search
end
end
就是这样。现在再运行一次您的测试。它应该会通过,所以开始更具体地描述如何实际使用搜索功能。我不想过多深入讨论,只想给您一个想法:您可以在Cucumber中描述您想要的内容,然后在RSpec中描述它应该如何实际工作。
当然,您可以在Cucumber中完成全部测试,也可以全部使用RSpec,但我发现Cucumber帮助我用非常简单的方式表达我想要的东西,如果我尝试在RSpec中做到这一点,我会被细节缠住。如果我先使用Cucumber来描述我想要的基本功能和原因,然后再进入RSpec并描述我想要的功能实际上如何工作,效果会更好。
有时候您的测试会出现重复,这并不十分DRY,但如果您将其视为一个细节问题,它可能不会困扰您太多。起初,我做了很多重复的工作,直到意识到我应该只是在Cucumber中概括地描述我想要的内容,然后在RSpec中具体描述我想要的内容。
这只是一个新手在使用这些工具时想法,但迄今为止,它似乎运行得很好。我可能给您举了个糟糕的例子,但我只是想让您明白,从一般细节到具体细节的想法在使用这些工具时会非常有用。
Cucumber可以用来运行几乎任何代码,这就是我认为你可能会感到困惑的原因。但是Cucumber不提供其他类型的测试工具,例如模拟和存根方法,这使得单元测试更加具体。
Rspec旨在解决小块行为并使所有内容非常离散化。如果您熟悉单元测试和相关框架,则应该更容易理解。
Cucumber的实用程序在于能够将高级描述转换为系统上的一组顶级操作。