Skip to content

Sort records consumed from Kafka Topic and assert(also sort API response)

nirmalchandra edited this page Apr 17, 2023 · 3 revisions

Note:

This sorting mechanism works for API responses as well as records consumed from a Kafka topic.

Without sorting sometimes you can't be sure in which order the HTTP server or Kafka topic will return you an array of results (records).

Sorting step support next fields:

  • "key" - the key which will be used for sorting an array
  • "order" - order, by which an array will be sorted (for now we support only "natural" and "reverse" orders)
  • "path" - path, where the array that needs to be sorted is located in response (e.x. "$.body.persons")

See examples below for Kafka topics.

Without Sorting (Unstable so-called 'flaky' test)

Example scenario:


{
  "scenarioName": "Scenario without sorting",
  "steps": [
    {
      "name": "produce some records",
      "url": "kafka-topic:demo-sorting",
      "operation": "PRODUCE",
      "request": {
        "records": [
          {
            "key": "${RANDOM.NUMBER}",
            "value": "Record 1"
          },
          {
            "key": "${RANDOM.NUMBER}",
            "value": "Record 2"
          }
        ]
      },
      "assertions": {
        "status": "Ok"
      }
    },
    {
      "name": "consume records and validate",
      "url": "kafka-topic:demo-sorting",
      "operation": "CONSUME",
      "request": {
        "consumerLocalConfigs": {
          "showRecordsConsumed": true,
          "commitSync": true,
          "maxNoOfRetryPollsOrTimeouts": 3
        }
      },
      "assertions": {
           "size": 2,
           "records": [
               {
                   "value": "Record 1"
               },
               {
                   "value": "Record 2"
               }
           ]
       }
    }
  ]
}


Sort Order - Natural

Example scenario:

{
  "scenarioName": "Scenario without sorting",
  "steps": [
    {
      "name": "produce some records",
      "url": "kafka-topic:demo-sorting",
      "operation": "PRODUCE",
      "request": {
        "records": [
          {
            "key": "${RANDOM.NUMBER}",
            "value": "Record 1"
          },
          {
            "key": "${RANDOM.NUMBER}",
            "value": "Record 2"
          }
        ]
      },
      "assertions": {
        "status": "Ok"
      }
    },
    {
      "name": "consume records and validate",
      "url": "kafka-topic:demo-sorting",
      "operation": "CONSUME",
      "request": {
        "consumerLocalConfigs": {
          "showRecordsConsumed": true,
          "commitSync": true,
          "maxNoOfRetryPollsOrTimeouts": 3
        }
      },
      "sort": {
        "key": "value",
        "order": "natural",
        "path": "$.records"
      },
      "assertions": {
           "size": 2,
           "records": [
               {
                   "value": "Record 1"
               },
               {
                   "value": "Record 2"
               }
           ]
       }
    }
  ]
}


Sort Order - Reverse

Example scenario:

{
  "scenarioName": "Scenario without sorting",
  "steps": [
    {
      "name": "produce some records",
      "url": "kafka-topic:demo-sorting",
      "operation": "PRODUCE",
      "request": {
        "records": [
          {
            "key": "${RANDOM.NUMBER}",
            "value": "Record 1"
          },
          {
            "key": "${RANDOM.NUMBER}",
            "value": "Record 2"
          }
        ]
      },
      "assertions": {
        "status": "Ok"
      }
    },
    {
      "name": "consume records and validate",
      "url": "kafka-topic:demo-sorting",
      "operation": "CONSUME",
      "request": {
        "consumerLocalConfigs": {
          "showRecordsConsumed": true,
          "commitSync": true,
          "maxNoOfRetryPollsOrTimeouts": 3
        }
      },
      "sort": {
        "key": "value",
        "order": "reverse",
        "path": "$.records"
      },
      "assertions": {
           "size": 2,
           "records": [
               {
                   "value": "Record 2"
               },
               {
                   "value": "Record 1"
               }
           ]
       }
    }
  ]
}


Version to Use

1.3.33 (Click to see details of whats included)

Blogs

Clone this wiki locally