本文是最近在学习 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 字段:
{ |
运行:
npm test |
下面是一个基本的测试代码:
import test from 'ava'; |
在上面的代码中,我们首先引入了 AVA 模块,然后创建了待测试的 fibonacci 函数,接下来是两个测试用例,最后是四个钩子方法:before() / after() / beforeEach() / afterEach()。
AVA 提供了一下修饰方法来指定测试的执行方式:
skip(),跳过添加了skip()的测试用例only(),只执行添加了only()的测试用例todo(),占位标识符,表示将来需要添加的测试用例serial(),串行执行测试用例,默认情况下 AVA 会以并行的方式执行测试用例
test('Test Fibonacci(0)', t => { |
在上面代码回调函数中的 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的值为truet.false(value, [message]),断言value的值为falset.is(value, expected, [message]),断言value === expectedt.not(value, expected, [message]),断言value !== expectedt.same(value, expected, [message]),断言value和expected深度相等t.notSame(value, expected, [message]),断言value和expected深度不等t.throws(function | promise, [error, [message]]),断言function抛出异常或promisereject 错误t.notThrows(function | promise, [message]),断言function不会异常或promiseresolvet.regex(contents, regex, [message]),断言contents匹配regext.ifError(error, [message]),断言error是假值
集成测试
相对于专注微观模块的单元测试,集成测试是从宏观整体的角度发现问题,所以也称为组装测试和联合测试。Travis CI 是一款优秀的持续集成工具,可以监听 Github 项目的更新,便于开源软件的集成测试。使用 Travis CI 需要在项目的根目录下创建 .travis.yml 配置文件(以 Node.js 为例):
language: node_js |
默认情况下,Travis CI 会自动安装依赖并执行 npm test 命令,通过 script 字段可以自定义需要执行的命令,其完整的生命周期包括:
- Install
apt addons before_installinstallbefore_scriptscriptafter_successorafter_failure- OPTIONAL
before_deploy - OPTIONAL
deploy - OPTIONAL
after_deploy after_script
基准测试
基准测试使用严谨的测试方法、测试工具或测试系统评估目标模块的性能,常用于观测软硬件环境发生变化后的性能表现,其结果具有可复现性。在 Node.js 环境中最常用的基准测试工具是 Benchmark.js,安装方式:
npm install --save-dev benchmark |
基本示例:
const Benchmark = require('benchmark'); |
代码覆盖率
代码覆盖率工具根据测试用例覆盖的代码行数和分支数来判断模块的完整性。AVA 推荐使用 nyc 测试代码覆盖率,安装 nyc:
npm install nyc --save-dev |
修改 .gitignore 忽略相关文件:
node_modules |
修改 package.json 中的 test 字段:
{ |
执行 npm test,得到:
➜ test-in-action (master) ✔ npm test |
