Каратэ - пользовательское утверждение в ожидаемой схеме JSON - PullRequest
3 голосов
/ 14 июля 2020

Я хочу выполнить настраиваемые утверждения для полей в JSON, загруженных из файла.

Я понимаю, что у нас есть нечеткое сопоставление, но я хотел бы выполнить что-то более настраиваемое, например, иметь функцию, которая анализирует дату как LocalDateTime:

public class DateUtil {
public static boolean matchesMyDateFormat(String dateStr) {
    try {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        LocalDateTime.parse(dateStr, formatter);
    } catch (DateTimeParseException e) {
        return false;
    }
    return true;
}

}

Это будет вызываться следующим образом:

* def matchesMyDateFormat =
"""
function fn(dateX){
  return Java.type('com.karate.DateUtil').matchesMyDateFormat(dateX);
}
"""

* def expected = read('expected.json')
* def actual = read('actual.json')
* match expected == actual

Где и ожидалось. json выглядит так:

{
   "date1" : "#? matchesMyDateFormat(_)"
}

NB, это специально для JSON, загруженного из файла, а не JSON, который указан в самом файле функции (например, как для isValidTime () здесь: https://github.com/intuit/karate/blob/master/karate-junit4/src/test/java/com/intuit/karate/junit4/demos/schema-like.feature).

Несколько причин для желания сделать это таким образом:

  • Некоторые полезные данные, которые мне нужно утверждать, имеют много полей даты, возвращающихся в разных форматах. Утверждение, подобное приведенному выше, отлично согласуется с ie отличным способом проверки схемы Karate. Однако выполнение этого в файлах функций потребует большого количества кода, то есть строки кода для каждой даты (я понимаю, что соответствует каждому , может быть использовано - но даже это будет сложным, в зависимости от вложенности полей.)
  • Я мог бы добавить эту функцию в свой общий файл функций utils, чтобы ее можно было повторно использовать во всей схеме ожидаемого ответа проекта.
  • Помимо этого I ' я хотел бы заняться другими делами, например, проверить, что одна дата наступает раньше другой (но я бы хотел сделать это, используя различные типы в Java, например, принимая во внимание часовой пояс).
  • Я бы также ищите метод сопоставления формата для другого параметра, который позволяет тестеру указать строку настраиваемого формата.

NB: я прочитал документы и другие ответы SO, связанные с датой Утверждения и считаю, что это немного другой вопрос.

Ответы [ 2 ]

2 голосов
/ 15 июля 2020

То, что я пытался, на самом деле было допустимым вариантом использования (как и альтернативное решение, любезно предложенное Питером Томасом в его ответе).

Причина, по которой мой конкретный вариант не работал, была эта ошибка:

07:22:50.421 assertion failed: path: $.date1, actual: '#? matchesMyDateFormat(_)', expected: '2020-06-10T14:44:57.060Z', reason: not equal

Я заметил парой fre sh глаз, что мне нужно перевернуть оператор соответствия с:

* match expected == actual

To:

* match actual == expected

Это Путь необходим для того, чтобы Каратэ работало своим магом c и вызывала пользовательскую функцию в ожидаемом порядке. json.

2 голосов
/ 15 июля 2020

Вы можете добавлять функции в karate-config.js, которые будут «глобальными». Например:

var config = {};
config.isValidDate = read('classpath:is-valid-date.js');
return config;

Теперь вы можете использовать isValidDate(_) в любой функции . Обратите внимание, что функции JS могут принимать несколько аргументов, например:

* match foo == { bar: "#? isValidDate(_, 'MYFORMAT')" }

В 0.9.6.RC4 мы внесли улучшения, чтобы вы могли перемещать сложные условные логические операции c и даже match в re -используемые JS файлы: https://github.com/intuit/karate/issues/1202

Имейте в виду, что большое количество таких действий может привести к нечитаемым тестам: { ссылка }

Один намек: вы можете использовать karate.forEach() для извлечения всех полей даты в массив, и тогда может работать один match each.

Наконец, если вы все еще чувствуете, что «слишком много кода в ваши файлы функций ", я не знаю, может быть, вам нужно посоветоваться с фокусником.

...