在黄瓜的场景轮廓之前运行登录步骤

时间:2010-09-01 03:23:10

标签: cucumber

我正在使用带有webrat / mechanize的黄瓜来测试PHP站点,我试图通过避免运行不必要的步骤来提高测试运行的速度。

我想使用场景大纲来检查大量页面是否可访问/受保护,具体取决于登录的用户:

Scenario Outline: Check page access is secure
  Given I am logged in as "<user>"
    And I am on <page>
  Then I should see "<message>"
Examples:
  |user  |page      |message                |
  |admin |home page |Welcome to my site     |
  |admin |admin page|Site administration    |
  |editor|home page |Welcome to my site     |
  |editor|admin page|Access denied          |
  |guest |home page |Please login           |
  |guest |admin page|Access denied          |
  ...

这很有效,但鉴于我有10个角色和数百个要检查的页面,每次大纲运行时运行登录步骤都会产生很多开销。

我想知道是否有办法为每个角色运行一次登录步骤,然后轮流访问每个页面而无需每次都登录。即运行“登录,访问1,访问2,访问3”而不是“登录,访问1,登录,访问2,登录,访问3”。

我尝试过使用hooks和Background,但似乎无法找到一种有效的方法。这可能吗?

2 个答案:

答案 0 :(得分:0)

您可以实施Given步骤,仅针对每个角色登录一次:

# lazily log in each role as needed, and keep the login in a hash table
$logins = Hash.new do |_logins, role|
  _logins[role] = do_expensive_login(role)
end
Given /^I am logged in as "([^"]+)"$/ |role|
  @login = $logins[role]
end

当然,如果未来的步骤可以改变登录的状态,或者改变世界以使登录不再有效,这可能会让你感到困惑,所以请小心谨慎。

答案 1 :(得分:0)

不要在功能中放置有关可访问/受保护的内容的所有信息,而是考虑将它们放在步骤defs中(更好的方法是使用应用程序中的定义,但如果您的应用程序不是这样,那就不容易了正在进行中)

如果您可以使用与

一样抽象的功能
Given I am an admin
Then I should be able to access admin pages

然后,你可以在步骤defs中更有效地完成所有工作

以下只是一个代码草图,可以让您了解自己可以做些什么......

# step def
module AccessHelper
  AdminPages = {
    {page: ..., msg: ...
    ...
  }
  def login_as ... ; end
  def correct_message? msg ...; end
  def check_admin_access_for user
    @errors = []
    login_as @I
    AdminPages.each do |page|
      visit page[:path]
      errors << page unless correct_message?
    end
  end
end
World(AccessHelper)

Then "I should be able to access admin pages" do
  check_admin_access_for @I
  @errors.should be_empty
end

您当然可以使用ruby的全部功能扩展它,以满足您的特殊需求。根本的想法是,你总是可以采取几个黄瓜动作,并将它们抽象为一个黄瓜动作。

希望这很有用