Подтвердить что ты не робот

Вы использовали Quickcheck в реальном проекте?

Quickcheck и его варианты (даже есть один в Java), представляется интересным. Однако, помимо академического интереса, действительно ли это полезно при реальном тестировании приложений (например, приложение GUI или клиент/сервер или даже сам StackOverflow)? Любой опыт, который у вас был с похожими тестовыми генераторами, оценен.

4b9b3361

Ответ 1

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

Еще в 2004 году мы были вынуждены использовать QuickCheck для тестирования наших программ Haskell, и это была комбинация хороших и плохих. В основном плохо, потому что Haskell был немного запутанным, но никогда не менее замечательным, когда вы его работали.

Джон с тех пор усовершенствовал то, что он написал много лет назад, и фактически помог Ericssion проверить свое сложное аппаратное обеспечение для телекоммуникаций, и он обнаружил ошибки в 20 миллионах или около того строк кода, уменьшающих это до трех шагов через его подход. Он великий оратор, поэтому он всегда испытывает радость, слушая, как он представляет то, что он делает так хорошо, но в целом то, что он сделал с QuickCheck, было для меня новым. Поэтому я спросил его, как его интересовал вывод этого на рынок. Он был открыт для этой идеи, но в то время его бизнес (основанный на QuickCheck) был относительно новым, и поэтому были другие области, на которые он сосредоточился бы. Это сейчас 2007. Я хочу сказать, что вы можете учиться в QuickCheck, даже если вы не закончите использовать его.

Но что такое QuickCheck? Это комбинаторная система тестирования и интересный способ тестирования программ. Люди в Microsoft Research построили Pex, что похоже на подобное. Pex автоматически генерирует тесты, изучая ваш IL. Однако Джон написал генератор для возможных входных и тестовых свойств функции. Свойство - это то, что можно легко протестировать, и это намного более формально. например реверсирование списка? Ну, реверсив список, это то же самое, что и разбиение списка на две половины, поменяв их каждый по отдельности, а затем объединив две обратные половины в обратном порядке.

1,2,3,4 // original
1,2 3,4 // split into A and B
2,1 4,3 // reverse A and B
4,3,2,1 // concat B and A

Это отличное свойство для тестирования с QuickCheck, называемое спецификацией, и результат довольно удивителен.

Pex приятный, но не такой классный, как QuickCheck, Pex упрощает все, что делает QuickCheck, но для написания хорошей спецификации требуется много усилий.

Сила QuickCheck заключается в том, что когда он работает с отказом, он уменьшит ввод, который вызвал бы потерю теста, до наименьшей возможной формы. Оставив вас с подробным описанием того, что прогрессирование состояния привело к тому, что ваш тест потерпел неудачу. По сравнению с другими платформами тестирования, которые просто попытаются сломать ваш код с помощью грубой силы.

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

Для работы с QuickCheck гораздо больше работы, но конечный результат - лучшее тестирование. Как сказал сам Джон, 70% ошибок попадают под единичное тестирование, но это еще 30%, что приводит к сбою вашей программы. QuickCheck тестирует последние 30%.

Ответ 2

Я сделал настоящую проблему с Haskell, которая включала в себя моделирование дискретных событий. Поэтому я написал библиотеку DES, основанную на продолжении монады, наряду с эквивалентами MVars и Channels. Мне нужно было проверить, что это сработало правильно, поэтому я написал кучу свойств QuickCheck, чтобы продемонстрировать, что, например, два потока одновременных данных, записанных на канал, будут правильно объединены, не отбрасывая ничего.

Я также использовал QuickCheck для документирования и проверки свойств в Ranged Sets и Decimal.

По моему опыту QuickCheck иногда замечателен. Если вы можете суммировать важное свойство в сжатом виде, хотя алгоритм, который обеспечивает это свойство, является волосатым, QuickCheck - огромная победа. С другой стороны, я часто нахожу, что алгоритм эквивалентен свойству, которое я хочу проверить. В этом случае я ищу более простые свойства. Например, предположим, что функция "foo" должна быть не строго монотонной. Затем вы можете написать

prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y)

Ответ 3

Я использую QuickCheck для многих личных вещей. В течение последних шести месяцев:

  • Ran QuickCheck для проверки цветовых преобразований и дискретных косинусных преобразований в компрессоре изображений.

  • Ran QuickCheck для тестирования модуля символической дифференциации, который я взбивал для некоторой численной оптимизации.

  • Ran QuickCheck для тестирования дерева тройного поиска в стиле Bentley и Sedgewick.

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

Ответ 4

Я использовал его довольно много, главным образом в режиме straighforward, главным образом для тестирования протокола и реализации парсера.

Тем не менее, здесь нет тривиального бита из моего личного опыта: http://www.haskell.org/haskellwiki/QuickCheck_as_a_test_set_generator

Ответ 6

AFAIK XMonad широко тестируется с помощью QuickCheck

Ответ 7

Я использовал Haskell только в производственной среде для разработки небольших вспомогательных инструментов. В основном потому, что я единственный разработчик, которого я знаю, который читает Haskell. Я часто использовал QuickCheck и очень раздражался тем, что что-то подобное не доступно на С#. Поэтому я решил попробовать и написать сам. Я тоже посмотрел на Pex, но нашел методы исследования программ, которые используются для того, чтобы найти минимальный вход менее интересный, чем способ QuickCheck.

Ответ 8

Я использую QuickCheck для проверки поведения программ с командной строкой, написанных на любом языке.

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

Для удобства я написал http://hackage.haskell.org/package/proctest, в который включены некоторые примеры QuickCheck, которые используются вместе с hspec и HUnit для тестирования программ командной строки. путь.

Ответ 9

Мы используем FsCheck, чтобы проверить, что наши переводы OCaml на F # верны, и что наши оптимизированные версии работают так же, оптимизированные версии. Я также планирую использовать его для тестирования lexer и parser, поскольку проект NHol использует parser.

У нас также есть вспомогательные функции, которые позволяют нам запускать тест в NUnit (XUnit для .Net). См. assertProp.

Ответ 10

Я использовал QuickCheck для тестирования кодировщика и декодера SMS PDU на платформе LG Linux Mobile. A (старая версия) той части программного обеспечения, которую я разработал в то время, доступна для загрузки по адресу http://hackage.haskell.org/package/GenSmsPdu-0.1

Ответ 11

Это не мой проект, но пакет containers использует QuickCheck довольно широко. Лично я попытался использовать его, чтобы сравнить глупое маленькое правое сито, которое я написал одному в arithmoi, что привело меня к обнаружению того, что один из arithmoi иногда segfaults.