Я только что начал использовать QuickCheck с кучей кода Haskell. Я знаю, что знаю. Этот вопрос является двухпартовым:
Во-первых, каковы общие рекомендации по быстрой проверке? До сих пор я взял следующее:
- Назовите свои тесты prop_ * (раздражает, потому что все остальное - camelCase)
- Проверьте экспортированный код (если вы тестируете внутренние элементы, вы, вероятно, ошибаетесь)
- Свойства теста, а не примеры
- Не говори
X is out of range, Y is in range
- Вместо этого скажем
if x is out of range, normalize x ≠ x
(или какое-либо другое такое свойство)
- Не говори
Но я все еще хватаюсь за другие лучшие практики. В частности:
- Где хранятся свойства?
- Тот же файл?
- в каталоге
test/
? (Если да, то как вы импортируете материал вsrc/
?) - в каталоге
Properties/
в разделеsrc
?
Самое главное, как мы склонны тестировать свойства классов типов? Например, рассмотрим следующий (упрощенный) тип:
class Gen a where
next :: a -> a
prev :: a -> a
Я хотел бы проверить свойство ∀ x: prev (next x) == x
. Конечно, это требует написания тестов для каждого экземпляра. Очень сложно написать одно и то же свойство для каждого экземпляра, особенно когда тест более сложный. Каков стандартный способ обобщения таких тестов?