Управление генерацией тестовых данных в QuickCheck

Я написал алгоритм, чтобы найти решение для проблема суммы подмножеств в Haskell. Подпись

subsetSum :: (Ord a, Num a) => [a] -> a -> Maybe [a]

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

prop_sumEqualsS l s = case subsetSum l s of
                        Just solution -> (sum solution) == s
                        Nothing       -> True

Проблема в том, что алгоритм довольно требователен к вычислительным ресурсам, а запуск 100 тестов с большими входными списками занимает целую вечность.

Я пробовал использовать QuickCheck 1, и он работал быстро, но наборы данных, использованные для тестирования, были очень маленькими. После перехода на QuickCheck 2 возникла противоположная проблема. Существует руководстводля QC, но оно кажется старым (нет информации о дате), и я не знаю, что еще применимо к QC2. Учебникдоступен на Haskell Wiki, но там не так много подробностей, только несколько слов о создании экземпляра Произвольного.

Итак, у меня есть два вопроса:

  • Какие изменения в QuickCheck 2 делают его намного медленнее, чем QuickCheck?
  • Как лучше всего управлять созданием наборов данных, чтобы сделать их полезными для конкретного теста?

Редактировать: Чтобы быть более конкретным, я хотел бы протестировать свое решение со списком размером от 0 до 100, содержащим целые числа от -10000 до 10000.

18
задан Antoine 3 April 2012 в 05:04
поделиться