代码之家  ›  专栏  ›  技术社区  ›  curiousToKnow

如何使用json文件动态生成数据表?

  •  0
  • curiousToKnow  · 技术社区  · 4 年前

    我是geb、spock和groovy的新手。我正在编写的脚本是,我有一个包含json的groovy类。在我的groovy类中,我计算json中有多少个对象,对于每个对象,我读取键值,然后在spock和Geb中有另一个单元testSpec,在这里我创建了登录测试脚本来登录到应用程序,这非常简单。 我试图实现的场景是,我想基于json文件中的数据在spock测试中生成数据表。 这就是我迄今为止所取得的成就 我的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))
      } 
    }
    }
    

    这是我的斯波克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 test first where子句中首先执行),我的CredList和credentialsList都是空的,当执行模式到达“when”部分时,它会获取正确的用户名和密码。我不确定我在哪里犯了错误。 非常感谢您的帮助。

    0 回复  |  直到 4 年前
        1
  •  1
  •   kriegaex    4 年前

    伦纳德·布莱宁斯 说:

    试着替换 setup 具有 setupSpec

    没错,这是最重要的。你想要在任何特征方法或其迭代开始之前初始化的东西。因此,如果您想初始化静态或共享字段,这是一种方法。

    此外, credsList 包含 Creds 对象,而不仅仅是用户名和密码对。因此,如果希望将这些数据放在单独的数据变量中,则需要在 信条 物体。这是一个简化版的Spock测试,没有任何Grails或Geb,因为你的问题实际上只是一个普通的Spock问题:

    package de.scrum_master.stackoverflow.q71122575
    
    class Creds {
      String username
      String password
    
      @Override
      String toString() {
        "Creds{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}'
      }
    }
    
    package de.scrum_master.stackoverflow.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.stackoverflow.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的结果如下:

    IDEA Spock test result

    Try it in the Groovy web console