Home

Awesome

⚠️⚠️⚠️ Project moved to https://github.com/dubzzz/fast-check/tree/main/packages/ava ⚠️⚠️⚠️


Property based testing for AVA based on fast-check

Build Status npm version

Bring the power of property based testing framework fast-check into AVA. ava-fast-check simplifies the integration of fast-check into AVA testing framework.

Getting Started

Install ava-fast-check and its peer dependencies:

npm install --save-dev ava fast-check ava-fast-check

Example

import { testProp, fc } from 'ava-fast-check';

// for all a, b, c strings
// b is a substring of a + b + c
testProp('should detect the substring', [fc.string(), fc.string(), fc.string()], (t, a, b, c) => {
  t.true((a + b + c).includes(b));
});

The property is passed AVA's t argument for its first parameter, and the value of each arbitrary for the current test case for the rest of the parameters.

ava-fast-check supports all of AVA's assertions and like AVA, supports synchronous and asynchronous functions, including promises, observables, and callbacks. See AVA's documentation for more information.

Advanced

fast-check Parameters

testProp accepts an optional fc.Parameters for forwarding custom parameters to fast-check (more).

AVA Modifiers

ava-fast-check also comes with .only, .serial .skip, and .failing modifiers from AVA.

import { testProp, fc } from 'ava-fast-check';

testProp('should replay the test for the seed 4242', [fc.nat(), fc.nat()], (t, a, b) => {
  t.is(a + b, b + a);
}, { seed: 4242 });

testProp.skip('should be skipped', [fc.fullUnicodeString()], (t, text) => {
  t.is([...text].length, text.length);
});

AVA before/after Hooks

ava-fast-check exposes AVA's before/after hooks:

import { testProp, fc } from 'ava-fast-check';

testProp.before(t => {
  connectToDatabase();
});

testProp(
  // ... omitted for brevity
);

testProp.after(t => {
  closeDatabaseConnection();
});

AVA Execution Context

ava-fast-check mirror's AVA's procedure for customizing the test execution context:

import { fc, testProp as anyTestProp, PropertyTestInterface } from '../src/ava-fast-check';

type TestContext = {
  state: string
};

const testProp = anyTestProp as PropertyTestInterface<TestContext>;

testProp(
  'should reach terminal state',
  [fc.string()],
  (t, received) => {
    // here t is typed as ExecutionContext<TestContext>
    console.log(t.context.state); // logs 'uninitialized'
    // ... omitted for brevity
  }
);

Minimal requirements

ava-fast-checkAVAfast-check
^6.0.0>=4.0.0^3.0.0
^5.0.0>=4.0.0^2.0.0<sup>(2)(4)</sup>
^4.0.0>=3.9.0<sup>(1)</sup>^2.0.0<sup>(2)</sup>
^3.0.0>=3.9.0<sup>(1)</sup>^2.0.0<sup>(2)</sup>
^2.0.0>=3.9.0<sup>(1)</sup>^1.0.0
^1.0.0>=0.1.0<sup>(3)</sup>^1.0.0