代码之家  ›  专栏  ›  技术社区  ›  riyasvaliya

在REST-assured中使用groovy闭包的JSON嵌套迭代

  •  1
  • riyasvaliya  · 技术社区  · 6 年前

    {
      "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"]
            }
          ]
        }
      }
    }
    

    我使用rest-assured和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() task-3 我只知道它的名字。 调查建议 . 所以我试着做:

    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闭包内部迭代外部集合以找到正确的 id 包含() ??

    2 回复  |  直到 6 年前
        1
  •  3
  •   Johan    6 年前

    你可以利用一个肮脏的秘密 restAssuredJsonRootObject . 这是没有文件记录的(并且可能会发生变化,尽管据我所知,在7年以上的“放心”寿命中,它从未发生过变化)。

    这将允许您编写:

    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")
    

    Michael Easter 在他的 answer

    当涉及到基于响应体生成匹配器时,情况会更好。见文件 here

        2
  •  1
  •   Michael Easter    6 年前

    我不确定这是否是惯用的,但一种方法是找到 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)
    }
    
    推荐文章