Использование встроенных функций каратэ и API - PullRequest
1 голос
/ 17 июня 2019

Хорошо, я собираюсь объяснить, каков мой сценарий и как я реализовал его, используя каратэ.Но я ищу лучший способ сделать то, что делает мои тесты более читабельными, а также я хочу использовать API каратэ, а не слишком много JavaScript.

Сценарий: у меня есть параметр фильтра для конечной точки APIчто я тестирую, и этот параметр фильтра принимает json-объект пар ключ-значение.Итак, я сделал следующее :

  1. Создали filter-template.js, как показано ниже:
function() {
    var filter_params = {
        jobId:null,
        customerIds:[],
        filterValues1:[],
        filterValues2:[], 
    };
    return filter_params;
}
Я прочитал этот шаблон в моем сценарии каратэ и, поскольку это шаблон, во время выполнения я устанавливаю значения в этом шаблоне и запускаю тест.У меня будут разные значения для пар ключ-значение, поэтому каждый тест будет устанавливать свое собственное условие фильтра.Это делается путем написания пользовательской функции js, которая принимает шаблон в качестве аргумента, а также значения условий фильтра (см. Аргумент функции arg ниже), устанавливает переданные условия для определенных ключей и затем возвращает объект json.Код ниже:
Scenario: Set filter scenario
    * def filter_template = call read('filter-template.js')
    * def filter_vals_list = [1001,1002]
    * def filter_condition = { cnd1: 'foo', cnd2: '#(filter_vals_list)' }
    * def setFilter =
    """
      function(arg) {
        var i;
        var filter = arg.template;
        filter.jobId = arg.condition.cnd1;
        for(i=0;i<arg.condition.cnd2.length;i++)
        {
          filter.filterValues1.add(arg.condition.cnd2.get(i));
        }
        return filter;
      }
    """
    * def getFilter = call setFilter { template: '#(filter_template)', 
      condition: '#(filter_condition)' }

Затем я передаю getFilter в качестве параметра моего запроса API.

Я надеюсь понять следующее:

  1. Как мне избежать использования вышеуказанных циклов JS при настройке фильтра?
  2. Используйте встроенные функции каратэ, такие как karate.map(), karate.forEach(), чтобы упростить тесты.
  3. Любой лучший подход, есливозможно решение этого сценария.

Помощь и руководство очень ценятся.

1 Ответ

0 голосов
/ 17 июня 2019

Из того, что я понял, я упростил ваш сценарий ниже:

* def filter_vals_list = [ 1001, 1002 ]
* def job_id = 'foo'
* def filter_template =
"""
{
  jobId: '#(job_id)',
  customerIds: [],
  filterValues1: '#(filter_vals_list)',
  filterValues2: [], 
}
"""

Дайте мне знать, если я что-то пропустил. Пожалуйста, используйте встроенные выражения: https://github.com/intuit/karate#embedded-expressions

Теперь вы можете легко использовать повторно используемый JSON для шаблона, изменив последний шаг на приведенный ниже, и да - встроенные выражения работают даже в повторно используемых файлах JSON!

* def filter_template = read('filter-template.json')

Вы можете получить еще лучшие идеи, попробовав управляемый данными Scenario Outline. Так что надеюсь, это прояснит, как вы не обязательно усложняете вещи с JS! Вам даже не нужно karate.map() и т. Д.

...