如何使用 json 文件动态生成数据 table?
How to generate data table dynamically using json file?
我是 geb、spock 和 groovy 的新手。我正在处理的脚本是我有一个 groovy class 包含我的 json。在我的 groovy class 中,我计算了 json 中有多少个对象,对于每个对象,我读取了键值,然后我在 spock 和 Geb 中创建了另一个单元 testSpec用于登录应用程序的登录测试脚本非常简单。
我想要实现的场景是我想根据 json 文件中存在的数据在 spock 测试中生成数据 table。
这是我到目前为止所取得的成就
我的 InputDataJson.groovy 文件
package resources
import geb.spock.GebSpec
import groovy.json.JsonSlurper
import spock.lang.Shared
class InputDataJson extends GebSpec{
@Shared
def inputJSON,
idValue, passwordValue, jsonSize
@Shared
def credsList = []
def setup() {
inputJSON = '''{
"validLogin":{
"username" : "abc",
"password" : "correcttest"
},
"invalidLogin":{
"username" : "xyz",
"password" : "badtest"
}
}'''
def JsonSlurper slurper = new JsonSlurper()
def TreeMap parsedJson = slurper.parseText(inputJSON)
jsonSize = parsedJson.size()
Set keySet = parsedJson.keySet()
int keySetCount = keySet.size()
for(String key : keySet){
credsList.add(new Creds(username: parsedJson[key].username,password:
parsedJson[key].password))
}
}
}
这是我的样本 spock geb 测试
package com.test.demo
import grails.test.mixin.TestMixin
import grails.test.mixin.support.GrailsUnitTestMixin
import pages.LoginPage
import resources.InputDataJson
/**
* See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions
*/
@TestMixin(GrailsUnitTestMixin)
class SampleTest1Spec extends InputDataJson {
def credentialsList = []
def setup() {
credentialsList = credsList
}
def cleanup() {
}
void "test something"() {
}
def "This LoginSpec test"() {
given:
to LoginPage
when:'I am entering username and password'
setUsername(username)
setPassword(password)
login()
then: "I am being redirected to the homepage"
println("Hello")
where:
[username,password]<< getCreds()
//credsList[0]['username'] | credsList[0]['password']
}
def getCreds(){
println(" CREDS inside " + credsList)
println(" credentialsList : " + credentialsList)
}
}
问题是当我 运行 在调试模式下进行此测试时(我首先在 spock 测试中了解首先执行 where 子句)我的 credsList 和 credentialsList 都变为 null 并且当执行模式达到“when”时部分获取正确的用户名和密码。我不确定我在哪里犯了错误。
非常感谢任何帮助。
Leonard Brünings 说:
try replacing setup
with setupSpec
没错,这是最重要的。您想要在任何特征方法或其迭代开始之前初始化的东西。因此,如果您想初始化静态或共享字段,这是可行的方法。
此外,credsList
包含 Creds
个对象,而不仅仅是用户名和密码对。因此,如果您想要将它们放在单独的数据变量中,则需要在 Creds
对象中取消引用它们。这是您的 Spock 测试的简化版本,没有任何 Grails 或 Geb,因为您的问题实际上只是一个普通的 Spock 问题:
package de.scrum_master.Whosebug.q71122575
class Creds {
String username
String password
@Override
String toString() {
"Creds{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}'
}
}
package de.scrum_master.Whosebug.q71122575
import groovy.json.JsonSlurper
import spock.lang.Shared
import spock.lang.Specification
class InputDataJson extends Specification {
@Shared
List<Creds> credsList = []
def setupSpec() {
def inputJSON = '''{
"validLogin" : {
"username" : "abc",
"password" : "correcttest"
},
"invalidLogin" : {
"username" : "xyz",
"password" : "badtest"
}
}'''
credsList = new JsonSlurper().parseText(inputJSON)
.values()
.collect { login -> new Creds(username: login.username, password: login.password) }
}
}
package de.scrum_master.Whosebug.q71122575
import spock.lang.Unroll
class CredsTest extends InputDataJson {
@Unroll("verify credentials for user #username")
def "verify parsed credentials"() {
given:
println "$username, $password"
expect:
username.length() >= 3
password.length() >= 6
where:
cred << credsList
username = cred.username
password = cred.password
}
}
IntelliJ IDEA 中的结果如下所示:
我是 geb、spock 和 groovy 的新手。我正在处理的脚本是我有一个 groovy class 包含我的 json。在我的 groovy class 中,我计算了 json 中有多少个对象,对于每个对象,我读取了键值,然后我在 spock 和 Geb 中创建了另一个单元 testSpec用于登录应用程序的登录测试脚本非常简单。 我想要实现的场景是我想根据 json 文件中存在的数据在 spock 测试中生成数据 table。 这是我到目前为止所取得的成就 我的 InputDataJson.groovy 文件
package resources
import geb.spock.GebSpec
import groovy.json.JsonSlurper
import spock.lang.Shared
class InputDataJson extends GebSpec{
@Shared
def inputJSON,
idValue, passwordValue, jsonSize
@Shared
def credsList = []
def setup() {
inputJSON = '''{
"validLogin":{
"username" : "abc",
"password" : "correcttest"
},
"invalidLogin":{
"username" : "xyz",
"password" : "badtest"
}
}'''
def JsonSlurper slurper = new JsonSlurper()
def TreeMap parsedJson = slurper.parseText(inputJSON)
jsonSize = parsedJson.size()
Set keySet = parsedJson.keySet()
int keySetCount = keySet.size()
for(String key : keySet){
credsList.add(new Creds(username: parsedJson[key].username,password:
parsedJson[key].password))
}
}
}
这是我的样本 spock geb 测试
package com.test.demo
import grails.test.mixin.TestMixin
import grails.test.mixin.support.GrailsUnitTestMixin
import pages.LoginPage
import resources.InputDataJson
/**
* See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions
*/
@TestMixin(GrailsUnitTestMixin)
class SampleTest1Spec extends InputDataJson {
def credentialsList = []
def setup() {
credentialsList = credsList
}
def cleanup() {
}
void "test something"() {
}
def "This LoginSpec test"() {
given:
to LoginPage
when:'I am entering username and password'
setUsername(username)
setPassword(password)
login()
then: "I am being redirected to the homepage"
println("Hello")
where:
[username,password]<< getCreds()
//credsList[0]['username'] | credsList[0]['password']
}
def getCreds(){
println(" CREDS inside " + credsList)
println(" credentialsList : " + credentialsList)
}
}
问题是当我 运行 在调试模式下进行此测试时(我首先在 spock 测试中了解首先执行 where 子句)我的 credsList 和 credentialsList 都变为 null 并且当执行模式达到“when”时部分获取正确的用户名和密码。我不确定我在哪里犯了错误。 非常感谢任何帮助。
Leonard Brünings 说:
try replacing
setup
withsetupSpec
没错,这是最重要的。您想要在任何特征方法或其迭代开始之前初始化的东西。因此,如果您想初始化静态或共享字段,这是可行的方法。
此外,credsList
包含 Creds
个对象,而不仅仅是用户名和密码对。因此,如果您想要将它们放在单独的数据变量中,则需要在 Creds
对象中取消引用它们。这是您的 Spock 测试的简化版本,没有任何 Grails 或 Geb,因为您的问题实际上只是一个普通的 Spock 问题:
package de.scrum_master.Whosebug.q71122575
class Creds {
String username
String password
@Override
String toString() {
"Creds{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}'
}
}
package de.scrum_master.Whosebug.q71122575
import groovy.json.JsonSlurper
import spock.lang.Shared
import spock.lang.Specification
class InputDataJson extends Specification {
@Shared
List<Creds> credsList = []
def setupSpec() {
def inputJSON = '''{
"validLogin" : {
"username" : "abc",
"password" : "correcttest"
},
"invalidLogin" : {
"username" : "xyz",
"password" : "badtest"
}
}'''
credsList = new JsonSlurper().parseText(inputJSON)
.values()
.collect { login -> new Creds(username: login.username, password: login.password) }
}
}
package de.scrum_master.Whosebug.q71122575
import spock.lang.Unroll
class CredsTest extends InputDataJson {
@Unroll("verify credentials for user #username")
def "verify parsed credentials"() {
given:
println "$username, $password"
expect:
username.length() >= 3
password.length() >= 6
where:
cred << credsList
username = cred.username
password = cred.password
}
}
IntelliJ IDEA 中的结果如下所示: