我正在使用带有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,但似乎无法找到一种有效的方法。这可能吗?
答案 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的全部功能扩展它,以满足您的特殊需求。根本的想法是,你总是可以采取几个黄瓜动作,并将它们抽象为一个黄瓜动作。
希望这很有用