我编写了一个算法来解决 Haskell 中的子集和问题。签名是
subsetSum :: (Ord a, Num a) => [a] -> a -> Maybe [a]
QuickCheck 似乎非常适合测试它。例如,我在这里是我可以检查的属性之一:
prop_sumEqualsS l s = case subsetSum l s of
Just solution -> (sum solution) == s
Nothing -> True
问题是该算法的计算量非常大,并且运行 100 个带有大输入列表的测试需要很长时间才能运行。
我尝试使用 QuickCheck 1,它确实运行得很快,但用于测试的数据集非常小。转移到 QuickCheck 2 后,它似乎是相反的问题。有一本 QC 手册,但它似乎很旧(没有日期信息),我不知道还有多少适用于 QC2。Haskell Wiki 上提供了一个教程,但没有太多细节,只是关于实例化的几句话Arbitrary
。
所以我有两个问题:
- QuickCheck 2 的哪些变化使它变得比 QuickCheck 慢得多?
- 控制数据集创建以使其对给定测试有用的最佳方法是什么?
编辑:更具体地说,我想测试我的解决方案,列表大小从 0 到 100,包含 -10000 到 10000 之间的整数。