Giter Club home page Giter Club logo

fast-check's Introduction

fast-check logo

Property based testing framework for JavaScript/TypeScript

Build Status npm version monthly downloads

Coverage Status (unit tests) Package quality Snyk Package quality

PRs Welcome License Twitter

Getting started

Hands-on tutorial and definition of Property Based Testing: 🏁 see tutorial. Or directly try it online on our pre-configured CodeSandbox.

Property based testing frameworks check the truthfulness of properties. A property is a statement like: for all (x, y, ...) such that precondition(x, y, ...) holds predicate(x, y, ...) is true.

Install the module with: yarn add fast-check --dev or npm install fast-check --save-dev

Example of integration in mocha:

const fc = require('fast-check');

// Code under test
const contains = (text, pattern) => text.indexOf(pattern) >= 0;

// Properties
describe('properties', () => {
  // string text always contains itself
  it('should always contain itself', () => {
    fc.assert(fc.property(fc.string(), (text) => contains(text, text)));
  });
  // string a + b + c always contains b, whatever the values of a, b and c
  it('should always contain its substrings', () => {
    fc.assert(
      fc.property(fc.string(), fc.string(), fc.string(), (a, b, c) => {
        // Alternatively: no return statement and direct usage of expect or assert
        return contains(a + b + c, b);
      })
    );
  });
});

In case of failure, the test raises a red flag. Its output should help you to diagnose what went wrong in your implementation. Example with a failing implementation of contain:

1) should always contain its substrings
    Error: Property failed after 1 tests (seed: 1527422598337, path: 0:0): ["","",""]
    Shrunk 1 time(s)
    Got error: Property failed by returning false

    Hint: Enable verbose mode in order to have the list of all failing values encountered during the run

Integration with other test frameworks: ava, jasmine, jest, mocha and tape.

More examples: simple examples, fuzzing and against various algorithms.

Useful documentations:

Why should I migrate to fast-check?

fast-check has initially been designed in an attempt to cope with limitations I encountered while using other property based testing frameworks designed for JavaScript:

  • Types: strong and up-to-date types - thanks to TypeScript
  • Extendable: easy map method to derive existing arbitraries while keeping shrink [more] - some frameworks ask the user to provide both a->b and b->a mappings in order to keep a shrinker
  • Extendable: kind of flatMap-operation called chain [more] - able to bind the output of an arbitrary as input of another one while keeping the shrink working
  • Extendable: precondition checks with fc.pre(...) [more] - filtering invalid entries can be done directly inside the check function if needed
  • Smart: ability to shrink on fc.oneof [more] - surprisingly some frameworks don't
  • Smart: biased by default [more] - by default it generates both small and large values, making it easier to dig into counterexamples without having to tweak a size parameter manually
  • Debug: verbose mode [more] - easier troubleshooting with verbose mode enabled
  • Debug: replay directly on the minimal counterexample [more] - no need to replay the whole sequence, you get directly the counterexample
  • Debug: custom examples in addition of generated ones [more] - no need to duplicate the code to play the property on custom examples
  • Debug: logger per predicate run [more] - simplify your troubleshoot with fc.context and its logging feature
  • Unique: model based approach [more][article] - use the power of property based testing to test UI, APIs or state machines
  • Unique: detect race conditions in your code [more] - shuffle the way your promises and async calls resolve using the power of property based testing to detect races
  • Unique: simplify user definable corner cases [more] - simplify bug resolution by asking fast-check if it can find an even simpler corner case

For more details, refer to the documentation in the links above.

Trusted

fast-check has been trusted for years by big projects like: jest, jasmine, fp-ts, io-ts, ramda, js-yaml, query-string...

Powerful

It also proved useful in finding bugs among major open source projects such as jest, query-string... and many others.

Compatibility

Here are the minimal requirements to use fast-check properly without any polyfills:

fast-check node ECMAScript version TypeScript (optional)
3.x β‰₯8(1) ES2017 β‰₯4.1(2)
2.x β‰₯8(1) ES2017 β‰₯3.2(3)
1.x β‰₯0.12(1) ES3 β‰₯3.0(3)
More details...
  1. Except for features that cannot be polyfilled - such as bigint-related ones - all the capabilities of fast-check should be usable given you use at least the minimal recommended version of node associated to your major of fast-check.
  2. Require either lib or target β‰₯ ES2020 or @types/node to be installed.
  3. Require either lib or target β‰₯ ES2015 or @types/node to be installed.

ReScript bindings

Bindings to use fast-check in ReScript are available in package rescript-fast-check. They are maintained by @TheSpyder as an external project.

Contributors ✨

Thanks goes to these wonderful people (emoji key):


Nicolas DUBIEN

πŸ’» πŸ“– ⚠️ πŸš‡ 🎨 🚧

Aaron Elligsen

πŸ’» πŸ“– ⚠️

Will Heslam

πŸ“–

kazchimo

πŸ’» πŸ“–

Brandon Chinn

πŸ’» πŸ“–

Irakli Safareli

πŸ“–

Andrew Herron

πŸ“– πŸ”Œ

Eric Crosson

πŸ“–

burrscurr

πŸ“–

JC (Jonathan Chen)

πŸ“–

Larry Botha

πŸ“– πŸ’» ⚠️

Roman Gusev

πŸ“–

Tim Wisniewski

πŸ“–

Brais PiΓ±eiro

πŸ’» ⚠️

Renaud-Pierre Bordes

🎨

Jemma Nelson

πŸ“–

John Haugeland

πŸ“–

Trey Davis

🎨

Leon Si

πŸ“–

Gorgi Kosev

πŸš‡

mayconsacht

πŸ’»

Simon Friis Vindum

πŸ’» ⚠️

Richard Gibson

πŸ“–

Alan Harper

πŸ“–

Makien Osman

πŸ’»

David Sommerich

πŸ’» ⚠️

Diego Pedro

πŸ’» ⚠️

Borui Gu

πŸ“–

Brian Donovan

πŸ“–

volrk

πŸ’» πŸ“– ⚠️

tinydylan

πŸ’» ⚠️

Caleb Jasik

πŸ“–

Rulai Hu

πŸ“–

Afonso Jorge Ramos

πŸ“–

Tom Jenkinson

πŸ“–

phormio

πŸ“–

Giovanni Gonzaga

πŸ’» ⚠️

Tomas Carnecky

πŸ’»

Kirill Romanov

πŸ’» πŸ“– ⚠️

Giovanny GonzΓ‘lez

πŸ“–

Mark Kulube

πŸš‡

Peter Hamilton

πŸ’»

Chinedu Ozodi

πŸ“–

Gunar Gessner

πŸ“–

Christian Batchelor

⚠️

Tomer Aberbach

πŸ’»

0xflotus

πŸ“–

This project follows the all-contributors specification. Contributions of any kind welcome! Become one of them

Backers

Thank you to all our backers! πŸ™ [Become a backer] and help us sustain our community.

Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]

fast-check's People

Contributors

dubzzz avatar dependabot[bot] avatar hath995 avatar renovate[bot] avatar github-actions[bot] avatar willheslam avatar kazchimo avatar brandon-leapyear avatar ericcrosson avatar safareli avatar thespyder avatar 0xflotus avatar makeeno avatar hamiltop avatar trollepierre avatar brds avatar gibson042 avatar 102 avatar rulai-hu avatar timwis avatar tjenkinson avatar werehamster avatar tomeraberbach avatar treydavis avatar burrscurr avatar markkulube avatar mayconsacht avatar paldepind avatar phormio avatar tinydylan avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.