跳至主要內容

ava - 未来的test runner

莫林...大约 3 分钟Node.jsava

ava - 未来的test runner

以前常用的test runner还是mocha。mocha的确是一个不错的测试框架,但是会预设一些全局变量如describe、it等。而且测试用例是串行跑的,有时跑完整个测试需要很久。 ava声称是未来的test runner。它确实有很多优点,并发运行测试,确保每个测试用例原子性的同时,能大大提高测试的效率。

安装

全局安装

npm install ava -g

然后可以使用全局的ava命令来初始化项目:

ava --init

这样就会把ava加到scripts的test下,并把ava加到devDependencies中。

{
  "name": "awesome-package",
    "scripts": {
      "test": "ava"
    },
    "devDependencies": {
      "ava": "^0.11.0"
    }
}

局部安装 本地安装ava

npm install ava --save-dev

然后配置scripts的test命令,值为ava。

个人习惯使用ava -v 这样就可以verbose输出。

命令行

常用参数

--serial -s 是否并行
--verbose -v 是否verbose输出(会输出每个测试的title)

运行方式

ava
ava demo.js

文件夹会被递归遍历,带上 *.js 参数的话全部文件都会被作为测试文件。名字为 fixtures,helpers 和 node_modules 的文件夹总会被忽略。所以把 helper 名字以 _ 开头命名就可以一起放置在测试文件的目录下。

当使用 npm test 时你可以直接传参数 npm test test2.js,但标志需要像这样传递 npm test -- --verbose。

配置

所有的选项都可以配置在package.json的ava属性中。

{
  "ava": {
    "files": [
      "my-test-folder/*.js",
      "!**/not-this-file.js"
        ],
      "source": [
        "**/*.{js,jsx}",
      "!dist/**/*"
        ],
      "match": [
        "*oo",
      "!foo"
        ],
      "failFast": true,
      "tap": true,
      "require": [
        "babel-register"
        ],
      "babel": "inherit"
  }
}

测试文件书写注意事项

测试用例结构

可以通过导入ava的test方法来创建一个测试。提供可选的title和callback函数。该函数会在运行测试时被调用。函数只有一个参数t(常用名t,当然也可以用别的名),t为一个执行对象。

const test = require('ava');

test(<标题>,t => {
    t.is(1, 2);
    });

每个测试用例可以使用cb方式以及promise方式。

promise

如果测试返回的是一个promise,则不需要使用t.end来结束一个测试。

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

callback模式使用test.cb来创建一个测试,并且需要使用t.end来结束测试.

test.cb(t => {
    // t.end 自动检查第一个参数是否为错误
    fs.readFile('data.txt', t.end);
    });
钩子函数

ava提供四种钩子函数before,after,beforeEach和afterEach。

test.before(t => {
    // 这个会在所有测试前运行
    });

test.before(t => {
    // 这个会在上面的方法后面运行,但在测试之前运行
    });

test.after('cleanup', t => {
    // 这个会在所有测试之后运行
    });

test.beforeEach(t => {
    // 这个会在每个测试之前运行
    });

test.afterEach(t => {
    // 这个会在每个测试之后运行
    });

test(t => {
    // 正常的测试
    });

AVA 运行每个测试文件会有各自单独的进程,你可能不需要在 after 钩子中清理全局状态,因为它只会在进程退出前被调用。

beforeEach 和 afterEach钩子可以共享测试的上下文:

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

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

默认情况下 t.context是一个对象,但你可以重新赋值:

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

test(t => {
    t.is(t.context, 'unicorn');
    });

上下文共享在 before 和 after 钩子中不可用。

only和skip

在运行的测试项加only,将会只运行这个测试。 在运行的测试项加skip,将会只跳过这个测试。

test.only(title, t => {});
test.skip(title, t => {});

常用断言

- t.is(value, expected) 等于
- t.true(value) true值
- t.false(value) false值
- t.not(value, expected)不等于
- t.deepEqual(value, expected)全等于
- t.regex(content, regex)匹配正则表达式
- t.notRegex(content, regex)不匹配正则

预览:

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.0.0-alpha.9