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 }

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

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

配置后,直接启动

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

时间: 2024-08-05 23:40:38

nodejs 单元测试的相关文章

nodejs单元测试

前言: 之前一直听说过单元测试,但是具体怎么做,也没有深入研究,感觉测试是一件很麻烦的事,花费时间.可能是自己太懒了,一看到测试那么多陌生的东西就不想弄了. 然后一拖再拖,直到最近,换了一家公司,然后求知欲望又燃起来了.所以想吧之前一直不想掌握的技术给掌握了. 目录: 测试框架 断言库 supertest 1.测试框架 nodejs的测试框架用的最多的是mocha.mocha诞生于2011年,是现在最流行的测试框架之一,再浏览器和node环境中都可以使用.它支持多种nodejs的断言库,同时支持

Node稳定性的研究心得

目前大部分Web服务器,如Apache,都使用多线程的方式响应多用户请求,即一个线程服务一个用户请求.这种模式其中一个好处是,当某个请求的线程上抛出的异常没被捕获,只会影响当前这个线程,不会影响其他请求. 由于Node执行在单线程上,一旦线程上抛的异常没有被捕获,就会引起整个进程的崩溃.所以对Node服务的异常处理.保证进程的稳定性非常重要. 再好的程序员也不敢保证自己的代码不出现异常,除了尽可能捕获可能出现的异常,我们还需要通过一些规范减少异常发生,通过单元测试辅助我们验证代码,通过一些工具保

nodejs mocha 单元测试

用mocha进行单元测试 首先搭建环境 1.安装mocha sudo npm install -g mocha 2.在模块装添加should,package.json添加"shoud":"*",然后npm install 如何测试 1.首先要在带测试文件中引入should require('should'),然后根据教程编写程序 2.mocha file 就可以对js文件进行测试了,但如果你的是coffee文件,那必须指定用什么语法解析 具体命令行: mocha -

基于Grunt&amp;Mocha 搭建Nodejs自动化单元测试框架(含代码覆盖率统计)

Introduction Grunt 是一个基于任务的JavaScript 世界的构建工具 Mocha 是具有丰富特性的 JavaScript 测试框架,可以运行在 Node.js 和浏览器中,使得异步测试更简单更有趣.Mocha 可以持续运行测试,支持灵活又准确的报告,当映射到未捕获异常时转到正确的测试示例. Prerequisite nodejs项目文件目录结构如下 ├── config ├── controllers ├── models ├── lib ├── node_modules

在Nodejs中贯彻单元测试

在团队合作中,你写好了一个函数,供队友使用,跑去跟你的队友说,你传个A值进去,他就会返回B结果了.过了一会,你队友跑过来说,我传个A值却返回C结果,怎么回事?你丫的有没有测试过啊? 大家一起写个项目,难免会有我要写的函数里面依赖别人的函数,但是这个函数到底值不值得信赖?单元测试是衡量代码质量的一重要标准,纵观Github的受欢迎项目,都是有test文件夹,并且buliding-pass的.如果你也为社区贡献过module,想更多人使用的话,加上单元测试吧,让你的module值得别人信赖. 要在N

NodeJs学习笔记(四)---单元测试

sailsjs框架用了一段时间了,感觉如果功能复杂了,非常难以处理,想用一下单元测试,看是否能解决问题. sailsjs的官方文档使用的是mocha,我搜索了一些资料,主要参考了朴灵的<深入浅出nodejs>的单元测试一章.sailsjs的官方文档以及github上的一个例子https://github.com/bredikhin/sailsjs-mocha-testing-barrels-fixtures-example. 1)系统环境如下 Windows 8.1 X64 nodejs 0.

nodejs 学习五 单元测试一

一. chai chai 自身是依赖nodejs的 assert,让检测更加语义化. chai 采用两种模式,TDD和BDD, TDD是类似自然语言方式(什么是自然语言,就是你说的话,举个例子,你是我媳妇吗?). BDD是结构主义(举个例子,我媳妇和我说的媳妇是同一个人吗?) chai文旦地址 二.mocha chai测试解构成功了,不返回什么,失败了报出.然测试的结果更加符合语义. mocha文档地址 运行主要通过在package.json中scripts配置npm命令,一般用npm自身tes

NodeJs和ReactJs单元测试工具——Jest

Jest——Painless JavaScript UnitTesting 特点 适应性强 默认使用Jasmine断言 模块化的 可扩展的 可配置的 沙箱式且快速 虚拟化JS环境,模拟浏览器 并行运行工作线程 默认的模拟框架 默认自动模拟所有模块,便于测试当前代码 集成Babel 必要性 支持ES6标准语法 支持React特定语法 安装组件 npm install --save-dev babel-jest babel-polyfill 配置babel { "presets": [&q

NodeJs学习笔记(五)---单元测试补充

今天早上继续研究Mocha,忽然发现一个问题,我的大部分程序都是需要登录验证的,所以需要预先登录之后才能进行下一步测试,就开始在网上找答案,发现没有这种资料,很疑惑,最后发现其实是自己太笨了,因为这个问题在Node中太简单了,解决方案如下 修改bootstrap.test.js,如下 var Sails = require('sails'), sails; var request = require('supertest'); var port = 1447; //测试启动端口 agent =