Logo Vincent
返回文章列表

小巧的JS测试框架:AVA

Web
小巧的JS测试框架:AVA

【前言】

常见的JS测试框架有Jest,Mocha等,

今天介绍一个小巧的JS测试框架:ava,

https://github.com/avajs/ava

【安装】

安装比较简单,如下

npm i -D ava

安装后,添加npm脚本,如下

{
	"name": "awesome-package",
	"type": "module",
	"scripts": {
		"test": "ava"
	},
	"devDependencies": {
		"ava": "^5.0.0"
	}
}

【配置文件】

ava支持在package.json中添加ava的配置,

或者使用ava.config.js进行配置,如下,

module.exports = {
  files: ['!__tests__/**/*'],
  match: [],
  concurrency: 5,
  failFast: true,
  failWithoutAssertions: false,
  environmentVariables: {
    MY_ENVIRONMENT_VARIABLE: 'some value',
  },
  verbose: true,
  require: [],
  nodeArguments: ['--trace-deprecation'],
};

配置文件的详细使用可以看这里:

https://github.com/avajs/ava/blob/main/docs/06-configuration.md

【测试用例】

ava支持常见的测试用例,

普通的测试用例

// ava
const test = require('ava');

// test 1
test('test 1', (t) => {
  t.pass();
});

多个测试用例并行执行

// ava
const test = require('ava');

// test 1
test('test 1', (t) => {
  t.pass();
});

// test 2
test('test 2', (t) => {
  t.pass();
});

多个测试用例串行执行

// ava
const test = require('ava');

// test 1
test('test 1', (t) => {
  t.pass();
});

// test 1-1
test.serial('test 1-1', (t) => {
  t.pass();
});

// test 2
test('test 2', (t) => {
  t.pass();
});

支持promise测试用例

// ava
const test = require('ava');

// q
const { isExists } = require('../../index.js');

// test promise
test('test promise', (t) => {
  const fpath = '/path/not/exists';
  return isExists(fpath).then((result) => {
    t.falsy(result);
  });
});

支持async / await测试用例

// ava
const test = require('ava');

// q
const { isExists } = require('../../index.js');

// test promise
test('test promise', async (t) => {
  const fpath = '/path/not/exists';
  const res = await isExists(fpath);
  t.falsy(res);
});

支持只运行某一个测试用例

// ava
const test = require('ava');

// test 1
test('test 1', (t) => {
  t.pass();
});

// test 2
test.only('test 2', (t) => {
  t.pass();
});

支持跳过某一个测试用例

// ava
const test = require('ava');

// test 1
test('test 1', (t) => {
  t.pass();
});

// test 2
test('test 2', (t) => {
  t.pass();
});

// test 3
test.skip('test 3', (t) => {
  t.fail();
});

支持todo某一个测试用例

// ava
const test = require('ava');

// test 1
test('test 1', (t) => {
  t.pass();
});

// test 2
test('test 2', (t) => {
  t.pass();
});

// test 3
test.skip('test 3', (t) => {
  t.fail();
});

// test 4
test.todo('test 4');

支持失败的测试用例

// ava
const test = require('ava');

// test 1
test('test 1', (t) => {
  t.pass();
});

// test 2
test('test 2', (t) => {
  t.pass();
});

// test 3
test.skip('test 3', (t) => {
  t.fail();
});

// test 4
test.todo('test 4');

// test 5
test.failing('test 5', (t) => {
  t.fail(); // Test will count as passed
});

支持before,after等钩子

在所有测试用例之前执行的before钩子

// ava
const test = require('ava');

// before
test.before(() => {
  console.log('before 1');
});

// test
test('test 1', (t) => {
  t.pass();
});
test('test 2', (t) => {
  t.pass();
});
test.serial('test serial', (t) => {
  t.pass();
});

在所有测试用例之前执行的串行before钩子

// ava
const test = require('ava');

// serial before
test.serial.before(() => {
  console.log('before serial 1');
});

// test
test('test 1', (t) => {
  t.pass();
});
test('test 2', (t) => {
  t.pass();
});
test.serial('test serial', (t) => {
  t.pass();
});

在所有测试用例之后执行的after和after always钩子

// ava
const test = require('ava');

// after
test.after(() => {
  console.log('after');
});
test.after.always(() => {
  console.log('after always');
});

// test
test('test 1', (t) => {
  t.pass();
});
test('test 2', (t) => {
  t.pass();
});
test.serial('test serial', (t) => {
  t.pass();
});

支持测试用例上下文

// ava
const test = require('ava');

test.beforeEach((t) => {
  t.context.data = 'foo';
});

test('context data is foo', (t) => {
  t.is(t.context.data + 'bar', 'foobar');
});

支持测试用例使用宏

// ava
const test = require('ava');

function macro(t, input, expected) {
  t.is(eval(input), expected);
}

test('2 + 2 = 4', macro, '2 + 2', 4);
test('2 * 3 = 6', macro, '2 * 3', 6);

【执行上下文t】

测试用例的回调函数中的t,

是执行上下文,

title:测试用例标题

context:测试用例上下文

passed:测试用例是否通过

log方法:打印日志,替代console.log

// ava
const test = require('ava');

// test
test('test', (t) => {
  t.log(t.title);
  t.log(t.context);
  t.log(t.passed);
  t.pass();
});

【断言】

支持常见的断言,如下

【支持设置超时时间】

// ava
const test = require('ava');

// test
test('test', async (t) => {
  t.timeout(1);

  await hello();
  t.pass();
});

function hello() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, 1000);
  });
}

【总结】

ava虽然小巧,但是使用很方便

1.强大的配置文件

2.强大的测试用例

3.强大的钩子和宏

4.强大的断言

5.强大的命令行

感兴趣的可以继续探索下,

https://github.com/avajs/ava/tree/main/docs

© 2026 vincentqiao.com . 保留所有权利。