3

我仍在尝试了解BDD 循环中的cucumber和的组合。rspec

我为一个非常简单的登录系统定义了以下场景:

Feature: Log in

In order to get access to the application
As a user
I want to log in

Scenario: User logs in successfully
  Given I exist as a user
  When I go to the login page
  And I fill in "username" with "gabrielhilal"
  And I fill in "password" with "secret"
  And I press "Login"
  Then I should see "Welcome gabrielhilal"
  And I should be redirected to the home page


Scenario: User enters wrong email/password combination
  Given I exist as a user
  When I go to the login page
  And I fill in "username" with "gabrielhilal"
  And I fill in "password" with "wrongpassword"
  And I press "Login"
  Then I should see "Invalid username/password combination."
  And I should see the login page again

然后,我开始定义steps等待合适的时机跳入rspec.

我通过了第一步模拟用户FactoryGirl并定义了步骤:

Given(/^I exist as a user$/) do
  @user = FactoryGirl.create(:user)
end

我为会话添加了路由、控制器和操作:

When(/^I go to the login page$/) do
  visit login_path
end

我创建了登录表单:

When(/^I fill in "([^"]*)" with "([^"]*)"$/) do |field, value|
  fill_in field, with: value
end
When(/^I press "([^"]*)"$/) do |button|
  click_on(button)
end

我将 Flash 消息添加到我的布局中:

When(/^I should see "([^"]*)"$/) do |arg|
  page.should have_content(arg)
end

我为主页添加了路由和控制器(static_pages):

When(/^I should be redirected to the home page$/) do
  visit home_path
end

我解决了最后一步:

When(/^I should see the login page again$/) do
  visit login_path
end

而且我全都绿了……我觉得不需要rspec经历这些场景。我错过了什么?

我试图了解我应该用 rspec 测试什么。我觉得用 rspec 再次测试所有内容都不合适......

4

3 回答 3

2

我对整个 Cucumber/rspec 的经验如下:在开始时,当您从 BDD 和 Cucumber 开始时,一切都是绿色的,就像您的示例一样。您甚至可以在其前面放置一个浏览器,以便在真正的浏览器中进行测试。然后你不断地在你的 Cucumber 测试中添加越来越多的东西。这很好,很好,因为您正在测试您的 web 应用程序的整个堆栈,这(对我来说)是一个很大的优势。您正在测试用户看到的内容。

但是当你的测试套件变大并且你开始做一些事情,比如在返回的页面中测试标签时,这就是你重构代码时开始遇到问题的时候。此外,Cucumber 对于大型网站来说速度很慢。

我认为最好的方法是尽可能少地使用 Cucumer 和尽可能多的 RSpec。它大大加快了测试速度。所以,在我看来,用 RSpec 测试你的控制器和模型,用 Cucumber 测试你的前端是正确的方法(大多数时候,没有太多的前端测试)。对于所有这些东西都紧密集成的区域,并且您确实想检查整个堆栈(例如,就像您对登录所做的那样),我认为 Cucumber 是解决这些情况的绝佳工具。

于 2013-08-12T17:28:14.323 回答
1

Cucumber is for BDD- that's it. It's there to document and test the behavior of your application. As you write code to get each Cucumber step to pass, Rspec is used to test your implementation.

于 2013-08-13T19:03:12.437 回答
1

到目前为止,您不需要使用 rspec 的一个原因是您的代码实际上只是“使用”功能(从事物的外观来看由 rails 提供)而不是创建功能。当您使用框架时,这种情况经常发生。

另一个原因是您的黄瓜场景在相当低的抽象级别上工作。其中有很多关于“如何”登录的细节。此级别的测试与单元测试空间有些重叠,因此对 rspec 的需求尚不明显是可以理解的。

如果您以更高的抽象级别编写场景,那么您可能会看到 rspec 发挥作用的地方。

为了登录,我会为快乐的道路写这样的东西

Given I am a user
When I login 
Then I should be logged in

我可能会写一两条悲伤的道路,例如

Given I am a user
When I login with a bad password
Then I should not be logged in

当您在这个抽象级别工作时,您的场景会少得多(运行时间更短),但细节也会少得多。现在您可以通过单元测试来涵盖其中的一些细节。例如,如果我们有一个方法 login_error_message,您正在视图中使用,那么您可能会编写单元测试来表达类似

context 'bad password'
  login_error_message.should == 'bad password'
end

context 'bad login'
  login_error_message.should == 'login not found'
end

虽然您可以编写黄瓜场景来执行此操作,但使用单元测试会便宜得多(特别是在测试的运行时成本方面)。

通常,您希望使用 Cucumber 记录“为什么”您需要能够登录以及您可以登录,但不指定您如何登录。当然,这在很大程度上是一门艺术,高度依赖于您的特定背景,并且非常愿意接受不同的意见。但是,如果您想有效地使用 cucumber,您需要为您编写的每个场景获得足够的效果。

于 2015-01-03T08:18:13.623 回答