标签: smallcheck

如何在Haskell中使用SmallCheck?

我正在尝试使用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和其他地方出现的怪异问题转移到一个单独的问题上.

testing monads automated-tests haskell smallcheck

15
推荐指数
1
解决办法
1629
查看次数

泛型系列生成无限列表

使用此片段和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

haskell smallcheck

6
推荐指数
1
解决办法
144
查看次数

在smallcheck中控制`Depth`参数应该多少?

我正在做第一部分真正的工作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)

haskell smallcheck

5
推荐指数
2
解决办法
355
查看次数

symdiff做了什么(在haskell中)

我应该填写一些东西,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)

haskell smallcheck

1
推荐指数
1
解决办法
197
查看次数

标签 统计

haskell ×4

smallcheck ×4

automated-tests ×1

monads ×1

testing ×1