使用Cucumber进行测试的“奇怪”(可能是“极端”或“疯狂”)方法

时间:2012-03-21 14:39:47

标签: ruby-on-rails ruby ruby-on-rails-3 testing cucumber

我正在使用Ruby on Rails 3.2.2,cucumber-rails-1.3.0,rspec-rails-2.8.1,capybara-1.1.2和factory_girl-2.6.3。我有一个方案测试用户注册如下:

Scenario: I register an user
  When I fill in "Name" with "Foo"
  And I fill in "Email" with "foo_bar@email.com"
  And I fill in "Password" with "test_password"
  And I click button "Register"
  Then I should be redirected to the homepage

我正在尝试声明一个新功能(在一个单独的文件中)在哪里实现一个方案,通过使用一个令牌,应该测试注册用户确认过程是否正确完成( note :实际上,这个过程涉及电子邮件传递,但我想要测试是否发送了该电子邮件;只是忽略它来解决这个问题)。由于我只想测试确认过程,因此我想实现一个新的功能/场景,在其中陈述Given I am a registered user之类的内容,以便运行Scenario: I register an user

Scenario: I confirm an user
  Given I am a registered user # Here I would like to run the 'Scenario: I register an user'
  When I go to the confirmation page
  And I enter the confirmation token
  Then ...

简而言之,我想在另一个场景中调用整个场景

即使我可以使用FactoryGirl gem来“创建” - “注册”一个用户,我更愿意继续上面的方法,因为我测试(“实际上”说,那些“代表”“看不见的人”, ,由Selenium gem管理,打开我的浏览器并执行操作)尽可能像“真实的人”一样表现,所以那些测试步骤隐含地遵循应该在现实中为了签名而进行的所有“真实”步骤一个新用户。通过遵循这种方法,我可以测试应用程序“内部”是否正常工作。

这是一种正确的方法吗?如果不是,我该怎么做?

2 个答案:

答案 0 :(得分:7)

精心设计的测试的原则之一是您以各种形式运用特定功能,但除此之外,它假定它在其他功能的其他测试的上下文中工作。也就是说,一旦你测试过用户可以注册,你就不应该重新测试同样的东西,除非你以不同的方式测试它。

措辞“鉴于我是注册用户”这意味着用户已经成功注册。此时您不应该进行测试注册,因为这超出了您尝试执行的测试范围。

每个测试都应该有一个任务,它应该坚持下去。如果你不限制自己,那么你的测试就会陷入一种无用的相互依赖的混乱状态,在这种情况下,改变一件事就需要改变所有其他的东西。

答案 1 :(得分:0)

在步骤中运行场景的语法是:

Given /^I authenticate successfully$/ do
  Given 'I am on the login page'
  And 'I fill in "Email" with "eddie@hotmail.com"'
  And 'I fill in "Password" with "secret"'
  When 'I press "Login"'
  Then 'I should see "Welcome"'
end

最后的想法:一般来说,让你的功能文件没有任何"填写" ---只是让它描述一下行动,并让你的步骤做坏事。