nodejs 单元测试

Posted Ryan chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 单元测试的主要内容,如果未能解决你的问题,请参考以下文章

在Nodejs中贯彻单元测试

单元测试 NPE,当我添加片段自定义转换时

在 NodeJS + Typescript AWS Lambda 上进行单元测试

nodejs常用代码片段

Nodejs/NestJS ExceptionFilter Catch 方法的 Jest 单元测试

如何使用 Karma (testacular) 测试 nodejs 后端代码