我正在尝试使用SmallCheck来测试Haskell程序,但我无法理解如何使用该库来测试我自己的数据类型.显然,我需要使用Test.SmallCheck.Series.但是,我发现它的文档非常混乱.我对菜谱式解决方案和逻辑(monadic?)结构的可理解解释感兴趣.以下是我的一些问题(全部相关):
如果我有数据类型data Person = SnowWhite | Dwarf Integer,我smallCheck该如何解释有效值是Dwarf 1通过Dwarf 7(或SnowWhite)?如果我有一个复杂的FairyTale数据结构和构造函数makeTale :: [Person] -> FairyTale,并且我想smallCheck使用构造函数从Person-s列表中制作FairyTale-s怎么办?
我设法quickCheck通过使用Control.Monad.liftM类似功能的明智应用程序来完成这样的工作,而不会让 我的手太脏makeTale.我无法想办法解决这个问题smallCheck(请向我解释一下!).
什么是类型之间的关系Serial,Series等等?
(可选)有什么意义coSeries?我如何使用Positive来自的类型SmallCheck.Series?
(可选)在smallCheck的上下文中,任何阐明应该是monadic表达式的逻辑是什么,以及什么只是常规函数,将会受到赞赏.
如果有任何介绍/教程使用smallCheck,我会很感激一个链接.非常感谢你!
更新:我应该补充一点,我找到的最有用和可读的文档smallCheck是本文(PDF).第一眼看我在那里找不到我的问题的答案; 它更像是一个有说服力的广告而不是教程.
更新2:我把关于Identity在类型Test.SmallCheck.list和其他地方出现的怪异问题转移到一个单独的问题上.
使用此片段和smallcheck-1.0.1
data Foo = A | B | Pair Foo Foo deriving Show
deriving instance Generic Foo
instance (Monad m) => Serial m Foo
Run Code Online (Sandbox Code Playgroud)
那么这个
list 1 (series :: Series Identity Foo)
Run Code Online (Sandbox Code Playgroud)
生成一个看似无限的列表.
我认为有些东西是相同的,直到smallcheck-0.6.1只生成[A,B]并且是我所期望的.
这是对smallcheck系列的预期更改,如果是这样,是否有一种简单的方法来取回0.6.1行为.
这里有可编辑的程序来证明这一点:http: //hpaste.org/83927
我正在做第一部分真正的工作smallcheck,我对如何使用Depth参数感到有些困惑.在我进入之前,让我说明我正在使用smallcheck的内容.
在工作中,我们正在我们自己的内部数据库前构建一个简单的Web服务.Web服务执行一些查询,并将查询结果序列化为JSON进行响应.我目前正在研究的是保证:给定一个表示查询结果的对象,该对象产生预期的JSON.例如:
data Action
= Action { actionType :: !ActionType
, actionDescription :: !Text
, actionPerformedAt :: !UTCTime
, actionAgentName :: !Text
}
Run Code Online (Sandbox Code Playgroud)
必须生成JSON,例如:
{
"type": "Booking",
"description": "Whatever",
"performedAt": "2012-01-04",
"agent": "Tom"
}
Run Code Online (Sandbox Code Playgroud)
这看起来像是一个理想的任务smallcheck,我将其表述如下:
testAction :: Tasty.TestTree
testAction = Tasty.testGroup "Action"
[ SmallCheck.testProperty "type" $
SmallCheck.over actions $ match $
Aeson.key "type" --> Aeson.toJSON . actionType
, SmallCheck.testProperty "dateActioned" $
SmallCheck.over actions $ match $
Aeson.key "dateActioned" --> expectedUTCTimeEncoding . actionPerformedAt …Run Code Online (Sandbox Code Playgroud) 我应该填写一些东西,undefined以便编译程序并测试它.我真的不知道symdiff应该做什么,所以我不知道我能填写什么undefined.有人可以给我一个提示,我可以插入undefined什么?
顺便说一句,当我想用ghci 7.6.3编译代码时,我得到一个错误:
Could not find module 'Test.SmallCheck.Series'我该如何解决?
这是代码:
{-# language FlexibleInstances #-}
{-# language MultiParamTypeClasses #-}
{-# language NoMonomorphismRestriction #-}
module Blueprint where
import Test.SmallCheck
import Test.SmallCheck.Series
data N = Z | S N deriving (Show , Eq)
symdiff :: N -> N -> N
symdiff x y = undefined
-- for testing in ghci: smallCheck 10 spec1
spec1 = \ (x,y) -> symdiff x y == symdiff y x
spec2 = …Run Code Online (Sandbox Code Playgroud)