Как создать содержательные примеры для проверки n-арных свойств с помощью тестирования на основе свойств?

Как вы генерируете тестовые данные для n-мерных свойств отношений, например, транзитивности или симметрии, в настройках тестирования на основе свойств, таких как quickcheck Haskell для пользовательских структур данных? Думаю, язык реализации значения не имеет.

Вот наивный пример C ++ с использованием rapidcheck (только потому, что у меня есть этот инструмент прямо сейчас ):

  rc::check("Double equality is symmetric.", [](double a, double b) {
     RC_ASSERT(!(a == b) || (b == a)); // a == b ==> b == a
  });

В таком наивном случае маловероятно, что инструмент сгенерирует много примеров, в которых действительно выполняется предпосылка (a == b), поэтому вы в конечном итоге потратите много усилий на бессмысленные тесты. Еще хуже обстоит дело с трехмерными отношениями, такими как транзитивность.

Есть ли общий метод решения этих проблем? Нужно ли мне создавать равные пары (для конструктивного определения «равных»)? А как насчет таких вещей, как заказы?


person choeger    schedule 10.01.2020    source источник


Ответы (1)


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

Рассмотрим следующий генератор, адаптированный из https://johanneslink.net/how-to-specify-it/#46-a-note-on-generation:

@Provide
Arbitrary<Integer> keys() {
    return Arbitraries.oneOf(
            Arbitraries.integers().between(-25, 25),
            Arbitraries.integers()
    );
}

Генерация сначала с равной вероятностью выберет любое целое число от -25 до +25. Таким образом, примерно каждое сотое значение будет дублироваться.

В более сложных случаях у меня может даже быть генератор, который выбирает из небольшого набора предопределенных значений.

ОБНОВЛЕНИЕ: последняя версия jqwik позволяет явно генерировать дубликаты с заданной вероятностью: https://jqwik.net/docs/snapshot/user-guide.html#inject-duplicate-values Однако я не знаю, есть ли у QuickCheck или любой другой библиотеки PBT аналогичная функция.

person johanneslink    schedule 11.01.2020