对于REST端点,我有以下JSON响应:
{
"response": {
"status": 200,
"startRow": 0,
"endRow": 1,
"totalRows": 1,
"next": "",
"data": {
"id": "workflow-1",
"name": "SampleWorkflow",
"tasks": [
{
"id": "task-0",
"name": "AWX",
"triggered_by": ["task-5"]
},
{
"id": "task-1",
"name": "BrainStorming",
"triggered_by": ["task-2", "task-5"]
},
{
"id": "task-2",
"name": "OnHold",
"triggered_by": ["task-0", "task-4", "task-7", "task-8", "task9"]
},
{
"id": "task-3",
"name": "InvestigateSuggestions",
"triggered_by": ["task-6"]
},
{
"id": "task-4",
"name": "Mistral",
"triggered_by": ["task-3"]
},
{
"id": "task-5",
"name": "Ansible",
"triggered_by": ["task-3"]
},
{
"id": "task-6",
"name": "Integration",
"triggered_by": []
},
{
"id": "task-7",
"name": "Tower",
"triggered_by": ["task-5"]
},
{
"id": "task-8",
"name": "Camunda",
"triggered_by": ["task-3"]
},
{
"id": "task-9",
"name": "HungOnMistral",
"triggered_by": ["task-0", "task-7"]
},
{
"id": "task-10",
"name": "MistralIsChosen",
"triggered_by": ["task-1"]
}
]
}
}
}对于提取,我使用的是一个groovy gpath表达式,如下所示:
given()
.when()
.get("http://localhost:8080/workflow-1")
.then()
.extract()
.path("response.data.tasks.findAll{ it.triggered_by.contains('task-3') }.name")这给了我正确的[Mistral, Ansible, Camunda]
我试图实现的是找到由InvestigateSuggestions任务触发的任务名称。但我不确定我必须传递给contains()的contains()是task-3;我只知道它的名称,即InvestigateSuggestions。所以我试着做:
given()
.when()
.get("http://localhost:8080/workflow-1")
.then()
.extract()
.path("response.data.tasks.findAll{
it.triggered_by.contains(response.data.tasks.find{
it.name.equals('InvestigateSuggestions')}.id) }.name")它不能工作,并抱怨参数"response“被使用但没有定义。
如何从findAll闭包内部遍历外部集合以找到要传递到contains()的正确的id?
发布于 2018-09-02 15:20:14
你可以利用一个肮脏的秘密,restAssuredJsonRootObject。这是没有文档记录的(尽管据我所知,在7 year+的放心寿命内,它从未改变过)。
这样你就可以写:
given()
.when()
.get("http://localhost:8080/workflow-1")
.then()
.extract()
.path("response.data.tasks.findAll{
it.triggered_by.contains(restAssuredJsonRootObject.response.data.tasks.find{
it.name.equals('InvestigateSuggestions')}.id) }.name")如果您不想使用这个“黑客”,那么您需要做一些类似于迈克尔·复活节在他的回答中提议的事情。
当涉及到根据响应体生成匹配时,故事会更好。见docs 这里。
发布于 2018-09-01 18:02:39
我不确定这是否惯用,但一种方法是先找到id,然后将其替换为另一个查询:
@Test
void testCase1() {
def json = given()
.when()
.get("http://localhost:5151/egg_minimal/stacko.json")
// e.g. id = 'task-3' for name 'InvestigateSuggestions'
def id = json
.then()
.extract()
.path("response.data.tasks.find { it.name == 'InvestigateSuggestions' }.id")
// e.g. tasks have name 'task-3'
def tasks = json
.then()
.extract()
.path("response.data.tasks.findAll{ it.triggered_by.contains('${id}') }.name")
assertEquals(['Mistral', 'Ansible', 'Camunda'], tasks)
}https://stackoverflow.com/questions/52122487
复制相似问题