Haskell QuickCheck 中的详尽属性?
Exhaustive properties in Haskell QuickCheck?
考虑以下 Haskell
中的 QuickCheck 程序
{-# 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 次。我四处寻找缓解措施并在 the QuickCheck docs here 中找到 exhaustive
。 Groovy!我将 prop_trivial
更改为以下内容:
prop_trivial = exhaustive $ property $ 42 == (6 * 7)
类型检查和编译失败:
=== prop_trivial from /blahblahblah/FooTest.hs:6 ===
*** Failed! Falsifiable (after 1 test):
False
我对如何理解和调试这个结果有点困惑;文档有点太薄了,我无法弄清楚发生了什么。
source 真的很简单。 exhaustive
的默认定义用于 Property
实例,默认为 exhaustive _ = False
。我想你可能想要 exhaustive $ 42 == (6 * 7)
好像只能用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.
仅 exhaustive
prop returns 如果已知 prop 的测试是详尽无遗的,则为真 - 请注意exhaustive True
和 exhaustive $ once True
之间的区别。
您可能会喜欢 smallcheck。它不像 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
考虑以下 Haskell
中的 QuickCheck 程序{-# 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 次。我四处寻找缓解措施并在 the QuickCheck docs here 中找到 exhaustive
。 Groovy!我将 prop_trivial
更改为以下内容:
prop_trivial = exhaustive $ property $ 42 == (6 * 7)
类型检查和编译失败:
=== prop_trivial from /blahblahblah/FooTest.hs:6 ===
*** Failed! Falsifiable (after 1 test):
False
我对如何理解和调试这个结果有点困惑;文档有点太薄了,我无法弄清楚发生了什么。
source 真的很简单。 exhaustive
的默认定义用于 Property
实例,默认为 exhaustive _ = False
。我想你可能想要 exhaustive $ 42 == (6 * 7)
好像只能用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.
仅 exhaustive
prop returns 如果已知 prop 的测试是详尽无遗的,则为真 - 请注意exhaustive True
和 exhaustive $ once True
之间的区别。
您可能会喜欢 smallcheck。它不像 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