Node.js单元测试、集成测试、基准测试以及代码覆盖率测试方面总结

发表于:2016-05-17来源:推酷作者:OurJS点击数: 标签:
本文是最近在学习 Node.js 测试方面的总结,包括单元测试、集成测试、基准测试以及代码覆盖率测试等多方面的的内容。对于中大型项目,完备的测试用例有助于保证项目的持续集成

  本文是最近在学习 Node.js 测试方面的总结,包括单元测试、集成测试、基准测试以及代码覆盖率测试等多方面的的内容。对于中大型项目,完备的测试用例有助于保证项目的持续集成能力和代码的健壮性。

  Unit Test

  单元测试,又称模块测试,针对程序中的最小执行单元进行正确性测试。常见的开发模式包括 TDD 和 BDD 两类。

  TDD(Test-driven development,测试驱动开发),先编写测试用例,然后针对测试用例开发模块,当测试用例不足时,补充测试用例;当模块无法通过测试时,持续更新模块代码,直到完全通过测试用例。其开发核心围绕测试用例展开,即测试用例的完整性决定了开发模块的健壮性和正确性,这容易由边界条件引发单元测试覆盖度不够的问题。

  BDD(Behavior-driven development,行为驱动开发),用语义化的编程语言开发紧贴业务需求的测试用例,继而驱动相关模块的开发。

  AVA 是 JavaScript 生态中最新潮的测试框架,其内置了 Babel,可以直接使用 ES6 语法,具有轻量高效、并发执行、强制隔离等优点,安装方法:

  npm install --save-dev ava

  设置 package.json 中的 scripts 字段:

  {

  "scripts": {

  "test": "ava",

  "test:watch": "ava --watch"

  }

  }

  运行:

  npm test

  # or

  npm test:watch

  下面是一个基本的测试代码:

  import test from 'ava';

  const fibonacci = (n) => {

  if (n === 0 || n === 1) {

  return n;

  }

  return fibonacci(n - 1) + fibonacci(n - 2);

  }

  test('Test Fibonacci(0)', t => {

  t.is(fibonacci(0), 0);

  });

  test('Test Fibonacci(1)', t => {

  t.is(fibonacci(1), 1);

  });

  // HOOK CALLS

  test.before('Before', t => {

  console.log('before');

  });

  test.after('After', t => {

  console.log('after');

  });

  test.beforeEach('BeforeEach', t => {

  console.log(' beforeEach');

  });

  test.afterEach('AfterEach', t => {

  console.log(' afterEach');

  });

  在上面的代码中,我们首先引入了 AVA 模块,然后创建了待测试的 fibonacci 函数,接下来是两个测试用例,最后是四个钩子方法:before() / after() / beforeEach() / afterEach()。

  AVA 提供了一下修饰方法来指定测试的执行方式:

  skip() ,跳过添加了 skip() 的测试用例

  only() ,只执行添加了 only() 的测试用例

  todo() ,占位标识符,表示将来需要添加的测试用例

  serial() ,串行执行测试用例,默认情况下 AVA 会以并行的方式执行测试用例

  test('Test Fibonacci(0)', t => {

  t.is(fibonacci(0), 0);

  });

  在上面代码回调函数中的 t ,称为断言执行对象,该对象包含以下方法:

  t.end() ,结束测试,只在 test.cb() 中有效

  t.plan(count) ,指定执行次数

  t.pass([message]) ,测试通过

  t.fail([message]) ,测试失败

  t.ok(value, [message]) ,断言 value 的值为真值

  t.notOK(value, [message]) ,断言 value 的值为假值

  t.true(value, [message]) ,断言 value 的值为 true

  t.false(value, [message]) ,断言 value 的值为 false

  t.is(value, expected, [message]) ,断言 value === expected

  t.not(value, expected, [message]) ,断言 value !== expected

  t.same(value, expected, [message]) ,断言 value 和 expected 深度相等

  t.notSame(value, expected, [message]) ,断言 value 和 expected 深度不等

  t.throws(function | promise, [error, [message]]) ,断言 function 抛出异常或 promise reject 错误

  t.notThrows(function | promise, [message]) ,断言 function 不会异常或 promise resolve

  t.regex(contents, regex, [message]) ,断言 contents 匹配 regex

  t.ifError(error, [message]) ,断言 error 是假值

  集成测试

  相对于专注微观模块的单元测试,集成测试是从宏观整体的角度发现问题,所以也称为组装测试和联合测试。 Travis CI 是一款优秀的持续集成工具,可以监听 Github 项目的更新,便于开源软件的集成测试。使用 Travis CI 需要在项目的根目录下创建 .travis.yml 配置文件(以 Node.js 为例):

原文转自: http://ourjs.com/detail/5738493888feaf2d031d24fa