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中,用户介绍其IdphoneNumber,然后将其重定向到第二页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。谢谢你的回复。