Description
Property based testing is another way to test programs. Instead of relying on hard-coded inputs and outputs, it checks characteristics of the output given the whole range of possible inputs.
fast-check alternatives and similar modules
Based on the "Testing" category.
Alternatively, view fast-check alternatives based on common mentions on social networks and blogs.
-
Playwright
Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API. -
Mocha
โ๏ธ simple, flexible, fun javascript test framework for node.js & the browser -
jasmine
Simple JavaScript testing framework for browsers and node.js -
Nightwatch
End-to-end testing framework written in Node.js and using the W3C Webdriver API -
WebdriverIO
Next-gen browser and mobile automation test framework for Node.js -
volkswagen
:see_no_evil: Volkswagen detects when your tests are being run in a CI server, and makes them pass. -
CasperJS
Navigation scripting and testing utility for PhantomJS and SlimerJS -
istanbul
Yet another JS code coverage tool that computes statement, line, function and branch coverage with module loader hooks to transparently add coverage when running tests. Supports all JS coverage use cases including unit tests, server side functional tests and browser tests. Built for scale. -
uvu
uvu is an extremely fast and lightweight test runner for Node.js and the browser -
toxy
Hackable HTTP proxy for resiliency testing and simulated network conditions -
power-assert
Power Assert in JavaScript. Provides descriptive assertion messages through standard assert interface. No API is the best API. -
loadtest
Runs a load test on the selected URL. Easy to extend minimally for your own ends. -
testdouble.js (AKA td.js)
A minimal test double library for TDD with JavaScript -
testcontainers-node
Testcontainers is a NodeJS library that supports tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. -
abstruse
Abstruse is a free and open-source CI/CD platform that tests your models and code. -
Crusher
๐งโโ๏ธ Fast low-code testing framework โฑ๏ธ Create test in <60 secs -
Mochify
โ๏ธ TDD with Browserify, Mocha, Headless Chrome and WebDriver -
testen
:heavy_check_mark: Run tests for multiple versions of Node.js in local env.
Appwrite - The Open Source Firebase alternative introduces iOS support
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of fast-check or a related project?
README
Property based testing framework for JavaScript/TypeScript
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:
- ๐ Introduction to Property Based & Hands On
- ๐ฃ Built-in arbitraries
- ๐ง Custom arbitraries
- ๐โโ๏ธ Property based runners
- ๐ฅ Tips
- ๐ API Reference
- โญ Awesome fast-check
- ๐คฏ How fast-check works?
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.
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.x | โฅ8(1) | ES2017 | โฅ3.2 |
1.x | โฅ0.12(1) | ES3 | โฅ3.0 |
(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.
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.
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:
Issue detected: toStrictEqual
fails to distinguish 0 from 5e-324 [more]
Code example: expect(0).toStrictEqual(5e-324)
succeeds
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
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 to fast-check
Credits
Code Contributors
This project would not be the same without them ๐ - [Become one of them](CONTRIBUTING.md)
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]
*Note that all licence references and agreements mentioned in the fast-check README section above
are relevant to that project's source code only.