0.1.3 • Published 5 years ago

fuzz-check v0.1.3

Weekly downloads
1
License
MIT
Repository
github
Last release
5 years ago

Fuzz-check

Thin wrapper for certain parts of the fast-check package. It currently only supports property tests.

Usage

npm i -D fuzz-check

In your test files:

import { fuzz, fc } from "fuzz-check";

describe("Your tests go here", () => {
  it("subtracts a number from itself", () => {
    fuzz(fc.integer())((n: number) => expect(n - n).toEqual(0));
  });
});

The fuzz function is a higher order function that takes a number of Arbitrary<T> parameters and returns a function that takes an assertion. If you're familiar with the fast-check API: the last argument goes in the second function, everything else goes in the first one.

The fc export is a pure re-export of fast-check. As such, you don't need it as a separate package if you're using this one.

Motivation

When looking for a property/fuzz testing package for JS, the fast-check package was the only one I found that looked decent, but I thought the API was a bit verbose, especially when using TypeScript. I wanted something that was easier to use.

// examples
const square = (n: number) => n * n;

// using the standard fc methods
it("runs a test the verbose way", () => {
  fc.assert(
    fc.property(fc.integer(), (n: number) => {
      expect(square(n)).toEqual(n * n);
    }),
  );
});

// using the fuzz wrapper
it("runs a test using `fuzz`", () => {
  fuzz(fc.integer())((n: number) => expect(square(n)).toEqual(n * n));
});

And if you want to make it even shorter, you can define the assertion outside of the function.

const expectSquare = (n: number) => expect(square(n)).toEqual(n * n);
it("accepts predefined assertions", () => {
  fuzz(fc.integer())(expectSquare);
});

By making fuzz a higher order function, we can even pre-apply generators and reuse them over multiple tests:

const natFuzz = fuzz(fc.nat());
it("makes it easier to generate fuzz tests", () => {
  natFuzz((n: number) => expect(n).toEqual(n));
});

it("lets you reuse the same setup for multiple tests", () => {
  natFuzz((n: number) => expect(n - n).toEqual(0));
});

Future goals?

Due to this being purely a function of me scratching my own itch, it will likely continue to gain features as I find more things that I can use. At the moment it covers my basic needs, but we'll see how it goes. Any suggestions and pull requests are of course welcome :)

Authors

Thomas Hartmann