Fact-checked by Grok 2 weeks ago

QuickCheck

QuickCheck is a software library for the Haskell programming language that facilitates property-based testing by allowing developers to express program specifications as executable properties, which are then automatically verified using randomly generated test inputs. Developed by Koen Claessen and John Hughes at Chalmers University of Technology, it was first introduced in 2000 as a lightweight tool consisting of a single Haskell module of approximately 300 lines, compatible with the Hugs interpreter. The library generates test data based on user-defined generators, typically running 100 tests by default, and reports successes or provides minimal counterexamples by shrinking failing inputs to isolate bugs efficiently. Key features of QuickCheck include support for conditional properties, observation of test data distributions to ensure coverage, and integration with monadic testing for handling stateful code. As of October 2025, the latest version is 2.17.1.0, maintained by Nick Smallbone, with enhancements like support enabled by default and companion packages for additional instances. Users define properties using combinators in the Test.QuickCheck module, such as prop_reverse :: [Int] -> Bool to check if reversing a list twice yields the original, which QuickCheck tests automatically. QuickCheck has significantly influenced software testing practices, inspiring numerous ports and reimplementations in various languages, including (ScalaCheck), (Hypothesis), and (Core QuickCheck), extending property-based testing to mainstream industrial applications at companies like , , and Jane Street. These adaptations have demonstrated PBT's ability to uncover edge-case bugs missed by traditional unit tests, with studies showing increased developer confidence and utility in and .

History

Development

QuickCheck was developed by Koen Claessen and John Hughes at in as a tool to automate the testing of programs. The initial motivation arose from the limitations of manual example-based testing in , where developers often spent significant time crafting test cases despite the benefits of strong type systems. Claessen and Hughes sought to address this by creating a system that generates random inputs to verify user-defined properties of programs, thereby reducing testing effort while increasing coverage and reliability. This approach emerged from broader research on and automated testing during the late 1990s, with the first implementation completed around 1999. The tool was formally introduced in the seminal paper "QuickCheck: A Lightweight Tool for Random Testing of Haskell Programs," presented by Claessen and Hughes at the 2000 International Conference on Functional Programming (ICFP) in Montreal, Canada. This work established QuickCheck as a lightweight library integrated into Haskell, emphasizing simplicity and ease of use for property-based testing. In 2006, John Hughes founded QuviQ AB, a company based in Gothenburg, Sweden, to commercialize QuickCheck and extend its applications beyond academia, including adaptations for industrial tools like state machine testing in Erlang.

Key Milestones

QuickCheck was initially released in 1999 as an open-source library under a BSD-3-Clause license. Key stable releases have marked significant advancements in the library's capabilities, including in 2002, which introduced advanced shrinking mechanisms for minimization. Subsequent updates have continued to enhance and functionality, such as in 2020 with major improvements to generator efficiency for faster test data production, in 2023 adding combinators like witness and exception assertions, and released on October 13, 2025, featuring new Arbitrary instances, reduced memory usage for floating-point generation, and support for recent GHC versions. In recognition of its impact, the foundational 2000 paper by Koen Claessen and John Hughes, "QuickCheck: A Lightweight Tool for Random Testing of Haskell Programs," received the ACM SIGPLAN Most Influential ICFP Paper Award in 2010. Commercial extensions have expanded QuickCheck's reach, including the development of QuickCheck Mini by QuviQ as a , freely available version offering core features comparable to the original implementation. QuviQ also integrated QuickCheck principles into its Erlang toolset, influencing property-based testing frameworks like PropEr for . Community adoption has grown substantially, with seamless integration into , Haskell's central package archive, facilitating widespread use in development workflows. By 2025, the original QuickCheck paper had garnered over 2,200 citations in academic literature, underscoring its enduring influence on property-based testing methodologies.

Core Concepts

Property-Based Testing

Property-based testing is a paradigm where developers specify abstract that their code must satisfy for arbitrary inputs, rather than enumerating concrete examples. These are expressed as or executable specifications, often in the form of that return true if the property holds and false otherwise. For instance, a property for reversal might assert that applying the reverse function twice yields the original : reverse(reverse xs) == xs. QuickCheck automates the verification of such by generating and applying random test inputs, checking whether the predicate holds across a large sample of cases. This approach contrasts sharply with traditional , which relies on manually selected, fixed input-output pairs to validate specific behaviors. Unit tests provide targeted verification but often miss cases or interactions due to their limited , whereas property-based testing employs random to produce thousands of varied inputs, achieving broader coverage and systematically exploring the input space. This randomness helps detect subtle that evade hand-picked examples, as the generated tests can uncover failures in unexpected scenarios. The benefits of property-based testing include its ability to reveal unanticipated defects by stressing code against diverse conditions, promoting a focused on invariants and mathematical correctness rather than implementation details, and enabling confident refactoring since serve as enduring checks independent of code changes. By treating as lightweight formal , this method bridges testing and , assuming basic knowledge of the host (such as Haskell's functional style) to define these predicates effectively. QuickCheck pioneered this paradigm in , embedding it directly into to facilitate automatic property checking and influencing rigorous testing practices within the language's ecosystem.

Generators and Test Data

In QuickCheck, generators are responsible for producing random test inputs to facilitate property-based testing. The core mechanism revolves around the Arbitrary typeclass, which requires implementing the arbitrary :: Gen a method to define how random values of type a are generated. This class leverages the Gen monad, a computational monad that encapsulates randomness by taking a size parameter and a random seed to yield values, enabling composable and controllable generation processes. Built-in generators are provided for fundamental types, ensuring broad coverage without user intervention. For primitive types like Int and Char, generation uses range selection, such as choose (-n, n) for integers bounded by the size parameter n to produce small values initially. Composite structures like and are handled recursively: employ frequency-based length distribution to favor shorter ones, while use sized to limit depth and prevent generation. These instances promote controlled complexity, starting with simple cases and scaling up. Users can define custom generators within the Gen monad to tailor test data for domain-specific types, often combining built-in combinators for precision. Key combinators include choose (low, high) for uniform random selection within bounds, elements xs for uniform picks from a finite list, and frequency [(weight1, gen1), ...] for weighted distributions that bias toward certain outcomes. For instance, a custom list generator might use frequency to create [Int] with an average length of 4:
haskell
genList :: Gen [Int]  
genList = frequency [(1, return []), (4, liftM2 (:) arbitrary (genList))]  
This approach allows weighted recursion while respecting size limits. The sizing parameter, an integer passed to Gen computations via the sized combinator, plays a crucial role in managing generation complexity. It ensures recursive structures like trees begin with small sizes (e.g., leaves) and grow gradually, avoiding infinite loops by dividing the size among subcomponents. For balanced binary trees, a generator might define:
haskell
instance Arbitrary a => Arbitrary (Tree a) where  
    arbitrary = sized arbTree  
    where arbTree 0 = liftM Leaf arbitrary  
          arbTree n = frequency [(1, liftM Leaf arbitrary),  
                                 (4, liftM3 Branch arbitrary (arbTree (n `div` 2)) (arbTree (n `div` 2)))]  
Additional utilities like oneof [gen1, gen2, ...] (equivalent to uniform frequency) produce exactly one value from alternatives, while vectorOf n gen generates fixed-length lists of n elements from a base generator, aiding in targeted testing scenarios.

Functionality

Defining Properties

In QuickCheck for , properties are defined as functions that take inputs of specified types and return a Bool indicating whether the property holds, leveraging the Testable typeclass to enable automatic testing. These functions can be simple pure expressions or more complex ones using QuickCheck combinators for labeling, classification, or conditioning. For instance, to verify that reversing a list twice returns the original, one defines:
haskell
prop_reverse :: [Int] -> Bool
prop_reverse xs = reverse (reverse xs) == xs
This uses QuickCheck's implicit generation of arbitrary list inputs via the Arbitrary instance for [Int]. To execute a , the quickCheck function is invoked, which generates and tests 100 random inputs by default, printing "OK, passed 100 tests" if all succeed or a minimal if any fail. For detailed logging of each , including generated inputs and outcomes, verboseCheck provides more output while using the same default parameters. rely on random from generators defined through the Arbitrary , allowing coverage without . Testing behavior can be customized via the Args configuration passed to quickCheckWith, adjusting parameters like maxSuccess (number of tests required to pass, default 100) or maxDiscardRatio (maximum ratio of discarded tests due to preconditions before failure, default 500). An example increasing the test count is:
haskell
quickCheckWith stdArgs { maxSuccess = 1000 } prop_reverse
This ensures rigorous verification while handling cases where many generated inputs are invalid for the . For monadic properties involving side effects, such as operations, QuickCheck uses the monadicIO combinator to sequence actions and assertions within a Property. Explicit control over test data is achieved with forAll, which applies a to produce inputs for a sub-property; for example:
haskell
prop_monadic :: [Property](/page/Property)
prop_monadic = monadicIO $ do
  x <- run someIOAction
  assert (propertyHolds x)
or, with a custom :
haskell
prop_forall :: [Gen](/page/Gen) [Int] -> [Property](/page/Property)
prop_forall gen = forAll gen (\xs -> reverse xs == expected xs)
These combinators integrate seamlessly with pure , enabling tests for stateful or external-interacting code. Since 2.15, the witness modifier allows attaching structured information to counterexamples for improved . QuickCheck supports integration with HUnit for combining property-based tests with traditional unit tests, using the Test.QuickCheck module to convert properties into HUnit-compatible Test cases via functions like those in supporting frameworks such as test-framework-quickcheck. This allows unified execution in test suites, e.g., runTestTT (testProperty "reverse [identity](/page/Identity)" prop_reverse).

Shrinking and Minimization

In QuickCheck, when a generated test case causes a property to fail, the framework initiates a shrinking process to simplify the counterexample, producing a smaller input that still violates the property while aiding debugging. This minimization reduces the complexity of the failing input, such as shortening lists or reducing numerical values, to isolate the root cause of the bug more effectively. The process iteratively applies a user-defined shrinking function until no further simplification preserves the failure, often yielding concise counterexamples like single-element lists or small integers. The core of shrinking lies in the shrink method of the Arbitrary type class, defined as shrink :: a -> [a], which generates a finite list of potentially simpler values derived from the original input. For primitive types, QuickCheck provides built-in shrinkers; for example, shrinkIntegral for integers repeatedly halves the toward zero (e.g., shrinking 100 to [50, -100], then 50 to [25, -50]), while shrinkList for lists produces sublists by removing elements, shortening length, or shrinking individual components. Users must implement shrink in custom Arbitrary instances for complex data types, often using combinators like genericShrink to recursively apply shrinking to subterms, ensuring termination by avoiding cycles (e.g., for trees, shrinking to subtrees or leaves). Poorly designed shrinkers can lead to inefficient searches or suboptimal minimizations, so tailoring them to the data's structure—such as prioritizing removals in permutations—is recommended. Since version 2.15, withMaxShrinks allows configuring the maximum number of shrinking steps. QuickCheck's shrinking draws inspiration from delta debugging algorithms, which systematically eliminate parts of an input to isolate minimal failure causes, as introduced by Zeller and Hildebrandt. This approach enables QuickCheck to reduce complex counterexamples to their essence, frequently distilling failures to 1-2 key elements that pinpoint issues like off-by-one errors or boundary conditions. For instance, a failing test on a long list might shrink to a minimal pair demonstrating the property violation, mirroring delta debugging's granularity in test case reduction. For stateful or dependent scenarios, such as testing functional equivalences or permutations, QuickCheck employs the CoArbitrary class alongside Arbitrary to support shrinking of functions and sequences. CoArbitrary a provides a coarbitrary :: a -> Gen b -> Gen b method that perturbs a generator based on input values, enabling the framework to shrink function applications or state transitions while maintaining dependencies (e.g., shrinking arguments in a permuted sequence to reveal equivalence breaks). This facilitates coordinated minimization in properties involving higher-order functions, where standard shrinking alone might overlook interdependencies. Despite its effectiveness, QuickCheck's shrinking has limitations, particularly for intricate types lacking custom shrinkers, where it may settle on non-minimal counterexamples or fail to converge quickly due to exhaustive search over shrink lists. Generic shrinkers can introduce overhead or infinite loops if not bounded, and for deeply nested structures, users often need domain-specific implementations to achieve truly minimal cases. These constraints highlight the importance of thoughtful Arbitrary instances to balance generation and minimization.

Implementations

Haskell Version

QuickCheck originated as a Haskell library for property-based testing and remains its primary implementation. The is hosted on Hackage and maintained on under the repository nick8325/quickcheck by Nick Smallbone. It supports the (GHC) from version 8.10 up to 9.12 and is also compatible with the older Hugs Haskell implementation via a provided make-hugs script. As of November 2025, the latest release is version 2.17.1.0, dated October 13, 2025, which includes optimizations for reduced memory usage in arbitrary generators for Double and Float types, as well as added support for the microHS compiler. Recent versions since 2.14.8 have introduced combinators like withMaxSize and withMaxDiscardRatio for finer control over test execution, along with monoids such as Every and Some for composing predicates. The library has long supported parallel testing through the Test.QuickCheck.Parallel module, enabling concurrent execution of property checks across threads, and improved Unicode handling in random string and character generators since version 2.10. QuickCheck depends on core packages including base (≥4.14 && <5), deepseq (≥1.1.0.0), random (≥1.0.0.3 && <1.4), splitmix (≥0.1.0.2 && <0.2), containers, transformers (≥0.3), and template-haskell (≥2.4), with additional reliance on data-array-byte for efficient array operations. Installation is straightforward using Haskell's standard build tools: via Cabal with cabal install QuickCheck or through Stack by adding it to a project's package.yaml or cabal file. Notable variants extend QuickCheck's core functionality for specialized use cases. The quickcheck-state-machine library builds on QuickCheck to enable testing of stateful programs by modeling them as state machines, generating sequences of actions and verifying postconditions against a model. QuickCheck-GenT provides a GenT monad transformer, allowing generators to be composed within other monads for more modular and effectful test data production. Within the broader Haskell ecosystem, QuickCheck is commonly integrated into testing frameworks for comprehensive suites. The tasty-quickcheck package allows QuickCheck properties to be run alongside other test types in the Tasty framework, supporting features like test grouping, reporting, and parallel execution at the framework level.

Ports to Other Languages

QuickCheck's core ideas of property-based testing have inspired numerous re-implementations and adaptations across programming languages, with over 57 documented ports by 2025. These ports extend the framework's random test generation and shrinking capabilities to diverse ecosystems, enabling developers to verify properties in languages outside Haskell. Prominent examples include for Scala, Hypothesis for Python, JUnit-QuickCheck for Java, and proptest for Rust. Among key adaptations, Clojure's test.check employs generator-based testing similar to QuickCheck, allowing users to define properties and generate structured data for validation in functional Lisp code. Elixir's Quixir draws direct inspiration from the original QuickCheck, providing property-based testing with generators tailored for concurrent and distributed systems typical in the Elixir/OTP environment. For lower-level languages, quickcheck4c brings QuickCheck-style testing to C, focusing on embedded systems where lightweight random generation and minimal dependencies are essential. Ports vary in their fidelity to QuickCheck's design. Some, like ScalaCheck, preserve Haskell-like combinators for composing generators and properties, facilitating a seamless transition for users familiar with functional paradigms. Others adapt to object-oriented paradigms, such as Java's JUnit-QuickCheck, which uses annotations for parameterization and integrates with JUnit's test runner for easier adoption in enterprise Java projects. The evolution of these ports began in the early 2000s with adaptations like for Erlang, which extended property testing to concurrent telecom software around 2006. Modern implementations include , an enumerative variant for small-scale exhaustive testing in Haskell-influenced environments, and for C++, which incorporates advanced shrinking to minimize counterexamples efficiently. Challenges in porting QuickCheck often arise from language differences, leading developers to simplify shrinking mechanisms in non-functional languages to avoid complex type inference issues. Many ports also introduce type-specific generators to handle statically typed or imperative constructs, ensuring compatibility while maintaining the tool's emphasis on discovering edge cases through random inputs.

Applications

Software Testing

QuickCheck plays a central role in software testing by automating the generation of diverse inputs to uncover bugs that might escape traditional example-based unit tests. Unlike manual test case selection, which often focuses on nominal scenarios, QuickCheck produces random data across a wide range of possibilities, revealing off-nominal behaviors such as edge cases or unexpected interactions. For instance, when testing a sorting algorithm, QuickCheck can generate lists of varying sizes and compositions to verify properties like sorted output and preservation of elements, ensuring robustness beyond small, hand-picked inputs. This approach has proven effective in detecting subtle errors in functional code, as demonstrated in early applications to arithmetic circuits where random testing identified issues missed by deterministic methods. In software development workflows, QuickCheck integrates seamlessly into continuous integration and continuous deployment (CI/CD) pipelines, enabling automated property checks on every code change. Haskell projects commonly include QuickCheck tests in their build configurations, running them alongside unit tests to catch regressions early; for example, the test-framework package facilitates combining QuickCheck properties with other testing paradigms for comprehensive CI reporting. Open-source Haskell libraries, such as those in the , leverage QuickCheck in their test suites to maintain data structure integrity, with CI systems like executing these tests to validate contributions. This integration promotes reliable releases by providing immediate feedback on property violations during development cycles. A notable case study involves John Hughes' work at Quviq, where QuickCheck was applied to test telecom software implementations, including the Megaco protocol at Ericsson. In this effort, Quviq QuickCheck—an extension for stateful systems—uncovered faults in protocol handling that prior testing techniques overlooked, such as discrepancies in message processing and specification ambiguities, leading to promising results that prompted broader adoption in product development. The tool's ability to model state machines and generate sequences of commands efficiently reduced debugging time, with similar applications at Quviq identifying over 200 problems, including well over 100 ambiguities in the AUTOSAR standard, in a 1-million-line C codebase for automotive systems, highlighting its impact on complex, real-world software. More recently, as of 2025, QuickCheck and its extensions like quickcheck-dynamic have been employed by Input Output Global (IOG) in testing the Cardano blockchain, enabling model-based testing of stateful components in distributed systems. Best practices for using QuickCheck in software testing emphasize beginning with straightforward properties to build confidence in the testing setup before tackling more intricate ones. Developers should define initial properties as simple Boolean functions, such as checking idempotence or associativity, and gradually refine them based on observed failures. When a counterexample arises, QuickCheck's shrinking mechanism automatically minimizes it to a smaller, simpler input, aiding diagnosis and iteration; for example, a failing test on a large list might shrink to a minimal pair of elements, revealing the core issue. This iterative process, supported by tools like verbose output for seed values, ensures properties evolve alongside the codebase for effective bug prevention. Despite its strengths, QuickCheck has limitations in certain testing domains, making it less suitable for performance evaluation. For performance testing, QuickCheck's fixed time budgets—typically 50 milliseconds to 30 seconds per test—may overlook latency issues or scalability problems in resource-intensive scenarios. As a result, it best complements traditional unit tests by focusing on logical correctness rather than exhaustive coverage of non-functional aspects.

Specification and Verification

QuickCheck facilitates the definition of executable specifications through properties expressed as Haskell functions, which serve as lightweight formal assertions about program behavior. These properties can be automatically tested against randomly generated inputs, providing a practical means to verify that implementations adhere to intended specifications without requiring full formal proofs. For instance, in Haskell's IO , properties can test monadic laws such as left identity (return a >>= f ≡ f a) and associativity (m >>= (\x -> f x >>= g) ≡ (m >>= f) >>= g) by generating random monadic actions and comparing their outcomes in observational contexts. This approach extends to other monads like the ST monad for stateful computations, where algebraic laws are verified by embedding operations in random sequences and checking equivalence of observable results. In compiler testing, has been employed to verify optimizations in the (GHC) by generating random well-typed lambda terms and checking behavioral between unoptimized and optimized code. This differential testing approach involves compiling generated programs with varying optimization flags (e.g., -O versus -O0) and comparing their outputs or orders, which uncovered bugs such as incorrect strictness analysis and evaluation order violations. For example, properties testing the of let expressions and their inlined forms revealed issues like those reported in GHC tickets 5557 and 5587, with QuickCheck's reducing complex counterexamples to minimal reproducers. Such methods ensure compiler transformations preserve semantics, establishing QuickCheck's role in maintaining correctness for large-scale software . QuickCheck supports through extensions like the state machine framework, which simulates state transitions against an abstract model to verify concrete implementations. In this paradigm, users define a state machine model specifying preconditions, actions, and postconditions for calls, with QuickCheck generating random sequences of valid actions and checking if the real system's state matches the model's after each step. For example, testing a implementation involves modeling states as lists of , with operations like put and get defined to or remove , respectively; postconditions ensure the front element is correctly returned, while shrinking minimizes failing sequences to isolate like incorrect size calculations due to overflow. This technique has been applied industrially, such as in testing C code for automotive systems at , where it identified over 200 problems, including well over 100 ambiguities in the standard, across 1 million lines of code. In academic settings, QuickCheck integrates with theorem proving assistants to verify data structure invariants, enhancing exploratory proof development. For red-black trees, properties asserting balanced heights and color constraints (e.g., no two red nodes adjacent, equal black-height paths from root to leaves) can be tested via random insertions and deletions, with counterexamples guiding formal proofs. In Isabelle/HOL, an extension of QuickCheck employs narrowing-based generators to symbolically refine test data, efficiently finding counterexamples in faulty implementations—such as 26 cases in 30 seconds for invalid deletions—while smart generators consider premises like is-rbt t to prune invalid inputs. This combination of random testing and proof checking supports verification of complex structures like AVL trees alongside red-black trees. Extensions of QuickCheck further enable certified properties by integrating with proof assistants like Agda, where testing aids in debugging specifications before . In Agda/Alfa, a modified QuickCheck generates test data within the dependent type system, proving generator properties such as totality and surjectivity to ensure comprehensive coverage. This allows testing subgoals during interactive proof construction, such as verifying invariants, and combines empirical finding with eventual machine-checked proofs for enhanced reliability.

References

  1. [1]
    QuickCheck: a lightweight tool for random testing of Haskell programs
    Quick Check is a tool which aids the Haskell programmer in formulating and testing properties of programs. Properties are described as Haskell functions, ...
  2. [2]
    [PDF] A Lightweight Tool for Random Testing of Haskell Programs
    In this paper we describe a tool, QuickCheck, which we have developed for testing Haskell programs. Functional programs are well suited to automatic testing. It ...
  3. [3]
    QuickCheck: Automatic testing of Haskell programs - Hackage
    Oct 13, 2025 · QuickCheck is a library for random testing of program properties. The programmer provides a specification of the program, in the form of properties which ...
  4. [4]
    Property-Based Testing in Practice - ACM Digital Library
    Apr 12, 2024 · From its roots in the QuickCheck library in Haskell, PBT has made significant inroads in mainstream languages and industrial practice at ...Abstract · Information & Contributors · Cited ByMissing: influence ports
  5. [5]
    [PDF] Property-Based Testing in Practice - Andrew Head
    From its roots in the QuickCheck library in Haskell, PBT has made significant inroads in mainstream languages and industrial practice at companies such as ...Missing: influence | Show results with:influence<|control11|><|separator|>
  6. [6]
    About - QuviQ
    John Hughes, CEO​​ He invented QuickCheck together with Koen Claessen in 2000, recently earning an ACM SIGPLAN award for the work. Since then John has focussed ...
  7. [7]
    [PDF] Experiences with QuickCheck: Testing the Hard Stuff and Staying ...
    In 2006 I co-founded Quviq, to develop and market an Erlang version, which we have since applied for a wide variety of customers, encountering many fascinating ...
  8. [8]
    [PDF] A History of Haskell: Being Lazy With Class - Microsoft
    Apr 16, 2007 · The first edition of the Haskell Report was published on April 1,. 1990. It was mostly an accident that it appeared on April Fool's. Day—a date ...
  9. [9]
    Changelog for QuickCheck-2.17.1.0 | Hackage
    ### Key Version Releases and Dates
  10. [10]
    Most Influential ICFP Paper Award - SIGPLAN
    2010 Koen Claessen and John Hughes. (for 2000) Quickcheck: a lightweight tool for random testing of Haskell programs. Citation: This paper presented a very ...
  11. [11]
    Downloads - QuickCheck - QuviQ
    QuickCheck Mini. You can download a free version of QuickCheck with unrestricted use, that offers a feature subset comparable to Haskell QuickCheck. QuickCheck ...Missing: lightweight | Show results with:lightweight
  12. [12]
    PropEr: a QuickCheck-inspired property-based testing tool for Erlang
    PropEr's notation and output format has been kept quite similar to that of QuviQ's QuickCheck in order to ease the reuse of existing testing code written for ...
  13. [13]
    ‪Koen Claessen‬ - ‪Google Scholar‬
    QuickCheck: a lightweight tool for random testing of Haskell programs. K Claessen, J Hughes. International Conference on Functional Programming, 2000. 2213* ...
  14. [14]
    Test.QuickCheck.Arbitrary - Hackage
    QuickCheck provides Arbitrary instances for most types in base, except those which incur extra dependencies. For a wider range of Arbitrary instances see the ...
  15. [15]
    Test.QuickCheck
    Summary of each segment:
  16. [16]
    [PDF] Simplifying and Isolating Failure-Inducing Input
    Delta Debugging is fully automatic: whenever some regression test fails, an additional Delta Debugging run auto- matically determines the failure-inducing ...
  17. [17]
    nick8325/quickcheck: Automatic testing of Haskell programs. - GitHub
    This is QuickCheck 2, a library for random testing of program properties. Add `QuickCheck` to your package dependencies to use it in tests or REPL.
  18. [18]
    Changelog for QuickCheck-2.17.1.0 | Hackage
    ### Summary of QuickCheck Versions After 2.14.8 (as of 2025)
  19. [19]
  20. [20]
    quickcheck-state-machine: Test monadic programs using ... - Hackage
    Jul 17, 2025 · quickcheck-state-machine is a Haskell library, based on QuickCheck, for testing stateful programs. The library is different from the Test.Missing: integration | Show results with:integration
  21. [21]
    A GenT monad transformer for QuickCheck library. - Hackage
    Dec 22, 2024 · QuickCheck-GenT: A GenT monad transformer for QuickCheck library. · Modules · Downloads.
  22. [22]
    QuickCheck support for the Tasty test framework. - Hackage
    The tasty-quickcheck package provides QuickCheck support for the Tasty test framework.
  23. [23]
    The sad state of property-based testing libraries - Stevan's notes
    Jul 2, 2024 · In fact, the Wikipedia page of the original property-basted testing Haskell library, QuickCheck, lists 57 reimplementations in other languages.
  24. [24]
    ScalaCheck
    ScalaCheck is a Scala library for automated property-based testing of Scala or Java programs, inspired by Haskell's QuickCheck.
  25. [25]
    pholser/junit-quickcheck: Property-based testing, JUnit-style - GitHub
    junit-quickcheck is a library that supports writing and running property-based tests in JUnit, inspired by QuickCheck for Haskell.
  26. [26]
    proptest-rs/proptest: Hypothesis-like property testing for Rust - GitHub
    Jun 17, 2017 · Proptest is a property testing framework (i.e., the QuickCheck family) inspired by the Hypothesis framework for Python.
  27. [27]
    clojure/test.check: QuickCheck for Clojure - GitHub
    test.check is a Clojure property-based testing tool inspired by QuickCheck. The core idea of test.check is that instead of enumerating expected input and ...
  28. [28]
    quixir v0.9.3 - Hexdocs
    Quixir: Pure Elixir Property-based Testing Build Status. Property-based testing is a technique for testing your code by considering general properties of the ...Missing: QuickCheck | Show results with:QuickCheck
  29. [29]
    nivox/quickcheck4c: Property based testing framework ... - GitHub
    Nov 3, 2021 · Quickcheck4c is a property based testing framework inspired at QuickCheck. The main goal of the project is to provide a convenient enough API without the need ...
  30. [30]
    typelevel/scalacheck: Property-based testing for Scala - GitHub
    ScalaCheck is a library written in Scala and used for automated property-based testing of Scala or Java programs. ScalaCheck was originally inspired by the ...
  31. [31]
    junit-quickcheck: Property-based testing, JUnit-style
    Nov 21, 2020 · junit-quickcheck is a library that supports writing and running property-based tests in JUnit, inspired by QuickCheck for Haskell.
  32. [32]
    leancheck: Enumerative property-based testing - Hackage - Haskell
    Aug 7, 2025 · LeanCheck is a simple enumerative property-based testing library that applies enumerated argument values to properties to find counterexamples.Missing: port | Show results with:port
  33. [33]
    emil-e/rapidcheck: QuickCheck clone for C++ with the goal ... - GitHub
    RapidCheck is a C++ framework for property based testing inspired by QuickCheck and other similar frameworks. In property based testing, you state facts ...
  34. [34]
    QuickCheck in Every Language - Hypothesis
    There are a lot of ports of QuickCheck, the original property based testing library, to a variety of different languages. Some of them are good.
  35. [35]
    Proptest vs Quickcheck
    The one big difference is that QuickCheck generates and shrinks values based on type alone, whereas Proptest uses explicit Strategy objects. The QuickCheck ...
  36. [36]
    Testing telecoms software with quviq QuickCheck
    We present a case study in which a novel testing tool, Quviq QuickCheck, is used to test an industrial implementation of the Megaco protocol.Missing: port | Show results with:port
  37. [37]
    Test.QuickCheck - Hackage
    QuickCheck-2.17.1.0: Automatic testing of Haskell programs. Quick Jump ... The QuickCheck manual gives detailed information about using QuickCheck effectively.<|separator|>
  38. [38]
    None
    ### Summary: How QuickCheck Tests Monadic Code, Especially Laws
  39. [39]
    [PDF] Testing an Optimising Compiler by Generating Random Lambda ...
    We implemented our random simply-typed term generator in QuickCheck using these basic gener- ators and performed testing of the GHC compiler using properties.
  40. [40]
    [PDF] The New Quickcheck for Isabelle - l'IRISA
    With the 10 versions, this yields 20 tests each for 2-3 and AVL trees, and 30 tests for red-black trees, on which we apply various counterexample generators. In ...
  41. [41]
    Combining Testing and Proving in Dependent Type Theory
    In Section 4 we extend Agda/Alfa with a QuickCheck-like tool. In Section ... Combining Testing and Proving in Dependent Type Theory. 191 data BT = Empty ...