Cookies 使用where子句在GEB Cookie中进行Spock测试
我已经配置了一些Cookies 使用where子句在GEB Cookie中进行Spock测试,cookies,where-clause,spock,geb,Cookies,Where Clause,Spock,Geb,我已经配置了一些geb测试,根据我的web应用中的登录尝试来检查不同的消息。因为消息和输入字段将在第三次登录尝试时更改 登录是基于发送到特定电话号码的密码的两步登录,因此在第一页LoginPage中,用户介绍其Id和phoneNumber,然后将其重定向到第二页ValidationLoginPage,其中用户介绍收到的密码 我想检查一下,在第二页中,用户只能输入三个错误的密码,在第四次尝试时,输入密码的输入将消失,并显示一条不同的消息,指示不再显示任何尝试 为了验证这一点,我准备了一个测试,在给
geb
测试,根据我的web应用中的登录尝试来检查不同的消息。因为消息和输入字段将在第三次登录尝试时更改
登录是基于发送到特定电话号码的密码的两步登录,因此在第一页LoginPage中,用户介绍其Id和phoneNumber,然后将其重定向到第二页ValidationLoginPage,其中用户介绍收到的密码
我想检查一下,在第二页中,用户只能输入三个错误的密码,在第四次尝试时,输入密码的输入将消失,并显示一条不同的消息,指示不再显示任何尝试
为了验证这一点,我准备了一个测试,在给定的:
子句中引入了Id和电话号码,并使用where:
子句引入了三次错误密码。由于where:
重复所有测试,我尝试使用注入变量控制零件重复,如where:
中所述,因此我得到如下结果:
def“测试最大登录尝试次数”(){
鉴于:
如果(LoginAttent==1)
登录页面
loginModule.startLogin(cfg.user.id,cfg.user.phone)
}
什么时候:
在LoginValidationPage
assert$('div.box\u id\u header h3')。text()=='Verify your code'
assert$('#code').css('display').contains('block'))
loginModule.verifyPassword(“错误密码”)
然后:
在LoginValidationPage
println“尝试${loginattest}”
如果(LoginAttent==4){
//最后一次尝试
assert$('#code').css('display')=='none'
assert$('#divCodeErrorMsg').text()包含('不再尝试')
}否则{
assert$('#code').css('display').contains('block'))
assert$('#divCodeErrorMsg').text()包含('密码错误。请重试')
}
哪里:
登录尝试最后在设置
步骤I中禁用自动清除cookie
,以获得所需的行为
def setup() {
browser.getConfig().setAutoClearCookies(false)
}
然而,令人惊讶的是,如果我使用setupSpec()
方法,它似乎不起作用,因为只有第一个where:
迭代具有autoClearCookies=false
,其余的具有autoClearCookies=true
,问题是您可能会误解并因此滥用Spock的where:
块。它被设计用于参数化特征方法,该方法的每次运行都包含一个独立的特征。如果您@Unroll
您的功能,即使对于每一组其中:
参数,也会生成一个新方法。因为特性应该相互独立,理论上可以以任何给定的顺序甚至并行运行,所以测试夹具需要重置才能运行它们。这就是cookie的情况,因为您滥用了where:
功能来实现一个简单的循环
代码中还有其他一些小问题,例如在when:
块中签入at时未断言的。即使at
产生false
,如果不使用assert
,也没有任何后果。您只能在then:
或expect:
块中跳过assert
,但不能在given:
或when:
中跳过,也不能在闭包或助手方法中跳过,我将在示例代码中使用这些方法
这个怎么样
package de.scrum\u master.stackoverflow.foo
导入geb.spock.GebReportingSpec
类LoginTest扩展了GebReportingSpec{
def loginModule=new loginModule()
def cfg=新配置()
def“测试最大登录尝试次数”(){
给定:“我们在登录页面”
browser.config.autoClearCookies=false
登录页面
当:“使用错误凭据登录4x”
(1..4)每个{
使用错误凭据登录(it,it<4)
}
然后:“我们收到‘不再尝试’错误消息”
$('#codi').css('display')=='none'
$(“#divCodiValidacioError”).text()包含('不再尝试')
}
def LoginWithErrorCredentials(int-LoginAttest,布尔值checkforErrorPasswordMessage){
println“登录尝试${LoginAttest}”
loginModule.startLogin(cfg.user.id、cfg.user.phone)
断言在(LoginValidationPage)
assert$('div.box\u id\u header h3')。text()=='Verify your code'
assert$('#code').css('display').contains('block'))
loginModule.verifyPassword(“错误密码”)
断言在(LoginValidationPage)
如果(检查错误的密码消息){
assert$('#codi').css('display').contains('block'))
assert$('#divCodiErrorMsg').text()包含('密码错误。请重试')
}
}
}
我还建议将内容断言从loginWithErrorCredentials
移动到LoginValidationPage
的帮助器方法中,并在测试中调用它们。我同意此问题中的代码似乎滥用了其中:
块,这些块应用于参数化和不循环。请注意,如果只启用了,则不必在检查时断言。捕捉得好,@erdi!OTOH你是Geb神,我只是一个临时用户。所以我不打算在这里争论哎哟你完全正确,我试图使用where:
保持测试清晰。。。现在我意识到,其中:
将运行参数化测试。这很像junit中的@RunWith(Parameterized.class)
do。谢谢你的回复。