Skip to content
Property based testing framework for JavaScript (like QuickCheck) written in TypeScript
TypeScript JavaScript
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.codesandbox 👷 Configure CodeSandbox CI (#481) Nov 13, 2019
.github Create Idea.md Aug 20, 2019
documentation ✏️ Fully revamp example/ directory for a better CodeSandbox showcase (#… Nov 5, 2019
example 🐛 Fix example/003-misc/roman for CodeSandbox (#476) Nov 12, 2019
logo Polish logo (#353) May 7, 2019
perf Migrate from tslint to eslint (#440) Oct 8, 2019
prebuild Reduce size of the generated property d.ts Mar 15, 2019
src 🚨 Enable no-unused-vars eslint rule (#474) Nov 7, 2019
test Add tests for typings based on tsd (#464) Nov 6, 2019
.eslintignore 🚨 Enable no-unused-vars eslint rule (#474) Nov 7, 2019
.eslintrc.js 🚨 Enable no-unused-vars eslint rule (#474) Nov 7, 2019
.gitignore Add deoptimization flags on 'npm run profile' Oct 10, 2018
.npmignore Enable incremental tsc build (#366) May 16, 2019
.prettierignore Mutually recursive arbitrary builder (#377) Jun 20, 2019
.prettierrc Add prettier configuration Mar 31, 2018
.travis.yml Add tests for typings based on tsd (#464) Nov 6, 2019
CHANGELOG.md Update CHANGELOG.md Oct 24, 2019
CONTRIBUTING.md 🔧 Moving away from npm, switching to yarn (#449) Oct 31, 2019
LICENSE Initial commit Oct 30, 2017
README.md ✏️ Fully revamp example/ directory for a better CodeSandbox showcase (#… Nov 5, 2019
api-extractor.json Documentation site with docsify (#343) Apr 15, 2019
buildTypes.js Publish typings by ts version (for bigint case) Jan 3, 2019
jest.config.js Bump npm dependencies Mar 7, 2019
jest.e2e.config.js Add no regression snapshot tests (#349) May 1, 2019
jest.setup.js Move to jest Dec 19, 2018
jest.unit.config.js Adapt Jest configuration for Node 6 Feb 22, 2019
package.json Add tests for typings based on tsd (#464) Nov 6, 2019
tsconfig.json Enable incremental tsc build (#366) May 16, 2019
tsconfig.publish.json Only put comments inside *.d.ts Mar 15, 2019
tsconfig.publish.types.json Only put comments inside *.d.ts Mar 15, 2019
yarn.lock Add tests for typings based on tsd (#464) Nov 6, 2019

README.md

fast-check logo

Property based testing framework for JavaScript/TypeScript

Build Status npm version total downloads

Coverage Status dependencies Status devDependencies Status Known Vulnerabilities

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 as precondition(x, y, ...) holds property(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) => 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

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

Issues found by fast-check in famous packages

fast-check has been able to find some unexpected behaviour among famous npm packages. Here are some of the errors detected using fast-check:

js-yaml

Issue detected: enabling !!int: binary style when dumping negative integers produces invalid content [more]

Code example: yaml.dump({toto: -10}, {styles:{'!!int':'binary'}}) produces toto: 0b-1010 not toto: -0b1010

query-string

Issue detected: enabling the bracket setting when exporting arrays containing null values produces an invalid output for the parser [more]

Code example:

m.stringify({bar: ['a', null, 'b']}, {arrayFormat: 'bracket'}) //=> "bar[]=a&bar&bar[]=b"
m.parse('bar[]=a&bar&bar[]=b', {arrayFormat: 'bracket'})       //=> {bar: [null, 'b']}

MORE: Issues detected thanks of fast-check

Code Contributors

This project would not be the same without them 💖 - Become one of them

You can’t perform that action at this time.