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

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

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

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

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

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

1 Ответ

1 голос
/ 11 января 2020

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

Рассмотрим следующий генератор, адаптированный из 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 похожую функцию.

...