Haskell 快速检查规范DSL
我想创建一个非haskell程序员能够理解的可读DSL,用于创建外部系统黑盒测试规范 我想知道这样的事情在哈斯克尔是否可行Haskell 快速检查规范DSL,haskell,quickcheck,hspec,Haskell,Quickcheck,Hspec,我想创建一个非haskell程序员能够理解的可读DSL,用于创建外部系统黑盒测试规范 我想知道这样的事情在哈斯克尔是否可行 action = readProcess "sleep 1; print success" prop_action = monadicIO $ within 100000 >>= repliesWith (== "success") within :: Int -> IO a -> IO within t = fromMaybe
action = readProcess "sleep 1; print success"
prop_action = monadicIO $
within 100000 >>=
repliesWith (== "success")
within :: Int -> IO a -> IO
within t = fromMaybe False $ timeout t
repliesWith :: (a -> Bool) -> IO a -> IO Bool
repliesWith v = liftM v
这里我给出一个伪代码,用于检查操作是否会在0.1秒内返回值“success”。似乎我需要某种monad,它会在错误值上短路,以链接多个检查,将值从一个传递到另一个
感觉像这样的东西应该存在。也许您可以建议一个库或如何在Haskell中实现我的想法。可以,但您的语法不正确。您希望在x内
您的操作
,而不是在x内=您的操作
<然后,用叉子和超时就可以轻松实现内的code>。其思想是连锁检查,而不是在内创建和执行hoc。例如,我们可以想象before
状态,该状态表示下一个操作应该在另一个并行操作之前发生,如果是,则将结果传递给另一个检查。我相信没有必要用叉子Control.Concurrent.timeout
已经做了我需要的事情。那是因为timeout
为你做了分叉;我不是说你必须特别使用forkIO
。@Cubic是的,好的。我的问题仍然没有答案。我可以创建一种复合的一元属性吗?DSL对于非haskell程序员来说是可读的。如果我不能,我只是想确定一下。如果你将中的类型更改为中的IO Bool->IO Bool
和monadicIO$within 100000>=回复(=“success”)
为monadicIO,那么你写的东西就可以了。10万以内。回答(=“success”)$theActionYouWantToTest
。如果你想做更多的事情,你必须详细说明。可能是的,但你的语法是错的。您希望在x内您的操作
,而不是在x内=您的操作
<然后,用叉子和超时就可以轻松实现内的code>。其思想是连锁检查,而不是在内创建和执行hoc。例如,我们可以想象before
状态,该状态表示下一个操作应该在另一个并行操作之前发生,如果是,则将结果传递给另一个检查。我相信没有必要用叉子Control.Concurrent.timeout
已经做了我需要的事情。那是因为timeout
为你做了分叉;我不是说你必须特别使用forkIO
。@Cubic是的,好的。我的问题仍然没有答案。我可以创建一种复合的一元属性吗?DSL对于非haskell程序员来说是可读的。如果我不能,我只是想确定一下。如果你将中的类型更改为中的IO Bool->IO Bool
和monadicIO$within 100000>=回复(=“success”)
为monadicIO,那么你写的东西就可以了。10万以内。回答(=“success”)$theActionYouWantToTest
。如果你想得到更多的东西,你必须详细说明。
action = readProcess "sleep 1; print success"
prop_action = monadicIO $
within 100000 >>=
repliesWith (== "success")
within :: Int -> IO a -> IO
within t = fromMaybe False $ timeout t
repliesWith :: (a -> Bool) -> IO a -> IO Bool
repliesWith v = liftM v