当我想测试纯代码时,QuickCheck我经常要写一个Arbitrary实例.要测试monadic代码,我可以Test.QuickCheck.Monadic按照本文所述使用.
我的问题是:是否有一些规范的方法来生成依赖于monadic上下文的数据?特别是,有任何monadic版本的任意?您将如何生成需要monadic上下文的数据?
在编写一些Arbitrary实例时,我使用以下非常机械的模式实现了几个函数:
type A = Arbitrary -- to cut down on the size of the annotations below
shrink1 :: (A a ) => (a -> r) -> (a -> [r])
shrink2 :: (A a, A b ) => (a -> b -> r) -> (a -> b -> [r])
shrink3 :: (A a, A b, A c) => (a -> b -> c -> r) -> (a -> b -> c -> [r])
shrink1 f a = [f a' …Run Code Online (Sandbox Code Playgroud) 是否有适用于Javascript的quickcheck版本,并且维护得很好?我找到了几个如check.js和claire,但它们似乎都没有支持缩小失败的测试用例,这一直是我整个问题中最有用的部分.
具有类似QuickCheck promote功能的结构的仿函数的一般术语是什么,即形式的函数:
promote :: (a -> f b) -> f (a -> b)
Run Code Online (Sandbox Code Playgroud)
(这是反过来的flip $ fmap (flip ($)) :: f (a -> b) -> (a -> f b)).除了(->) r和之外,是否还有任何具有此类操作的仿函数Id?(我相信一定有).谷歌搜索'quickcheck promote'只显示了QuickCheck文档,该文档没有提供promote任何更一般的上下文AFAICS; 搜索"快速检查促销"的SO不会产生任何结果.
haskell functional-programming functor quickcheck category-theory
作为quickCheck的粉丝,我有很多
prop_something_something = ...
Run Code Online (Sandbox Code Playgroud)
贯穿我的计划.
为方便起见,我定义了轻松运行所有这些内容
runchecks = do
quickCheck prop_something_something
quickCheck prop_something_different
Run Code Online (Sandbox Code Playgroud)
但是有一种很好的生成方式runchecks吗?
TL; DR:我想在文件中轻松运行所有quickChecks.我想有一种方法是使用test_或类似的东西为runnable测试添加前缀,但这可能太过于hacky.
我有一个函数,rev它为三个类型类中的类型返回一些值:
rev :: (Integral a, Show a, Read a) => a -> a
rev = read . reverse . show
Run Code Online (Sandbox Code Playgroud)
我想通过quickcheck测试一些关于它的属性.虽然,我对测试Integral类型的负值不感兴趣,因为我在基础库中Integer缺少Natural类型.所以我想,让我们采取与生成的值为负时生成的值相反的方法,我会没事的:
prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool
prop_id n | n >= 0 = (rev.rev) n == n
| otherwise = let n' = -n in (rev.rev) n' == n'
Run Code Online (Sandbox Code Playgroud)
(测试的属性在这里并不重要 - 特别是它不适用于非常基本的值,我知道这一点,它不是这个问题的主题)
然后我遇到了Positive修改器,并认为虽然我的测试现在正在运行,但以更好的方式实现它会很好.所以我尝试过:
prop_id :: (Integral a, Show a, Read a) => Positive a …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用另一个答案的 QuickCheck .我这样测试:
{-# LANGUAGE TemplateHaskell #-}
import Test.QuickCheck
import Test.QuickCheck.All
last' :: [a] -> a
last' [x] = x
last' (_:xs) = last' xs
prop_test x = last' x == last x
check = do
putStrLn "quickCheck"
quickCheck (prop_test :: [Char]-> Bool)
check2 = do
putStrLn "quickCheckAll"
$quickCheckAll
Run Code Online (Sandbox Code Playgroud)
然后,我加载它在winGHCI并调用check和check2.我明白了
quickCheck
*** Failed! (after 1 test):
Exception:
list.hs:(7,1)-(8,23): Non-exhaustive patterns in function last'
""
Run Code Online (Sandbox Code Playgroud)
我认为这是合理的.但是,我从中得到了这个check2
quickCheckAll
True
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为无论我如何改变last'功能,甚至错误,quickCheckAll总是返回True.
我的代码出了什么问题?我怎样才能解决这个问题?
人们应该认为这是一个FAQ,但我无法找到这个简单问题的答案:
我的GHC安装中有哪个版本的某个软件包?
我正在努力学习Haskell,为了做到这一点,我正在通过Real World Haskell.我现在已经达到了第11章,其中包括其他主题,介绍了QuickCheck.
遗憾的是,自2009年该书出版以来,QuickCheck已发生变化,似乎已经进行了各种修改.每当我寻找新的做事方式时,作为书中说明的替代方案,新的方式有时也无效.也许2012年描述了"新方式",但随后QuickCheck在当时和现在之间再次发生了变化.
最后,我将不得不弄清楚如何从文档或源代码中使用QuickCheck,但知道我应该调查哪个版本会非常有帮助.
我还没有达到我了解Cabal等的地步,所以我的问题是基于纯粹的无知.希望有一个简单的答案.
我在Windows上使用GHC,显然,QuickCheck已经捆绑到我的安装中.我已经有了QuickCheck,但我不知道哪个版本.
在我的项目中,我有几个QuickCheck属性,其中大部分是我使用forAllProperties收集的,在Test.QuickCheck.All中定义.我试图并行运行我的所有属性,这很麻烦:在运行结束时,我得到了在终端中打印的输出,并且反例和属性名称经常被分散,以致难以将属性与其计数器匹配例子.
我看到库pqc的目的是并行运行属性,但它不提供forAllProperties的替代,也没有提供将forAllProperties与并行测试驱动程序组合的方法.
感觉就像我需要的是forAllProperties将属性名称传递给它作为参数获取的函数.
我还研究了在线程基础上重定向stdout,首先使用system-posix-redirect(这不是线程安全的),然后研究Test.QuickCheck.State,尤其是终端字段.后者没有成功,因为我没有找到重写终端字段的方法.
有没有办法让我以某种方式输出反例和属性名称,而无需复制/粘贴Test.QuickCheck.All模块并进行我需要的更改?
我们有两个比较两个不同power函数的函数,如果它们返回相同的值(在同一个输入上),则返回true.
然后我们有两个其他函数来测试这些函数对两个列表,看看是否有任何值不返回true.
但是[1..100]我们不想使用使用范围的列表,而是使用QuickCheck.
是否可以使QuickCheck仅返回正整数?
码:
comparePower1 :: Integer -> Integer -> Bool
comparePower1 n k = power n k == power1 n k
comparePower2 :: Integer -> Integer -> Bool
comparePower2 n k = power n k == power2 n k
testing1 = and [comparePower1 n k | n <- [0..100], k <- [0..100]]
testing2 = and [comparePower2 n k | n <- [0..100], k <- [0..100]]
Run Code Online (Sandbox Code Playgroud) quickcheck ×10
haskell ×9
testing ×2
functor ×1
ghc ×1
javascript ×1
monads ×1
node.js ×1
typeclass ×1
unit-testing ×1