如何使用 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 中的结果如下所示:

Try it in the Groovy web console