返回文章列表
小巧的JS测试框架:AVA
Web
【前言】
常见的JS测试框架有Jest,Mocha等,
今天介绍一个小巧的JS测试框架: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.强大的命令行
感兴趣的可以继续探索下,