根据上一步响应数据更新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'