简体   繁体   中英

How to read data from one feature file table and pass the value to set json parameter in a *.json file in karate?

Feature File 1:inputData.feature

@ignore
 Feature: Input data table
  Scenario: Input table for testing
    * table testData
      | accountId           |  accountname    | expectedAccount  |
      | 'ADS5678543'   | 'Peter'                 | 'DFCVSAEFRG'      |
      | 'ASDCF45678'   | 'Caroline'            |  'DFCWEAEFRG'    |

File 2: payload.json

{
  "channelData": {
    "data": "CHANNEL_DATA",
    "salesChannel": "WEB",
    "createdBy": "WEBSITE",
    "accountId": "#(accountId)",
    "sessionId": "#(accountname)"
     }
}

File 3: Request.feature

@ignore
Feature:

Scenario:
  # read the payload from json file
  * def Request = read('../payload.json')
  * def headersData = { "Content-Type" : "application/json"}
  Given url BaseUrl + '/account/'+'#(accountId)'
  And request Request
  And headers headersData
  When method post
  Then status 200
  * print response
  * def account = karate.jsonPath(response, "$.account")
  * print 'account is '+account
  Then match account == '#(expectedAccount)'

File4: Account-token.feature

Feature: 
Scenario: identify the reference account
     * def initTestData = read('../inputData.feature')
     * def reqRes = karate.call('../Request.feature', { initTestData : initTestData })
     * def temp =  $reqRes[*].account
     * def resAccount = temp[0]

In the above scenario values are not passed successfully in JSON Request.: 1.) We need to read the accountId & accountname value from inputData.feature, and update the payload.json parameters. 2.) also we to pass the expectedAccount value to Request.feature for assertion.

Try

* def initTestData = call read('../inputData.feature')
* def reqRes = call read('../Request.feature') initTestData.testData

refer data-driven in karate docs

You can make it simpler by using qaf web service support . In that case BDD file may look like below:

Feature: Input data table
  Scenario: Input table for testing
    Given  user requests "my.sample.reqwithbody1" with data "${args[0]}"
    Then response should have status code 200
    And response should have "${expectedAccount}" at "$.account"
    And say "resAccount" is value at jsonpath "$.account"
  Examples:
      | accountId      |  accountname    | expectedAccount  |
      | 'ADS5678543'   | 'Peter'         | 'DFCVSAEFRG'     |
      | 'ASDCF45678'   | 'Caroline'      |  'DFCWEAEFRG'    |

Where my.sample.reqwithbody1 is request call and request call details can be in request call repository that can be reused and may read as below:

<my>
  <sample>
    <reqwithbody1>
       <endPoint>/account/${accountId}</endPoint>
       <headers>
          {'Content-Type': 'application/json'}
      </headers>
      <method>POST</method>
      <body>file:resources/data/payload.json</body>
    </reqwithbody1>

  </sample>
</my>

Your payload json file can be as below(You also can provide below file content directly in body):

{
  "channelData": {
    "data": "CHANNEL_DATA",
    "salesChannel": "WEB",
    "createdBy": "WEBSITE",
    "accountId": "${accountId}",
    "sessionId": "${accountname}"
     }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM