Тест на позиции - функция - PullRequest
       11

Тест на позиции - функция

0 голосов
/ 24 ноября 2018
positions :: Eq a => a -> [a] -> [Int]
positions x xs = [i | (x',i) <- zip xs [0..], x == x']

Мне нужно создать функцию Test для функции позиции, которая проходит быструю проверку.

У кого-нибудь есть идея?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Хороший вопрос!У меня тоже было немного проблем с этим, когда я начал использовать QuickCheck, но, поскольку я использовал его чаще, я начал понимать, какие свойства вы должны тестировать.Часто, хорошее место для начала - подумать о том, какие отношения должны поддерживаться между входными данными и выходными данными.Ваша функция находит индексы элемента в списке;Теперь, какие свойства должны иметь в этом случае?Вот два из них, о которых я могу подумать:

  1. Список индексов должен иметь такое же количество элементов, как и вхождения значения в списке.
  2. Каждый индекс должен соответствоватьправильное значение.

И вот схема того, как эти свойства могут быть проверены:

  1. Создайте случайный список, примените к нему positions, затем подсчитайте числоиз возвращенных индексов и убедитесь, что оно совпадает с числом вхождений искомого значения.
  2. Создайте случайный список, затем примените к нему positions и убедитесь, что элемент в каждом из возвращенных индексов является значениемкоторый был найден.

Я также думаю, что ответ @ chi имеет смысл сказать, что вы должны разрабатывать тесты из спецификации, а не из кода;это связано с тем, что я говорил выше, в том смысле, что спецификация может помочь вам найти отношения между входными данными и выходными данными, которые могут быть не сразу видны из кода.

0 голосов
/ 24 ноября 2018

Возможный тест может выполнять следующие операции:

  • случайным образом генерировать xs, ys :: [Int] и y :: Int
  • определить list = xs ++ y : ys
  • тест length xs `elem` positions y list

Возможно, вы также захотите написать тесты для отсутствующих элементов.

При этом, довольно странно создавать тесты из кода.Следует разработать тест, используя спецификацию , используемую вместо этого для написания кода.В противном случае, если в коде есть некоторые причуды, они также заканчиваются тестами: вместо проверки того, что код должен делать, мы проверяем, что делает код, что может быть бессмысленно.

...