根据上一步响应数据更新rest请求数据
Update rest request data based on the previous step response data
我正在学习测试自动化,我尝试使用响应值作为下一个请求输入。问题是响应包含一个可以包含任意数量元素的列表。
代码如下所示:
回复:
{
"idNumber": null,
"response": {
"event": "7b-34g",
"products": [
{
"id": "3464",
"productName": "Hats"
},
{
"id": "3465",
"productName": "Shoes"
}
]
},
"errors": null
}
下一个请求:
{
"customer": "000011223333",
"payment": "visa",
"zzzz": "012345678-9",
"products": [{
"id": ""
}],
"XXXX": {
"YYYY": {
"profile": "Consumer"
}
}
}
products中的元素数量是任意的,即可以是任意数量的元素。我尝试使用 groovy 脚本,但找不到如何操作。我只需要响应中的“产品”列表,而每个元素中我只需要“id”。其余值是静态的。
我感谢任何帮助
//迈克尔
给定产品列表:
products = [[id:123, name:'alpha'], [id:456, name:'beta']]
您可以通过这种方式获得仅包含 ID 的列表:
products.collect{[id: it.id]}
这是第一个请求测试步骤的Script Assertion
。
下面的脚本执行:
- 读取当前回复
- 提取产品详细信息
- 读取下一步(用户需要提供您希望设置新请求的下一步名称)
- 更新
products
详细信息
- 用更新的数据修改下一步请求
import groovy.json.JsonSlurper
import groovy.json.JsonBuilder
//Provide the name of the next request test step name where you need to override the content
def nextStepName = 'step2'
//DO NOT REQUIRE TO MODIFY
//Check the current step response
assert context.response, 'Response is empty'
def json = new JsonSlurper().parseText(context.response)
def products = json.response.products
log.info "Products details from current response: $products"
//Get the next test step request
def nextStepRequest = context.testCase.testSteps[nextStepName].httpRequest
//Check if the next step request content is empty
assert nextStepRequest.requestContent, "Next step, $nextStepName, request is empty"
def slurped = new JsonSlurper().parseText(nextStepRequest.requestContent)
def builder = new JsonBuilder(slurped)
//Change the products of next request
builder.content.products = products.inject([]){l, item -> def map = [:];map['id'] = item.id; l << map; l}
//Update the product details in the request
nextStepRequest.requestContent = builder.toPrettyString()
log.info "Updated request for the step ${nextStepName} is : ${nextStepRequest.requestContent}"
您可以快速在线试用 Demo
以上脚本假定测试步骤的名称在脚本的以下语句中为 step2
。如果您的情况不同,请更改该值。
def nextStepName = 'step2'
我正在学习测试自动化,我尝试使用响应值作为下一个请求输入。问题是响应包含一个可以包含任意数量元素的列表。
代码如下所示:
回复:
{
"idNumber": null,
"response": {
"event": "7b-34g",
"products": [
{
"id": "3464",
"productName": "Hats"
},
{
"id": "3465",
"productName": "Shoes"
}
]
},
"errors": null
}
下一个请求:
{
"customer": "000011223333",
"payment": "visa",
"zzzz": "012345678-9",
"products": [{
"id": ""
}],
"XXXX": {
"YYYY": {
"profile": "Consumer"
}
}
}
products中的元素数量是任意的,即可以是任意数量的元素。我尝试使用 groovy 脚本,但找不到如何操作。我只需要响应中的“产品”列表,而每个元素中我只需要“id”。其余值是静态的。 我感谢任何帮助 //迈克尔
给定产品列表:
products = [[id:123, name:'alpha'], [id:456, name:'beta']]
您可以通过这种方式获得仅包含 ID 的列表:
products.collect{[id: it.id]}
这是第一个请求测试步骤的Script Assertion
。
下面的脚本执行:
- 读取当前回复
- 提取产品详细信息
- 读取下一步(用户需要提供您希望设置新请求的下一步名称)
- 更新
products
详细信息 - 用更新的数据修改下一步请求
import groovy.json.JsonSlurper
import groovy.json.JsonBuilder
//Provide the name of the next request test step name where you need to override the content
def nextStepName = 'step2'
//DO NOT REQUIRE TO MODIFY
//Check the current step response
assert context.response, 'Response is empty'
def json = new JsonSlurper().parseText(context.response)
def products = json.response.products
log.info "Products details from current response: $products"
//Get the next test step request
def nextStepRequest = context.testCase.testSteps[nextStepName].httpRequest
//Check if the next step request content is empty
assert nextStepRequest.requestContent, "Next step, $nextStepName, request is empty"
def slurped = new JsonSlurper().parseText(nextStepRequest.requestContent)
def builder = new JsonBuilder(slurped)
//Change the products of next request
builder.content.products = products.inject([]){l, item -> def map = [:];map['id'] = item.id; l << map; l}
//Update the product details in the request
nextStepRequest.requestContent = builder.toPrettyString()
log.info "Updated request for the step ${nextStepName} is : ${nextStepRequest.requestContent}"
您可以快速在线试用 Demo
以上脚本假定测试步骤的名称在脚本的以下语句中为 step2
。如果您的情况不同,请更改该值。
def nextStepName = 'step2'