我正在做我的第一次真正的工作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
框架中的默认smallcheck
深度tasty
是 5,这导致我还没有看到完成的测试运行。smallcheck
具有changeDepth
andchangeDepth1
功能,因此我可以使用它们changeDepth (const 3)
来确保我的测试始终在合理的时间内运行。但是,通过这样做,我不禁觉得我在某个地方错过了重点?例如,现在不可能通过仅更改命令行选项来运行测试来运行更长的测试,可能在一夜之间。另一方面,如果我使用changeDepth (- 2)
,它仍然感觉好像我在假设测试是如何运行的!也许最好假设 5 的全局测试深度在n秒内运行,并且由每个属性来调整它认为合适的深度?
希望听到一些关于smallcheck
.