简单来说mocha是一个测试框架,支持BDD和TDD不同风格的接口,支持before,after等前/后置条件.可以在这个框架下使用各种断言库(断言就是作出一个预测,不符合则抛出,mocha就是整合这些断言结果).

工具选用

  • mocha - 测试框架
  • supertest - 请求工具
  • should - 断言库

环境搭建

  • 第一步安装环境 npm install --save-dev mocha supertest.
  • 进入项目目录 mkdir test && cd test && touch test.js, mocha默认会执行test下所有js后缀的文件.

代码实现

在上一步新建的test.js中写入:

var supertest = require("supertest");
var should = require("should");
var request = supertest.agent("http://192.168.0.120:3000");

describe("Restful APIs test - GET",function(){
  it("广场列表推荐-获取热门标签",function(done){
    request
      .get("/api/v1/recommend/tags?pageSize=4")
      .expect(200)
      .end(function (err,res) {
        res.body.state.should.equal(0);
        done();
      });
  });
});

解读:

  • describe (moduleName, testDetails) describe modueName描述场景,可以把describe()当成目录理解.
  • it (info, function) info描述测试用例,一般简要说明预期结果,具体的测试语句放在it的回调函数里.
  • expect() 除了请求状态码,还可以请求body,自己写断言,或者几种混合.
  • res.body.state.should.equal(0) should断言返回的body中的state字段结果是否等于0(本项目正常返回时body中此字段值为0,此处用来简单举例).另外should还提供了a,an,it,have等帮助理解的无意义链条函数.
  • done() 为异步方法完成回调(此坑已踩),执行异步代码时需要在结束时调用回调函数.

简单复用

可以把it部分拿过来做一个简单复用

describe('Restful APIs test - GET', function (){

  var testGet = function (uri, state, done) {
    console.log('       \n', uri);
    request
    .get(uri)
    .expect('Content-type',/json/)
    .end(function (err, res) {
      res.body.should.have.property('msg');
      res.status.should.equal(200);
      res.body.msg.should.exist;
      res.body.result.should.exist;
      res.body.state.should.equal(state);
      res.body.result.length.should.below(100);
      res.body.result.should.be.Array();
      done (err);
    });
  };  


  var list = [-1, 0, 15, 16, '*&@!'];
  _.each(list,function(e){
    var pageSize = e;
    _.each(list, function (e) {
      it("广场列表推荐", function(done){
      var pageId = e;
      testGet(api.concat('pageId=').concat(pageId)
        .concat('&pageSize=').concat(pageSize), 0, done);
      });
    });
  });
});

工具使用就是这些了,后面更重要的是用例的设计.

单元测试

SuperTest 可以直接驱动express,用来做单元测试超级方便的. 测试统计,单元测试时可以使用istanbul这个,会显示覆盖率等各种信息,并可以生成html. 另外还有各种高大上的工具可用,其实各位后端同学码完代码完全可以顺手做做单元测试哒 ~

参考连接

http://ju.outofmemory.cn/entry/86908 https://www.npmjs.com/package/supertest http://www.moye.me/2014/11/22/bdd_mocha/