彩蛋

末段,介绍2个库:faker
她是三个能伪造用户数据的库,包罗用户常带有的属性:个人新闻、头像、地址等等。
是一个开支初期,模拟用户数量的绝佳好库。
扶助Node.js和浏览器端

变化用户

�必要变更

急需变更啦: limit其一措施还须求再次回到值大于100时再次来到100。
针对须要重构代码之后,正是测试用例的市值所在了,
它能保障您的改动对原有成果没有造成破坏。
只是,你要多做的部分办事的是,需要为新的需要编制新的测试代码。

丰富测试

这个应该怎么测试,未来有getContent艺术,他会读取内定文件的始末,不过不肯定会中标,会抛出尤其。

exports.getContent = function (filename, callback) {
  fs.readFile(filename, 'utf-8', callback);
};

此时就活该模拟(mock)错误环境了

覆盖率

测试的时候,大家平常关心,是或不是富有代码都测试到了。

以此目的就叫做“代码覆盖率”(code
coverage)。它有五个测量维度。

  • 行覆盖率(line coverage):是或不是每一行都施行了?
  • 函数覆盖率(function coverage):是还是不是每种函数都调用了?
  • 分段覆盖率(branch coverage):是不是逐个if代码块都举行了?
  • 讲话覆盖率(statement coverage):是不是逐个语句都施行了?

Istanbul
是 JavaScript 程序的代码覆盖率工具。

编纂3个平稳可倚重的模块

模块具备limit方法,输入三个数值,小于0的时候重回0,其他不奇怪重临

exports.limit = function (num) {
  if (num < 0) {
    return 0;
  }
  return num;
};

结果

在当前目录下实施mocha

$ mocha

  ․

  ✔ 1 test complete (2ms)

不止集成,Travis-cli

  • Travis-ci
    • 绑定Github帐号
    • 在Github仓库的Admin打开Services hook
    • 打开Travis
    • 老是push将会hook触发执行npm test命令

留意:Travis会将未描述的类型当作Ruby项目。所以需要在根目录下参加.travis.yml文本。内容如下:

language: node_js
node_js:
  - "0.12"

Travis-cli还会对项目揭发标签,

图片 1

/

or

图片 2

/

借使项目通过具有测试,就会build-passing,
借使项目并未经过具有测试,就会build-failing

局地见解

推行单元测试的时候, 假如没有一份经过实践讲明的事无巨细规范, 很难控制测试的
“度”, 范围太小施展不开, 太大又侵袭 “外人的” 地盘. 上帝的归上帝,
凯撒的归凯撒, 给单元测试念念紧箍咒不见得是件坏事,
反而更便于发挥单元测试的威力, 为代码重构和增长代码质量提供引力.
那份文档来自 Geotechnical, 是一份特别宝贵的阅历准则.
你完全可以以那份准则作为模板, 结合所在团队的阅历,
整理出一份内部单元测试准则.

单元测试准则

整理

安装

$ npm install -g istanbul

指令行式

mocha -t 10000

本文的言传身教代码会备份到 Github :
unittest-demo

异步方法的逾期辅助

Mocha的过期设定暗许是2s,如果推行的测试超越2s的话,就会报timeout错误。
可以积极修改超时时间,有两种办法。

要在Nodejs中写单元测试的话,你需求了解用什么样测试框架,怎么测试异步函数,怎么测试私有方法,怎么模拟测试环境,怎么测试看重HTTP协议的web应用,须求精晓TDD和BDD,还有须要提供测试的覆盖率。

动用Makefile串起项目

TESTS = test/*.test.js
REPORTER = spec
TIMEOUT = 10000
JSCOVERAGE = ./node_modules/jscover/bin/jscover

test:
    @NODE_ENV=test ./node_modules/mocha/bin/mocha -R $(REPORTER) -t $(TIMEOUT) $(TESTS)

test-cov: lib-cov
    @LIB_COV=1 $(MAKE) test REPORTER=dot
    @LIB_COV=1 $(MAKE) test REPORTER=html-cov > coverage.html

lib-cov:
    @rm -rf ./lib-cov
    @$(JSCOVERAGE) lib lib-cov

.PHONY: test test-cov lib-cov

make test
make test-cov

用项目本身的jscover和mocha,幸免版本冲突和芜杂

API式

describe('async', function () {
  this.timeout(10000);
  it('async', function (done) {
    lib.async(function (result) {
      done();
    });
  });
});

那样的话async举行时间不当先10s,就不会报错timeout错误了。

测试私有方法

本着有的里边的形式,没有通过exports揭表露来,怎么测试它?

function _adding(num1, num2) {
  return num1 + num2;
}

测试框架

Nodejs的测试框架还用说?我们都在用,Mocha。
Mocha
是二个成效充分的Javascript测试框架,它能运作在Node.js和浏览器中,接济BDDTDDQUnitExports式的测试,本文首要示例是行使更类似与沉思形式的BDD,�假设驾驭更多可以访问Mocha的官网

断言库

下边的代码只是运营了代码,并没有对结果开展检查,那时候就要用到断言库了,Node.js中常用的断言库有:

  • should.js
  • expect.js
  • chai

目录分配

  • lib,存放模块代码的地点
  • test,存放单元测试代码的地点
  • index.js,向外导出模块的地点
  • package.json,包描述文件

大家一块儿写个项目,难免会有自己要写的函数里面依赖旁人的函数,不过这几个函数到底值不值得依赖?单元测试是衡量代码品质的一第②标准,纵观Github的受欢迎项目,都是有test文件夹,并且buliding-pass的。如若您也为社区贡献过module,想更五个人使用的话,加上单元测试吧,让您的module值得旁人看重。

在公司同盟中,你写好了一个函数,供队友使用,跑去跟你的队友说,你传个A值进去,他就会回到B结果了。过了一会,你队友跑过的话,小编传个A值却回到C结果,怎么回事?你丫的有没有测试过啊?

累加断言

使用should库为测试用例加上断言

it('limit should success', function () {
  lib.limit(10).should.be.equal(10);
});

安装

npm install mocha -g

测试Promise

选择should提供的Promise断言接口:

  • finally | eventually
  • fulfilled
  • fulfilledWith
  • rejected
  • rejectedWith
  • then

测试代码

describe('should', function () {
  describe('#Promise', function () {
    it('should.reject', function () {
      (new Promise(function (resolve, reject) {
        reject(new Error('wrong'));
      })).should.be.rejectedWith('wrong');
    });

    it('should.fulfilled', function () {
      (new Promise(function (resolve, reject) {
        resolve({username: 'jc', age: 18, gender: 'male'})
      })).should.be.fulfilled().then(function (it) {
          it.should.have.property('username', 'jc');
        })
    });
  });
});

测试异步回调

lib库中新增async函数:

exports.async = function (callback) {
  setTimeout(function () {
    callback(10);
  }, 10);
};  

测试异步代码:

describe('async', function () {
  it('async', function (done) {
    lib.async(function (result) {
      done();
    });
  });
});

因此rewire导出艺术

模块:rewire

it('limit should return success', function () {
  var lib = rewire('../lib/index.js');
  var litmit = lib.__get__('limit');
  litmit(10);
});

测试接口

Mocha的BDD接口有:

  • describe()
  • it()
  • before()
  • after()
  • beforeEach()
  • afterEach()

测试

var lib = require('index');

describe('module', function () {
  describe('limit', function () {
    it('limit should success', function () {
      lib.limit(10);
    });
  });
});

异步测试

覆盖率测试

在编写过上述的测试用例之后,执行命令:

istanbul cover _mocha

就能收获覆盖率:

JerryC% istanbul cover _mocha                                                                                                                                                                


  module
    limit
      ✓ limit should success
    async
      ✓ async
    getContent
      ✓ getContent
    add
      ✓ add

  should
    #Promise
      ✓ should.reject
      ✓ should fulfilled


  6 passing (32ms)


================== Coverage summary ======================
Statements   : 100% ( 10/10 )
Branches     : 100% ( 2/2 )
Functions    : 100% ( 5/5 )
Lines        : 100% ( 10/10 )
==========================================================

那条命令同时还生成了3个 coverage 子目录,其中的 coverage.json
文件包涵覆盖率的固有数据,coverage/lcov-report
是足以在浏览器打开的覆盖率报告,其中有详细音信,到底什么样代码没有遮盖到。

覆盖率html

地点命令中,istanbul cover 命令前边跟的是 _mocha
命令,后面的下划线是不能够简单的。

因为,mocha 和 _mocha
是八个差距的通令
,前者会新建八个进度执行测试,而后人是在此时此刻经过(即
istanbul 所在的进度)执行测试,唯有如此, istanbul
才会捕捉到覆盖率数据。其余测试框架也是这么,必须在同一个经过执行测试。

若果要向 mocha 传入参数,可以写成上边的指南。

$ istanbul cover _mocha -- tests/test.sqrt.js -R spec

上边命令中,两根连词线前面的局地,都会被看成参数传入 Mocha
。假设不加那两根连词线,它们就会被看做 istanbul
的参数(参考链接12)。

简单Mock

describe("getContent", function () {
  var _readFile;
  before(function () {
    _readFile = fs.readFile;
    fs.readFile = function (filename, encoding, callback) {
      process.nextTick(function () {
        callback(new Error("mock readFile error"));
      });
    };  
  });
  // it();
  after(function () {
    // 用完之后记得还原。否则影响其他case
    fs.readFile = _readFile;
  })
});

参考


假如本文对你有用
请不要吝啬你们的Follow与Start
那会大大帮忙大家一连创作

「Github」
MZMonster
@MZMonster
JC_Huang
@JerryC8080

测试Web应用

在付出Web项目标时候,要测试某壹个API,如:/user,到底怎么编写测试用例呢?

使用:supertest

var express = require("express");
var request = require("supertest");
var app = express();

// 定义路由
app.get('/user', function(req, res){
  res.send(200, { name: 'jerryc' });
});

describe('GET /user', function(){
  it('respond with json', function(done){
    request(app)
      .get('/user')
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200)
      .end(function (err, res) {
        if (err){
          done(err);
        }
        res.body.name.should.be.eql('jerryc');
        done();
      })
  });
});

Nodejs的单元测试工具

  1. 测试框架 mocha
  2. 断言库:should.js、expect.js、chai
  3. 覆盖率:istanbul、jscover、blanket
  4. Mock库:muk
  5. 测试私有方法:rewire
  6. Web测试:supertest
  7. 不停集成:Travis-cli

�Mock库

Mock小模块:muk
,略微出色的写法:

var fs = require('fs');
var muk = require('muk');

before(function () {
  muk(fs, 'readFile', function(path, encoding, callback) {
    process.nextTick(function () {
      callback(new Error("mock readFile error"));
    });
  });
});
// it();
after(function () {
  muk.restore();
});

目录

  1. 测试框架
  2. 断言库
  3. 需要变动
  4. 异步测试
  5. 十三分测试
  6. 测试私有方法
  7. 测试Web应用
  8. 覆盖率
  9. 运用Makefile把测试串起来
  10. 频频集成,Travis-cli
  11. 有的见解
  12. 彩蛋
  13. 整理

相关文章

网站地图xml地图