首页 > 代码库 > nodejs 单元测试

nodejs 单元测试

    之前项目开发因为改进度,基本都是粗放式开发。为了提高代码质量,单元测试是必不可少的。

    针对restful api ,用supertest 测试框架。针对nodejs,引入mocha 和should 可以方便编写单元测试。

    首先谈谈supertest,它封装了mocha和expect 模块。用法也比较简洁,例子:

    

var request = require(‘supertest‘);
var express = require(‘express‘);
let should=require(‘should‘);
 

var app = require(‘../app‘);
var port = process.env.PORT || 3000;
app.set(‘port‘, port);
describe(‘supertest 验证‘, function() {

  beforeEach(function() {
    console.log(‘before every test in every suit‘);
  });

  it(‘get 请求‘, function(done) {
    request(app)
      .get(‘/‘)
      .set(‘Cache-control‘, ‘no-cache‘)
      .expect(200, done);
  });

  it(‘Post 请求‘, function(done) {
    request(app)

      .post(‘/sayHello‘)
      .set(‘Content-Type‘, ‘application/json‘)
      .send({
        username:‘ryan‘,
        password:‘chen‘
      })
      .expect(‘Content-Type‘, /json/)
      .expect(200,{message:"ryan你好"}, done);
  });

});

     如上代码所示,整体看是比较easy清爽的。可以设置header和对比返回值,至于token的验证,在测试时根据环境变量取消即可。

   

 should 是个好同志,可以帮助我们方便比较。至于用法,如下:

 

技术分享
 1 describe(‘should test‘, function () {
 2   "use strict";
 3   beforeEach(function () {
 4   });
 5   it(‘ok‘, function (done) {
 6     true.should.be.ok;
 7     (5).should.be.exactly(6).and.be.a.number;
 8     done();
 9   });
10   it(‘true‘,function (done) {
11     true.should.be.true;
12     ‘true‘.should.not.be.true;
13     done();
14   });
15   //content compare,not reference
16   it(‘eql‘, function () {
17     ({ foo: ‘bar‘,num:1 }).should.eql({ foo: ‘bar‘,num:1});
18     //[1, 2, 3].should.eql({ ‘0‘: 1, ‘1‘: 2, ‘2‘: 3 });
19 
20   });
21   //to be exactly,
22   it(‘equal‘,function () {
23     (4).should.equal(4);
24     ‘test‘.should.equal(‘test‘);
25     [1,2,3].should.be.not.exactly([1,2,3]);
26   });
27   //>= or <=
28   it(‘within‘, function () {
29     (5).should.be.within(5, 10).and.within(5, 5);
30     (5).should.be.above(0);
31   });
32   //.Infinity
33   it(‘infinity‘, function () {
34     (1/0).should.be.Infinity;
35   });
36   //instanceof
37   it(‘instanceof‘, function () {
38     let ball=new Ball(11,"red");
39     ball.should.be.an.instanceOf(Ball);
40     [].should.be.an.instanceof(Array);
41   });
42 
43   it(‘properties‘,function () {
44     let ball=new Ball(11,"red");
45 
46     ball.should.have.properties(‘color‘);
47     ball.should.have.properties({size:11,color:"red"});
48   });
49   it(‘empty‘, function () {
50     [].should.be.empty;
51     ‘‘.should.be.empty;
52     ({}).should.be.empty;
53     (function() {
54       arguments.should.be.empty;
55     })();
56   });
57   it(‘containEql‘, function () {
58     ‘hello boy‘.should.containEql(‘boy‘);
59     [1,2,3].should.containEql(3);
60     [[1],[2],[3]].should.containEql([3]);
61     [[1],[2],[3, 4]].should.not.containEql([3]);
62   });
63   //regex
64   it(‘regex or function‘, function () {
65     [‘a‘, ‘b‘, ‘c‘].should.match(/[a-z]/);
66     (5).should.match(function(n) { return n > 0; });
67     (5).should.not.match(function(n) { return n < 0; });
68   });
69   it(‘match each‘, function () {
70     [10, 11, 12].should.matchEach(function(it) { return it >= 10; });
71   });
72 
73   it(‘exception‘, function () {
74     (function(){
75       throw new Error(‘fail‘);
76     }).should.throw();
77   });
78 
79   it(‘status‘,function () {
80      //res.should.have.status(200);
81      //res.should.have.header(‘Content-Length‘, ‘123‘);
82     //res.should.be.json
83 
84   })
85 
86 });
87 
88 class Ball
89 {
90   constructor(size,color)
91   {
92     Object.assign(this,{size,color});
93   }
94 }
View Code

  可以在控制台,用mocha 命令 测试,会默认找项目根目录下test文件夹,所以单元测试要放到此文件下。执行后,会测试当前文件夹下所有的单元测试:

  技术分享

  开发工具如果用的是webstorm,有个比较方便的插件。可在插件里面搜 nodejs,安装后,可在启动配置中添加mocha,

 技术分享

 配置后,直接启动

 技术分享

 可以看到,这样的话可以选择其中某个测试用例测试,比输入脚本方便了好多。bingo

nodejs 单元测试