使用 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转为动态校验的参数。
我是 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转为动态校验的参数。