簡體   English   中英

單元測試IO Int和Haskell中的類似

[英]Unit testing IO Int and similar in Haskell

九十九個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 ,你可以將它基於randomRrandomRs 這將使您能夠將一些已知的RandomGen值傳遞給某些確定性單元測試用例(而不是QuickCheck)。 這些可以作為回歸測試。


我現在發表了一篇關於上述方法的文章 ,其中包含源代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM