Acabo de empezar a utilizar QuickCheck con un montón de código Haskell. Estoy detrás de los tiempos, lo sé. Esta pregunta es de dos partes:Prácticas recomendadas de Haskell QuickCheck (especialmente cuando se prueban clases de tipo)
En primer lugar, ¿cuáles son las mejores prácticas generales para Quick Check? Hasta ahora, he recogido los siguientes:
- Nombre su prop_ pruebas * (molesto, porque todo lo demás es camelCase)
- Prueba código exportado (si se está probando internos probable que estés haciendo equivocadas)
- propiedades de la prueba, no ejemplos
- no dicen
X is out of range, Y is in range
- En cambio, decir
if x is out of range, normalize x ≠ x
(o alguna otra propiedad)
- no dicen
Pero todavía estoy aferrándome a otras mejores prácticas. Particularmente:
- ¿Dónde se guardan las propiedades?
- ¿El mismo archivo?
- en un directorio
test/
? (De ser así, ¿cómo importa las cosas ensrc/
?) - en un directorio
Properties/
bajosrc
?
que es más importante, ¿cómo tienden a ir sobre la prueba de propiedades de tipo clases? Por ejemplo, considere la siguiente (simplificado) Clase Tipo:
class Gen a where
next :: a -> a
prev :: a -> a
me gustaría probar la propiedad ∀ x: prev (next x) == x
. Por supuesto, esto implica escribir pruebas para cada instancia. Es tedioso escribir la misma propiedad para cada instancia, especialmente cuando la prueba es más complicada. ¿Cuál es la forma estándar de generalizar tales pruebas?
Para las importaciones paralelas cuando se utiliza '/' y '' test/src directorios, tendrá que establecer 'Hs-Fuente-dirs: src, test' en su archivo' .cabal' de manera que ambos directorios están en la ruta de búsqueda del módulo. – hammar
¿Por qué los internos no tienen propiedades? – alternative
Ciertamente pueden hacerlo, es más difícil hacerse pruebas y, en mi experiencia, es mucho más útil probar el comportamiento exportado en lugar de los detalles de implementación. – So8res