Haskell QuickCheck中的穷举属性?
考虑Haskell中的以下快速检查程序Haskell QuickCheck中的穷举属性?,haskell,quickcheck,Haskell,Quickcheck,考虑Haskell中的以下快速检查程序 {-# LANGUAGE TemplateHaskell #-} import Test.QuickCheck import Test.QuickCheck.All prop_trivial :: Bool prop_trivial = 42 == (6 * 7) -- Wacky boilerplate to make all tests run. return [] runTests = $quickCheckAll main = do run
{-# LANGUAGE TemplateHaskell #-}
import Test.QuickCheck
import Test.QuickCheck.All
prop_trivial :: Bool
prop_trivial = 42 == (6 * 7)
-- Wacky boilerplate to make all tests run.
return []
runTests = $quickCheckAll
main = do
runTests
这适用于ghc版本7.8.3和QuickCheck 2.7.6。问题是它会重复测试100次。我四处寻找缓解措施,并在中找到详尽的。太棒了!我将我的道具更改为以下内容:
prop_trivial = exhaustive $ property $ 42 == (6 * 7)
哪种类型检查和编译,但失败:
=== prop_trivial from /blahblahblah/FooTest.hs:6 ===
*** Failed! Falsifiable (after 1 test):
False
我对如何理解和调试这个结果有点困惑;这些文件太薄了,我弄不清楚到底发生了什么。这真是直截了当。穷举
的默认定义用于属性
实例,默认定义为穷举u=False
。我想你可能想要详尽的$42==(6*7)
这是非常简单的。穷举
的默认定义用于属性
实例,默认定义为穷举u=False
。我认为您可能需要详尽的$42==(6*7)
似乎可以使用一次
修改属性,使其仅运行一次
一些示例代码:
{-# LANGUAGE TemplateHaskell #-}
import Test.QuickCheck
import Test.QuickCheck.All
prop_trivial :: Int -> Bool
prop_trivial x = x == x
prop_trivial2 = once prop_trivial
prop_true = True
prop_true2 = once True
-- Wacky boilerplate to make all tests run.
return []
runTests = $quickCheckAll
main = do
putStrLn $ "exhaustive prop_trivial = " ++ show (exhaustive prop_trivial)
putStrLn $ "exhaustive prop_trivial2 = " ++ show (exhaustive prop_trivial2)
putStrLn $ "exhaustive prop_true = " ++ show (exhaustive prop_true)
putStrLn $ "exhaustive prop_true2 = " ++ show (exhaustive prop_true2)
runTests
输出:
exhaustive prop_trivial = False
exhaustive prop_trivial2 = False
exhaustive prop_true = True
exhaustive prop_true2 = False
=== prop_trivial from qc2.hs:5 ===
+++ OK, passed 100 tests.
=== prop_trivial2 from qc2.hs:7 ===
+++ OK, passed 1 tests.
=== prop_true from qc2.hs:8 ===
+++ OK, passed 100 tests.
=== prop_true2 from qc2.hs:9 ===
+++ OK, passed 1 tests.
穷举
prop仅在已知prop的测试是穷举的情况下返回True-请注意穷举True
和穷举$once True
之间的区别。似乎可以使用once
将属性修改为仅运行一次
一些示例代码:
{-# LANGUAGE TemplateHaskell #-}
import Test.QuickCheck
import Test.QuickCheck.All
prop_trivial :: Int -> Bool
prop_trivial x = x == x
prop_trivial2 = once prop_trivial
prop_true = True
prop_true2 = once True
-- Wacky boilerplate to make all tests run.
return []
runTests = $quickCheckAll
main = do
putStrLn $ "exhaustive prop_trivial = " ++ show (exhaustive prop_trivial)
putStrLn $ "exhaustive prop_trivial2 = " ++ show (exhaustive prop_trivial2)
putStrLn $ "exhaustive prop_true = " ++ show (exhaustive prop_true)
putStrLn $ "exhaustive prop_true2 = " ++ show (exhaustive prop_true2)
runTests
输出:
exhaustive prop_trivial = False
exhaustive prop_trivial2 = False
exhaustive prop_true = True
exhaustive prop_true2 = False
=== prop_trivial from qc2.hs:5 ===
+++ OK, passed 100 tests.
=== prop_trivial2 from qc2.hs:7 ===
+++ OK, passed 1 tests.
=== prop_true from qc2.hs:8 ===
+++ OK, passed 100 tests.
=== prop_true2 from qc2.hs:9 ===
+++ OK, passed 1 tests.
穷举
prop仅在已知prop测试是穷举的情况下返回True-请注意穷举True
和穷举$once True
之间的区别。它不像QuickCheck那样开发,但是对于详尽的测试来说非常好。当QuickCheck生成随机输入时,smallcheck系统地生成其输入,在给定(由您)大小的所有输入上运行您的属性。对于具有有限多居民的类型,这使得设置穷举测试变得非常简单,而且因为我们不试图生成随机的内容,这也使得避免重复测试变得很容易。以下是一个简单的ghci示例:
Test.SmallCheck> smallCheck 10 (6*7 == 42)
Completed 1 tests without failure.
10
是用于选择何时停止生成输入的最大深度;因为没有输入,所以在本例中忽略它。对于使用尺寸的示例,请考虑:
Test.SmallCheck> smallCheck 10 (\x -> x <= (10 :: Integer))
Completed 21 tests without failure.
Test.SmallCheck> smallCheck 20 (\x -> x <= (10 :: Integer))
Failed test no. 22.
there exists 11 such that
condition is false
Test.SmallCheck>SmallCheck 10(\x->x SmallCheck 20(\x->x你可能会喜欢。它不像QuickCheck那样发达,但非常适合进行详尽的测试。在QuickCheck生成随机输入的地方,SmallCheck系统地生成输入,在给定(由你)的所有输入上运行你的属性大小。对于具有有限多居民的类型,这使得设置穷举测试变得非常简单,而且因为我们不尝试生成随机内容,这也使得避免重复测试变得很容易。下面是一个简单的ghci示例:
Test.SmallCheck> smallCheck 10 (6*7 == 42)
Completed 1 tests without failure.
10
是用于选择何时停止生成输入的最大深度;由于没有输入,因此在本例中忽略它。对于使用大小的示例,请考虑:
Test.SmallCheck> smallCheck 10 (\x -> x <= (10 :: Integer))
Completed 21 tests without failure.
Test.SmallCheck> smallCheck 20 (\x -> x <= (10 :: Integer))
Failed test no. 22.
there exists 11 such that
condition is false
Test.SmallCheck>SmallCheck 10(\x->x SmallCheck 20(\x->x遗憾的是,使用穷举$42==(6*7)
,测试仍然运行了100次。我试图获得一个属性Bool
实例来进行穷举,但显然没有成功。遗憾的是,使用穷举$42==(6*7)
,该测试仍然运行了100次。我试图获取一个属性Bool
实例来进行穷举,但显然没有成功。