使用 SoapUI-Groovy 脚本从 JSON 响应中提取子节点

Extracting child node from JSON Response using SoapUI-Groovy script

我是 soapUI 的新手,仍在探索 groovy 脚本,我需要你的帮助。 这是我的 json 回复:

 {
  "userId": 36,
  "userTypeId": 2,
  "name": "Name_7",
  "surname": "R",
  "friendlyName": "",
  "employeeId": "1000245",
  "role": "engineer",
  "dateOfBirth": "1985-07-09T01:46:23.213",
  "fPicture": "",
  "deleted": false,
  "visitingUserId": null,
  "mineId": 1,
  "crewId": null,
  "versionAutoId": 10002814,
  "externalId": null,
  "email": null,
  "externalLoginId": null,
  "sourceJson": null,
  "description": null,
  "propertyJson": null,
  "userGroups":       [
     {"groupCode": "ALL_USERS"},
     {"groupCode": "MTCC_ADMIN"}
  ],
  "userAccessDto":       {
     "userAccessId": 36,
     "userId": 36,
     "password": "XKjgXD6o/pjHaHd6swvkB8TiQ6L1kEC8307sV94F2GeiFnb4QXUZJhk8rdQJgvdJujSPK/NoM94CMtp8X51ExTEwMDAyNDU=",
     "deleted": false
  }
   },

{
  "userId": 37,
  "userTypeId": 5,
  "name": "Name_9",
  "surname": "R",
  "friendlyName": "",
  "employeeId": "1201",
  "role": "engineer",
  "dateOfBirth": "1985-07-09T01:46:23.213",
  "fPicture": "",
  "deleted": false,
  "visitingUserId": null,
  "mineId": 6,
  "crewId": null,
  "versionAutoId": 10031438,
  "externalId": null,
  "email": null,
  "externalLoginId": null,
  "sourceJson": null,
  "description": null,
  "propertyJson": null,
  "userGroups":       [
     {"groupCode": "ALL_USERS"},
     {"groupCode": "MTCC_ADMIN"}
  ],
  "userAccessDto":       {
     "userAccessId": 37,
     "userId": 37,
     "password": "a05qHK+KrXXmHTFFGQN9JRQWkHnjJX+SCmqBK1PAa2f95I8e20JNt5GaVxL5nGbnTReobSZ/vej3qCAsZK9Q7DEyMDE=",
     "deleted": false
  }

} ]

如何获取 userId = 36 的密码值并将其传递给我的其他测试用例?我进行了很多搜索,但找不到有关现有问题的正确指南。我应该提一下,我的回复会不时发生变化,所以我不能将其假定为字符串。 感谢您的所有回复。

我建议你使用JsonSlurper

对于这样的 Json 文件:Example.json

{
  "userAccessDto": {
    "userAccessId": 37,
    "userId": 37,
    "password": "a05qHK+KrXXmHTFFGQN9JRQWkHnjJX+SCmqBK1PAa2f95I8e20JNt5GaVxL5nGbnTReobSZ/vej3qCAsZK9Q7DEyMDE=",
    "deleted": "false"
  }
}

Groovy代码:

import groovy.json.JsonSlurper;

def root =new JsonSlurper().parse(new File ('/tmp/example.json'))

println root.userAccessDto.password
import net.sf.json.groovy.*

def i, newUserId, hashPass, empId;
//get test case from other project or from the same one
project = 
testRunner.getTestCase().getTestSuite().getProject().
getWorkspace().getProjectByName("API_Services_v3.0.321")
testSuite = project.getTestSuiteByName("Users");
testCase = testSuite.getTestCaseByName("Users-Retrieve a list of users");

// 运行 测试用例

runner = testCase.run(new 
com.eviware.soapui.support.types.StringToObjectMap(), false);
Thread.sleep(3000)

//从testStep获取JSONresponse并解析

def responseContent = testCase.getTestStepByName("ApiV1UsersGet -Get 
all").getPropertyValue("response")
slurperResponse = new JsonSlurper().parseText(responseContent)

//从 TestSuite 属性 中获取 userId 以与

进行比较
newUserId = 
testRunner.testCase.testSuite.project.getTestSuiteByName("Users").
getPropertyValue("idOfUser")

//遍历 JSONresponse

for(i=0;i<slurperResponse.resource.size();i++)
{
            if(slurperResponse[i].userId == newUserId.toInteger() )
            {
                            log.info("Hash Pass is" +slurperResponse[i].userAccessDto.password);
                            log.info("Employee Id is" +slurperResponse[i].employeeId);
                            hashPass = slurperResponse[i].userAccessDto.password
                            empId = slurperResponse[i].employeeId

                            break;
            }
}

//将 hashPassword 和 empId 分配给 testSuite 属性以进行下一步测试

testRunner.testCase.testSuite.project.getTestSuiteByName("Users")
.setPropertyValue("Hash_Pass",hashPass.toString())
 testRunner.testCase.testSuite.project.getTestSuiteByName("Users").
setPropertyValue("EmployeeId2",empId.toString())

我看到您找到了一种方法,尽管我称之为艰难的方法。您可以在 属性 传输中简单地使用 JSONPath 选项。 像这样的查询有效:

$.[?(@.userId==36)].password

另外,您可以将userId转为动态校验的参数。