tasty-discover: Test discovery for the tasty framework.

[ library, mit, program, testing ] [ Propose Tags ]

Automatic test discovery and runner for the tasty framework. Prefix your test case names and tasty-discover will discover, collect and run them. All popular test libraries are covered. Configure once and then just write your tests. Avoid forgetting to add test modules to your Cabal/Hpack files. Tasty ingredients are included along with various configuration options for different use cases. Please see the README.md below for how to get started.

[Skip to Readme]
Versions [faq] 1.0.0, 1.0.1, 1.1.0, 2.0.0, 2.0.1, 2.0.2, 2.0.3, 3.0.0, 3.0.1, 3.0.2, 4.0.0, 4.1.0, 4.1.1, 4.1.2, 4.1.3, 4.1.4, 4.1.5, 4.2.0, 4.2.1
Change log CHANGELOG.md
Dependencies base (>=4.8 && <5.0), containers (>=0.4 && <1.0), directory (>=1.1 && <2.0), filepath (>=1.3 && <2.0), Glob (>=0.8 && <1.0), tasty-discover [details]
License MIT
Copyright 2016 Luke Murphy
Author Luke Murphy
Maintainer Luke Murphy <lukewm@riseup.net>
Category Testing
Home page https://github.com/lwm/tasty-discover#readme
Bug tracker https://github.com/lwm/tasty-discover/issues
Source repo head: git clone https://github.com/lwm/tasty-discover
Uploaded by lwm at Tue Jan 2 09:02:19 UTC 2018
Distributions LTSHaskell:4.2.1, NixOS:4.2.1, Stackage:4.2.1
Executables tasty-discover
Downloads 4826 total (193 in the last 30 days)
Rating 2.0 (votes: 1) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2018-01-02 [all 1 reports]




Maintainer's Corner

For package maintainers and hackage trustees

Readme for tasty-discover-4.1.3

[back to package description]

Build Status tasty-discover-nightly tasty-discover-lts Hackage Status GitHub license


Automatic test discovery and runner for the tasty framework.

Getting Started

There's 4 simple steps:

  1. Create a test driver file in the test directory
  2. Mark the driver file as the main-is in the test suite
  3. Mark tests with the correct prefixes
  4. Customise test discovery as needed

Check out the example project to get moving quickly.

Create Test Driver File

You can name this file anything you want but it must contain the correct preprocessor definition for tasty-discover to run and also, to detect the configuration. It should be in the top level of the test directory.

For example (in test/Driver.hs):

{-# OPTIONS_GHC -F -pgmF tasty-discover #-}

Configure Cabal Test Suite

In order for Cabal/Stack to know where the tests are, you'll need to configure the main-is option of your test-suite to point to the driver file. In the following example, the test driver file is called Driver.hs:

test-suite test
  main-is: Driver.hs
  hs-source-dirs: tests
  build-depends: base

If you use hpack, that might look like:

    main: "Driver.hs"
    source-dirs: "test"
    - "base"

Write Tests

Create test modules and correctly prefix the tests with the name that corresponds to the testing library you wish to run the test with:

Here's an example test module:

{-# LANGUAGE ScopedTypeVariables #-}

module ExampleTest where

import Data.List
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.Hspec
import Test.Tasty.QuickCheck

-- HUnit test case
unit_listCompare :: IO ()
unit_listCompare = [1, 2, 3] `compare` [1,2] @?= GT

-- QuickCheck property
prop_additionCommutative :: Int -> Int -> Bool
prop_additionCommutative a b = a + b == b + a

-- SmallSheck property
scprop_sortReverse :: [Int] -> Bool
scprop_sortReverse list = sort list == sort (reverse list)

-- Hspec specification
spec_prelude :: Spec
spec_prelude = do
  describe "Prelude.head" $ do
    it "returns the first element of a list" $ do
      head [23 ..] `shouldBe` (23 :: Int)

-- Tasty TestTree
test_multiplication :: [TestTree]
test_multiplication = [testProperty "One is identity" $ \(a :: Int) -> a * 1 == a]

-- Tasty IO TestTree
test_generateTree :: IO TestTree
test_generateTree = do
  input <- pure "Some input"
  pure $ testCase input $ pure ()

-- Tasty IO [TestTree]
test_generateTrees :: IO [TestTree]
test_generateTrees = do
  inputs <- pure ["First input", "Second input"]
  pure $ map (\s -> testCase s $ pure ()) inputs

Customise Discovery

You configure tasty-discover by passing options to the test driver file.

No Arguments

Example: {-# OPTIONS_GHC -F -pgmF tasty-discover -optF --debug #-}

  • --debug: Output the contents of the generated module while testing.
  • --tree-display: Display the test output results hierarchically.

With Arguments

Example: {-# OPTIONS_GHC -F -pgmF tasty-discover -optF --modules="*CustomTest.hs" #-}

  • --modules: Which test modules to discover (with glob pattern).
  • --ignores: Which test modules to ignore (with glob pattern).
  • --generated-module: The name of the generated test module.
  • --ingredient: Tasty ingredients to add to your test runner.

It is also possible to override tasty arguments with -optF:

{-# OPTIONS_GHC -F -pgmF tasty-discover -optF --hide-successes #-}

Example Project

See the testing for this package for a fully configured example.

Change Log

Please see the CHANGELOG.md for the latest changes.

Deprecation Policy

If a breaking change is implemented, you'll see a major version increase, an entry in the change log and a compile time error with a deprecation warning and clear instructions on how to upgrade. Please do complain if we're doing this too much.


All contributions welcome!


If you're interested in helping maintain this package, please let @lwm know!


Thanks to hspec-discover and tasty-auto for making this possible.