Как сравнить 2 объекта JSON, которые содержат массив, используя инструмент Карате и файлы объектов - PullRequest
0 голосов
/ 10 января 2019

Файлы для сценария

  • Все файлы находятся в одном каталоге.

название-обновление-request.json

{id: 12, name: 'Old Hello', config:[{username: 'qwe', password: 'tyu'},{username: 'abc', password: 'xyz'}]}

название-обновление-response.json

{id: 12, name: 'New Hello', config:[{username: 'qwe', password: 'tyu'},{username: 'abc', password: 'xyz'}]}

название-обновление-ошибок request.json

{id: 00, name: 'Old Hello', config:[{username: 'qwe', password: 'tyu'},{username: 'abc', password: 'xyz'}]}

титульное обновление ошибки-response.json

{Error: 'not found', Message: 'The provided Book is not found.'}

книга-record.feature

Feature: CRUD operation on the book records.

Background:
        * def signIn = call read('classpath:login.feature')
        * def accessToken = signIn.accessToken
        * url baseUrl

 Scenario: Change title of book in the single book-record.
    * json ExpResObject = read('classpath:/book-records/title-update-response.json')
    * json ReqObject = read('classpath:/book-records/title-update-request.json')
    * call read('classpath:/book-records/update.feature') { Token: #(accessToken), ReqObj: #(ReqObject), ResObj: #(ExpResObject), StatusCode: 200 }

  Scenario: Change title of book in the non-existing book-record.
    * json ExpResObject = read('classpath:/book-records/title-update-error-request.json')
    * json ReqObject = read('classpath:/book-records/title-update-error-response.json')
    * call read('classpath:/book-records/update.feature') { Token: #(accessToken), ReqObj: #(ReqObject), ResObj: #(ExpResObject), StatusCode: 400 }

update.feature

Добавление: обновление записи книги.

Scenario: Update single book-record.
    Given path '/book-record'
    And header Authorization = 'Bearer ' + __arg.Token
    And header Content-Type = 'application/json'
    And request __arg.ReqObj
    When method put
    Then status __arg.StatusCode
    And response == __arg.ExpectedResponse

Фактический ответ API для сценария: 1:

{name: 'New Hello', config:[{username: 'abc', password: 'xyz'},{username: 'qwe', password: 'tyu'}]}

Фактический ответ API для сценария: 2:

 {Error: 'not found', Message: 'The provided Book is not found.'}

Вопрос: Как мне проверить ответ в файле update.feature, поскольку проблема заключается в том, что если я внесу изменение s, используя конфигурацию # ^^, которая не будет работать для сценария: 2 и response == _arg. ExpectedResponse не работает для сценария: 1?

1 Ответ

0 голосов
/ 10 января 2019

Это классическая чрезмерная инженерия тестов. Если кто-то сказал вам, что «повторное использование» необходимо для тестов, не слушайте этого человека.

У вас есть два сценария: один счастливый путь и один отрицательный путь. Ниже я приведу, как вы должны написать отрицательный путь, остальное зависит от вас.

Scenario: Change title of book in the non-existing book-record.
Given path '/book-record'
And header Authorization = 'Bearer ' + accessToken
And request {id: 00, name: 'Old Hello', config:[{username: 'qwe', password: 'tyu'},{username: 'abc', password: 'xyz'}]}
When method put
Then status 400
And response == {Error: 'not found', Message: 'The provided Book is not found.'} 

Видишь, как это чисто? Нет необходимости в «экстремальном» повторном использовании в тестах. Если вы по-прежнему настаиваете на том, что вам нужен универсальный файл многократного использования, который будет обрабатывать ВСЕ ваши крайние случаи, вы просто создаете проблемы для себя. Посмотрите, насколько непригодными для чтения стали ваши существующие тесты !!

...