【发布时间】:2013-11-20 09:37:11
【问题描述】:
我正在使用smallcheck 进行我的第一次实际工作,我对如何使用Depth 参数感到有些困惑。在我开始之前,让我说明我使用smallcheck 的目的。
在工作中,我们正在我们自己的内部数据库前面构建一个简单的 Web 服务。 Web 服务执行一些查询,并以序列化为 JSON 的查询结果进行响应。我目前正在做的是保证:给定一个表示查询结果的对象,该对象会产生预期的 JSON。例如:
data Action
= Action { actionType :: !ActionType
, actionDescription :: !Text
, actionPerformedAt :: !UTCTime
, actionAgentName :: !Text
}
必须生成 JSON,例如:
{
"type": "Booking",
"description": "Whatever",
"performedAt": "2012-01-04",
"agent": "Tom"
}
这对于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
-- and so on
]
-- (-->) :: Eq a => lens-aeson traversal a -> (b -> a) -> b -> Bool
-- actions :: Monad m => SmallCheck.Series m Action
tasty 框架中的默认 smallcheck 深度为 5,这导致我还没有看到完成的测试运行。 smallcheck 具有 changeDepth 和 changeDepth1 函数,因此我可以将它们用作 changeDepth (const 3) 以确保我的测试始终在合理的时间内运行。但是,通过这样做,我不禁觉得我在某个地方错过了重点?例如,现在不可能通过仅更改命令行选项来运行测试来运行更长的测试,可能在一夜之间。另一方面,如果我使用changeDepth (- 2),我仍然觉得我在假设测试是如何运行的!也许最好假设 5 的全局测试深度在 n 秒内运行,并且由每个属性来调整它认为合适的深度?
很想听听关于smallcheck 这个更实用的方面的反馈。
【问题讨论】:
标签: haskell smallcheck