如何在Hspec测试中使用QuickCheck?

问题描述 投票:0回答:2

我使用

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 -- <== ?
haskell tdd cabal quickcheck property-testing
2个回答
9
投票

您想要property功能,请参阅这里

示例:

spec :: Spec
spec = do
    describe "myTest" $ do
        it "Something something" $
            property prop_myTest

0
投票

来自 Hspec 文档

您可以将任意 QuickCheck 属性与 Hspec 一起使用,但它们必须是 Property 类型。 QuickCheck 的 property 函数可用于将 Testable 类的任何成员转换为 Property。这是一个例子:

describe "read" $ do
  it "is inverse to show" $ property $
    \x -> (read . show) x `shouldBe` (x :: Int)

it ".." $ property $ ..
是一种常见的模式。 Test.Hspec.QuickCheck 模块提供 prop 函数作为快捷方式。有了
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 扩展。

© www.soinside.com 2019 - 2024. All rights reserved.