hedgehog: Hedgehog will eat all your bugs.

[ bsd3, library, testing ] [ Propose Tags ] [ Report a vulnerability ]

Hedgehog is a modern property-based testing system, in the spirit of QuickCheck. Hedgehog uses integrated shrinking, so shrinks obey the invariants of generated values by construction.

To get started quickly, see the examples: https://github.com/hedgehogqa/haskell-hedgehog/tree/master/hedgehog-example


[Skip to Readme]

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.1, 0.2, 0.2.1, 0.2.2, 0.3, 0.4, 0.4.1, 0.5, 0.5.1, 0.5.2, 0.5.3, 0.6, 0.6.1, 1.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.1, 1.1.1, 1.1.2, 1.2, 1.3, 1.4, 1.5
Change log CHANGELOG.md
Dependencies ansi-terminal (>=0.6 && <0.9), async (>=2.0 && <2.3), base (>=3 && <5), bytestring (>=0.10 && <0.11), concurrent-output (>=1.7 && <1.11), containers (>=0.4 && <0.6), directory (>=1.2 && <1.4), exceptions (>=0.7 && <0.11), lifted-async (>=0.7 && <0.11), mmorph (>=1.0 && <1.2), monad-control (>=1.0 && <1.1), mtl (>=2.1 && <2.3), pretty-show (>=1.6 && <1.8), primitive (>=0.6 && <0.7), random (>=1.1 && <1.2), resourcet (>=1.1 && <1.3), semigroups (>=0.16 && <0.19), stm (>=2.4 && <2.5), template-haskell (>=2.10 && <2.14), text (>=1.1 && <1.3), th-lift (>=0.7 && <0.8), time (>=1.4 && <1.9), transformers (>=0.4 && <0.6), transformers-base (>=0.4 && <0.5), unix (>=2.6 && <2.8), wl-pprint-annotated (>=0.0 && <0.2) [details]
Tested with ghc ==7.10.2, ghc ==7.10.3, ghc ==8.0.1, ghc ==8.0.2, ghc ==8.2.1, ghc ==8.2.2, ghc ==8.4.1
License BSD-3-Clause
Author Jacob Stanley
Maintainer Jacob Stanley <jacob@stanley.io>
Revised Revision 1 made by JacobStanley at 2018-03-12T13:06:07Z
Category Testing
Home page https://hedgehog.qa
Bug tracker https://github.com/hedgehogqa/haskell-hedgehog/issues
Source repo head: git clone git://github.com/hedgehogqa/haskell-hedgehog.git
Uploaded by JacobStanley at 2018-03-12T12:52:44Z
Distributions Arch:1.2, Debian:1.0.3, LTSHaskell:1.4, NixOS:1.4, Stackage:1.5
Reverse Dependencies 62 direct, 101 indirect [details]
Downloads 46998 total (395 in the last 30 days)
Rating 2.75 (votes: 12) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2018-03-12 [all 1 reports]

Readme for hedgehog-0.5.3

[back to package description]

hedgehog Hackage Travis

Hedgehog will eat all your bugs.

Hedgehog is a modern property-based testing system, in the spirit of QuickCheck. Hedgehog uses integrated shrinking, so shrinks obey the invariants of generated values by construction.

Features

  • Integrated shrinking, shrinks obey invariants by construction.
  • Abstract state machine testing.
  • Generators allow monadic effects.
  • Range combinators for full control over the scope of generated numbers and collections.
  • Equality and roundtrip assertions show a diff instead of the two inequal values.
  • Template Haskell test runner which executes properties concurrently.

Example

The main module, Hedgehog, includes almost everything you need to get started writing property tests with Hedgehog.

It is designed to be used alongside Hedgehog.Gen and Hedgehog.Range which should be imported qualified. You also need to enable Template Haskell so the Hedgehog test runner can find your properties.

{-# LANGUAGE TemplateHaskell #-}

import           Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range

Once you have your imports set up, you can write a simple property:

prop_reverse :: Property
prop_reverse =
  property $ do
    xs <- forAll $ Gen.list (Range.linear 0 100) Gen.alpha
    reverse (reverse xs) === xs

And add the Template Haskell splice which will discover your properties:

tests :: IO Bool
tests =
  checkParallel $$(discover)

If you prefer to avoid macros, you can specify the group of properties to run manually instead:

{-# LANGUAGE OverloadedStrings #-}

tests :: IO Bool
tests =
  checkParallel $ Group "Test.Example" [
      ("prop_reverse", prop_reverse)
    ]

You can then load the module in GHCi, and run it:

λ tests
━━━ Test.Example ━━━
  ✓ prop_reverse passed 100 tests.