我使用
cabal init
为我的 Haskell 项目构建初始代码库
我有几个用 Hspec 编写的测试。
在 cabal test
上,它会按预期编译并运行这些测试,并给出失败/通过的消息。
现在我包含了一个 quickCheck 测试,即使此测试失败,终端中的输出也无法识别 QuickCheck 测试。
但是在 dist/test/ 目录中我可以看到测试日志
*** Failed! ...
有没有办法在测试工作流程中“包含”quickCheck 测试。这样我就不必在每次测试运行后查看测试日志。
import Test.Hspec
import Test.QuickCheck
spec :: Spec
spec = do
describe "myTest" $ do
it "Something something" $ do
myTest "" `shouldBe` False
quickCheckWith stdArgs { maxSuccess = 1000 } prop_myTest -- <== ?
来自 Hspec 文档:
您可以将任意 QuickCheck 属性与 Hspec 一起使用,但它们必须是 Property 类型。 QuickCheck 的 property 函数可用于将 Testable 类的任何成员转换为 Property。这是一个例子:
describe "read" $ do
it "is inverse to show" $ property $
\x -> (read . show) x `shouldBe` (x :: Int)
是一种常见的模式。 Test.Hspec.QuickCheck 模块提供 prop 函数作为快捷方式。有了it ".." $ property $ ..
,最后一个例子可以写成:prop
describe "read" $ do
prop "is inverse to show" $
\x -> (read . show) x `shouldBe` (x :: Int)
但是,很少的文档并没有告诉您如何使用Generator。举例来说,您想要生成一个非负整数。您可以使用 NonNegative 修饰符来执行此操作,如下所示。
describe "splitAt" $ do
prop "splits empty list into two empty lists" $
\(NonNegative (n :: Int)) ->
splitAt n ([] :: [Integer]) `shouldBe` ([], [])
如果您想要两台发电机:
prop "splits any list -- any index" $
\(NonNegative (n :: Int)) (xs :: [Integer]) -> do
...
请注意,在 Lambda 表达式模式匹配中指定类型需要启用 ScopedTypeVariables 扩展。