我正在使用Cucumber和Selenium为我的应用程序编写一些端到端测试。正如Cucumber网站上所建议的那样,我使每种情况都完全独立。但是,我的应用程序具有基于会话的身份验证,因此,每次运行新方案时,都需要登录过程才能首先访问该站点。现在,我的方法是将登录方案作为所有其他方案的背景方案,例如:
Background: User is Logged In
Given I am on the login screen
When I enter my login details
And I click submit
Then I should be logged in
但是,这感觉像是很多重复的“代码”。此外,让每个方案独立运行需要创建一个新的WebDriver实例,并为每个方案运行一个浏览器,这感觉效率低下吗?
首先有人可以建议我如何避免在每个其他场景中重复后台场景(如果可能的话),其次,如果每个场景都有一个单独的WebDriver实例是正确的方法?
答案 0 :(得分:0)
首先,每个方案都必须登录并创建一个新会话。这就是您要进行端到端测试的价格。对于标准的登录过程,此运行时的开销应该相对较小,因为大多数登录屏幕都很简单,呈现时间较短,并且数据库访问很少。通过尝试在场景之间共享会话来在此处托盘化并保存运行时确实是一个非常糟糕的主意。
您可以按照Daniel的回答开始整理,但不建议嵌套步骤,我建议将代码提取到辅助方法中,然后调用它。
要以强大的能力优雅地完成此任务,即以角色和额外的属性与其他用户打交道,您需要做更多的事情。您可以在此处(https://github.com/diabolo/cuke_up)上查看其详细示例。
要有效地使用它,请遵循提交历史记录,并主要关注features文件夹。
这有一些框架代码,可让您注册/创建用户,然后在许多不同的配置中使用它们。有一些底层代码有些复杂,它使您可以创建知道自己密码的用户,以及添加其他属性(例如角色)。
最终结果是您可以编写类似的步骤定义
Given I am registered
Given I am an admin
Given I am logged in
Given I am logged in as an admin
实现为
Given 'I am registered' do
@i = create_user
end
Given 'I am an admin' do
@i = create_user role: 'admin'
end
Given 'I am logged in' do
@i = create_user
login as: @i
end
Given 'I am logged in as an admin' do
@i = create_user role: 'admin'
login as: @i
end
注意:变量@i用于将用户从一个步骤传递到下一个步骤
您不必担心重复,因为所有步骤都调用相同的帮助方法。您可以在更广泛的上下文中使用此处显示的模式来简化功能/
答案 1 :(得分:-1)
该示例在Ruby中。您可以将login_steps.rb
文件中用于登录的步骤分组。
在.feature
文件中,您需要编写类似“ 鉴于用户已登录”的步骤。如果需要,您也可以在此步骤中传递登录数据。然后在login_steps.rb
文件中创建:
Given(/^the user is logged in$/) do
step('I am on the login screen')
step('I enter my login details')
step('I click submit')
step('I should be logged in')
end
我确定您可以找到其他任何语言的等效语言。现在,您可以像这样编写背景:
Background: Given the user is logged in
,它将在该特定.feature
文件的每种情况下使用
据我所知,对于Webdriver,您在测试开始时创建一个会话,并在测试结束时退出。
希望有帮助!