我有一個QuickCheck屬性測試函數f
。該屬性將函數f
映射到某個列表xs
並檢查結果的一些元素明智的屬性。在失敗的情況下,我想顯示與此失敗相關的xs
的元素。考慮以下屬性:顯示QuickCheck屬性失敗的原因並處理測試函數中的異常
prop x =
printTestCase ("Failed for value " ++ show failure) $ isNothing failure
where
failure = fmap fst $ find (not . snd) $ map (\n -> (n, f x n == n)) [10..20]
也能正常工作的實施
f = (+)
和quickcheck prop
輸出
*** Failed! Falsifiable (after 2 tests):
1
Failed for value Just 10
但是,如果f
拋出一個異常,即
f = undefined
個
然後quickcheck prop
輸出
*** Failed! Exception: 'Prelude.undefined' (after 1 test):
()
Failed for value Exception thrown by generator: 'Prelude.undefined'
我如何可以寫一個捕獲此第二個異常並返回「只需0」 爲前面的例子中的屬性?我想,可以使用whenFail
或whenFail'
這個,但我還沒有理解QuickCheck的內部。
是否有一個原因,您不定義元素類型的屬性,並讓QuickCheck一次測試一個元素?然後QuickCheck會告訴你它失敗的價值。 –
是的,我忘了提到這一點。在我的真實代碼中,我通過在所有估值的詳盡列表上比較它們來測試布爾公式的等價性。產出應該給我第一次估價,這些公式有偏差。 –
我改變了問題,給出了一個更接近我真實代碼的例子。 –