簡體   English   中英

Haskell - 在QuickCheck的幫助下進行Parsec測試

[英]Haskell - Parsec testing with the help of QuickCheck

我想為Parsec解析器編寫測試。 以下是解析器和數據結構的示例:

data Event = Event { keyEvent :: String }
    deriving Show

parseKey :: Parser Event
parseKey = do
             char '<'
             k <- many1 (letter <|> digit <|> oneOf "_")
             char '>'
             return $ Event k

我知道我需要檢查parse = parse . pretty . parse parse = parse . pretty . parse parse = parse . pretty . parse財產。 但是,我應該如何生成正確不正確的測試用例? 一般來說,我應該如何為給定的BNF生成測試用例? 我知道instance Arbitrary ,但沒有太多的幫助。

如果您為這個簡單的解析器提供一個評論良好的生成器示例,我將不勝感激。

測試解析器並非完全無足輕重。 (與所有測試一樣,取決於事物的復雜性。)

你可以做的一件事就是編寫一個Arbitrary實例,它構造所有有效的表達式(或者你正在嘗試解析的任何東西),然后檢查如果你打印那個東西,然后解析得到的字符串,你就會准確地回來你從什么開始。

這有幾個問題:

  • 如果答案是錯的,那什么破了? 解析器還是打印機?

  • 如果你正在解析的東西很復雜,有可選的括號和東西,你需要檢查它是否可以使用和不使用可選括號。 你漂亮的打印機通常會以這種或那種方式進行。

  • 這並沒有檢查垃圾輸入是否真的被拒絕(並沒有被解析為奇怪的東西)。 例如,我已經編寫了大量的Parsec解析器,如果它出現在輸入的末尾 ,它將默默地忽略語法錯誤。

一般來說,我所知道的測試解析器的唯一真正徹底的方法就是手動編寫大量的手動測試。 (每當你發現解析錯誤的東西時,為它添加另一個測試用例。)例如,這基本上是GHC對他們的測試套裝所做的。

當然,這取決於你的解析器有多復雜,以及你想要多少保證......如果你只是解析JSON,你可以很容易地測試它。 如果你正在解析像Markdown這樣的東西......我的上帝憐憫你的靈魂!

暫無
暫無

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

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