From 九十九道 Haskell 问题:
问题23: 从列表中提取给定数量的随机选择的元素。
这是部分解决方案。为简单起见,此代码仅从列表中选择一个元素。
import System.Random (randomRIO)
randItem :: [a] -> IO a
randItem xs = do
i <- randomRIO (0,length xs - 1)
return $ xs !! i
so randItem [1..10]
会返回一个IO Int
对应(但不等于)从 1 到 10 的某个 Int。
到目前为止,一切都很好。但是我可以为 randItem 函数编写什么样的测试呢?我可以确认输入和输出之间的什么关系(如果有)?
我可以使用与上述函数相同的逻辑来生成m Bool
,但我不知道如何测试m Bool
。谢谢。
您可以做几件事。如果您使用 QuickCheck,则可以编写以下属性:
- 返回列表的长度应等于输入长度。
- 返回列表中的所有元素都应该是候选列表中的元素。
除此之外,Haskell 的 Random 库的优点在于(与大多数其他 Haskell 代码一样)它是确定性的。如果,而不是基于您的实施randomRIO
,你可以基于它randomR
or randomRs
。这将使您能够通过一些已知的RandomGen
一些确定性单元测试用例的值(不是 QuickCheck)。这些可以作为回归测试。
我现在已经发布了关于上述方法的文章,完成源代码.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)