Как вы генерируете тестовые данные для 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
), поэтому вы в конечном итоге потратите много усилий на бессмысленные тесты. Еще хуже обстоит дело с трехмерными отношениями, такими как транзитивность.
Есть ли общий метод решения этих проблем? Нужно ли мне создавать равные пары (для конструктивного определения «равных»)? А как насчет таких вещей, как заказы?