Git Product home page Git Product logo

ava's Introduction

AVA

Simple concurrent test runner

Build Status

Even though JavaScript is single-threaded, IO in Node.js can happen in parallel due to its async nature. AVA takes advantage of this and runs your tests concurrently, which is especially beneficial for IO heavy tests. Switching from Mocha to AVA in Pageres brought the test time down from 31 sec to 11 sec. Having tests run concurrently forces you to write atomic tests, meaning tests that don't depend on global state or the state of other tests, which is a great thing!

Install

$ npm install --save-dev ava

Usage

Add it to package.json
{
	"scripts": {
		"test": "ava"
	}
}
Create your test file
var test = require('ava');

test('foo', function (t) {
	t.pass();
	t.end();
});

test('bar', function (t) {
	t.plan(2)

	setTimeout(function () {
		t.is('bar', 'bar');
		t.same(['a', 'b'], ['a', 'b']);
	}, 100);
});

Run it
$ npm test

CLI

$ ava --help

  Usage
    ava <file|folder|glob> [...]

  Examples
    ava
    ava test.js test2.js
    ava test-*.js

  Default patterns when no arguments:
  test.js test-*.js test/**

Documentation

Test files are just normal Node.js scripts and can be run with $ node test.js. However, using the CLI is preferred for simplicity and future parallelism support.

Tests are run async and require you to either set planned assertions t.plan(1), explicitly end the test when done t.end(), or return a promise.

You have to define all tests synchronously, meaning you can't define a test in the next tick, e.g. inside a setTimeout.

Test anatomy

To create a test, you just call the test function you require'd from AVA and pass in an optional test name and a callback function containing the test execution. The passed callback function is given the context as the first argument where you can call the different AVA methods and assertions.

test('name', function (t) {
	t.pass();
	t.end();
});

Optional test name

Naming a test is optional, but you're recommended to use one if you have more than one test.

test(function (t) {
	t.end();
});

You can also choose to use a named function instead:

test(function name(t) {
	t.end();
});

Planned assertions

Planned assertions are useful for being able to assert that all async actions happened and catch bugs where too many assertions happen. It also comes with the benefit of not having to manually end the test.

This will result in a passed test:

test(function (t) {
	t.plan(1);

	setTimeout(function () {
		t.pass();
	}, 100);
});

And this will result in an error because the code called more assertions than planned:

test(function (t) {
	t.plan(1);

	t.pass();

	setTimeout(function () {
		t.pass();
	}, 100);
});

Promise support

If you return a promise in the test you don't need to explicitly end the test as it will end when the promise resolves.

test(function (t) {
	return somePromise().then(function (result) {
		t.is(result, 'unicorn');
	});
});

Serial test execution

While concurrency is awesome, there are some things that can't be done concurrently. In these rare cases, you can call test.serial, which will force those tests to run serially before the concurrent ones.

test.serial(function (t) {
	t.end();
});

Custom assertion module

You can use any assertion module instead or in addition to the one that comes with AVA, but can't won't be able to use the .plan() method, yet.

var assert = require('assert');

test(function (t) {
	assert(true);
	t.end();
});

API

test([name], body)

test.serial([name], body)

name

Type: string

Test name.

body(context)

Type: function

Should contain the actual test.

context

Passed into the test function and contains the different AVA methods and assertions.

See the claim docs for supported assertions.

plan(count)

Plan how many assertion there are in the test. The test will fail if the actual assertion count doesn't match planned assertions. When planned assertions are used you don't need to explicitly end the test.

Be aware that this doesn't work with custom assert modules. You must then call .end() explicitly.

end()

End the test. Use this when plan() is not used.

Tips

Temp files

Running tests concurrently comes with some challenges, doing IO is one. Usually, serial tests just create temp directories in the current test directory and cleans it up at the end. This won't work when you run tests concurrently as tests will conflict with each other. The correct way to do it is to use a new temp directory for each test. The tempfile and temp-write modules can be helpful.

FAQ

Why not mocha, tape, node-tap?

Mocha requires you to use implicit globals like describe and it, too unopinionated, bloated, synchronous by default, serial test execution, and slow. Tape and node-tap are pretty good. AVA is highly inspired by their syntax. However, they both execute tests serially and they've made TAP a first-class citizen which has IMHO made their codebases a bit convoluted and coupled. TAP output is hard to read so you always end up using an external tap reporter. AVA is highly opinionated and concurrent. It comes with a default simple reporter and will in the future support TAP through a reporter.

License

MIT © Sindre Sorhus & Kevin Mårtensson




AVA

ava's People

Contributors

sindresorhus avatar kevva avatar

Watchers

James Cloos avatar Josh Junon avatar  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.