OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

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


分享到
分类 JS学习   关键字 Node.JS   发布 ourjs  1463306552100
注意 转载须保留原文链接,译文链接,作者译者等信息。  
作者 pinggod  May 13, 2016

本文是最近在学习 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 抛出异常或 promisereject 错误
  • 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 为例):

language: node_js

node_js:
- "6"
- "5"

before_script:

script:
- npm test
- node benchmark/index.js

after_script:

默认情况下,Travis CI 会自动安装依赖并执行 npm test 命令,通过 script 字段可以自定义需要执行的命令,其完整的生命周期包括:

  1. Install apt addons
  2. before_install
  3. install
  4. before_script
  5. script
  6. after_success or after_failure
  7. OPTIONAL before_deploy
  8. OPTIONAL deploy
  9. OPTIONAL after_deploy
  10. after_script

基准测试

基准测试使用严谨的测试方法、测试工具或测试系统评估目标模块的性能,常用于观测软硬件环境发生变化后的性能表现,其结果具有可复现性。在 Node.js 环境中最常用的基准测试工具是 Benchmark.js,安装方式:

npm install --save-dev benchmark

基本示例:

const Benchmark = require('benchmark');
const suite = new Benchmark.Suite;

suite.add('RegExp#test', function() {
/o/.test('Hello World!');
})
.add('String#indexOf', function() {
'Hello World!'.indexOf('o') > -1;
})
.on('cycle', function(event) {
console.log(String(event.target));
})
.on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').map('name'));
})
// run async
.run({ 'async': true });

代码覆盖率

代码覆盖率工具根据测试用例覆盖的代码行数和分支数来判断模块的完整性。AVA 推荐使用 nyc 测试代码覆盖率,安装 nyc:

npm install nyc --save-dev

修改 .gitignore 忽略相关文件:

node_modules
coverage
.nyc_output

修改 package.json 中的 test 字段:

{
"scripts": {
"test": "nyc ava"
}
}

执行 npm test,得到:

➜  test-in-action (master) ✔ npm test

> test-in-action@1.0.0 test /Users/sean/Desktop/test-in-action
> nyc ava

2 passed
----------|----------|----------|----------|----------|----------------|
File | % Stmts | % Branch | % Funcs | % Lines |Uncovered Lines |
----------|----------|----------|----------|----------|----------------|
----------|----------|----------|----------|----------|----------------|
All files | 100 | 100 | 100 | 100 | |
----------|----------|----------|----------|----------|----------------|
参考资料
原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 五个最佳案例带你解读 Node.js 的前后端之道
  2. 程序bug导致了天大的损失,要枪毙程序猿吗?
  3. 前端开发面试题
  4. 一个程序员是如何搞挂NPM和Node社区的
  5. 微软降低OneDrive的免费存储空间容量,个人云存储热度减退
  6. Web前端面试题集锦
  7. Google Cloud宣布加入NodeJS基金会
  8. 前端面试问题(二)-史上最全 前端开发面试问题及答案整理
  9. 如日中天的Uber究竟使用什么开发语言?
  10. 10个常见的Node.js面试题
  11. AirJD-简单好用的免费建站工具

 相关阅读 - JS学习
  1. 基础 JavaScript 装X指南
  2. NodeJS中用child_process的exec执行cd指令为什么不工作?
  3. 深入理解JavaScrip面向对象和原型继承
  4. JavaScript继承与原型链
  5. 五个最佳案例带你解读 Node.js 的前后端之道
  6. React vs Angular 2:冰与火之歌「译」
  7. NodeJS 文件(夹)压缩/解压方案(zip/unzip)
  8. iPad/iPhone默认input按钮的disabled CSS样式不工作
  9. Array及String的lastIndexOf函数用法及其IE8实现,及为什么要尽量避免使用for in
  10. Express入门教程:一个简单的博客

 关键字 - Node.JS
  1. Node.JS用Path将相对路径转为绝对路径
  2. 使用Node.JS监听文件夹变化
  3. Node.JS循环删除非空文件夹及子目录下的所有文件
  4. Node.js网页抓取:一个最简单的http请求客户端示例(request client)
  5. 如何用Bootstrap免费网站模板和OnceAir云盘搭建个人网站服务器
  6. Node.JS如何查看本地MAC/IP地址、计算cpu使用率和内存容量
  7. Express入门教程:一个简单的博客
  8. 在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
  9. 如何收集捕获Node中的未处理的错误异常信息?
  10. trim-html:NodeJS的HTML文本截取库(自动生成正文摘要)

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号