[英]Unit testing IO Int and similar in Haskell
問題23 : 從列表中提取給定數量的隨機選擇的元素。
這是部分解決方案。 為簡單起見,此代碼只從列表中選擇一個元素。
import System.Random (randomRIO)
randItem :: [a] -> IO a
randItem xs = do
i <- randomRIO (0,length xs - 1)
return $ xs !! i
所以randItem [1..10]
會返回一個IO Int
,它對應於(但不等於)從1到10的某個Int。
到現在為止還挺好。 但是我可以為randItem函數編寫什么樣的測試? 我可以在輸入和輸出之間確定什么關系 - 如果有的話?
我可以使用與上述函數相同的邏輯來生成m Bool
,但我無法弄清楚如何測試m Bool
。 謝謝。
你可以做幾件事。 如果您使用的是QuickCheck,則可以編寫以下屬性:
除此之外,Haskell的Random庫的優點在於(與大多數其他Haskell代碼一樣)它是確定性的。 如果,而不是在你的基礎實施randomRIO
,你可以將它基於randomR
或randomRs
。 這將使您能夠將一些已知的RandomGen
值傳遞給某些確定性單元測試用例(而不是QuickCheck)。 這些可以作為回歸測試。
我現在發表了一篇關於上述方法的文章 ,其中包含源代碼 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.