mocha测试restful API

最近在写restful API ,实在受不了用postman测试API的效果了,一怒之下翻出来原来用过的mocha。

文章目录

    • 1 Mocha简介
    • 2.Mocha使用
      • 2.1 一个测试基本写法
    • 2.2 测试中所用断言
    • 2.3 异步测试写法
    • 2.4 supertest进行http测试
    • 2.5 supertest进行https测试
    • 2.6 执行测试
    • 2.7测试输出
    • 3 参考链接

环境:
服务端采用express框架编写
在express package.json中加入

   "devDependencies": {
        "mocha": "3.0.2",
        "supertest": "3.0.0"
	      "chai":"4.1.2"
    }

安装

Npm install

1 Mocha简介

mocha是JavaScript的一种单元测试框架,既可以在浏览器环境下运行,也可以在Node.js环境下运行。

优点:
1. 可以自动运行所有测试,也可以只运行特定的测试;
2. 可以支持before、after、beforeEach和afterEach来编写初始化代码。

编写测试的原则是,一次只测一种情况,且测试代码要非常简单。我们编写多个测试来分别测试不同的输入,并使用chai模块提供的expect 判断输出是否是我们所期望的。

2.Mocha使用

2.1 一个测试基本写法

describe('XXX TEST', function() {
	before (function (done) {
	}
	
	after(function (done) {
	}
	
	  beforeEach(function(){
	  })
	  
	  afterEach(function(){
	  })
	
	 it('XXX test', function(done) {
	}
}
  • Describe{} 表示定义一组测试,且可以任意嵌套。比如一个API测试。
  • before {} 表示所有测试前所执行的程序。比如API执行的前置条件配置。
  • After{} 表示所有测试完后所执行的程序。比如释放被API占用的资源。
  • beforeEach{} 表示每次测试前所执行的程序。
  • afterEach{} 表示每次测试后所执行的程序。
  • it {} 表示执行一次测试。比如API执行的一种情况。

PS:mocha 一次测试默认时间为2000ms ,超过就认为测试失败,我们可以在Describe开始时设置超时时间
Sample:

Describe{
	this.timeout(4000);
	 it('XXX test', function(done) {}
}   

2.2 测试中所用断言

我们使用下列断言处理请求返回值

var expect = require('chai').expect;

./node_modules/mocha/bin/mocha ./test/restfulapi_test/accout_test.js 
// 相等或不相等
expect(4 + 5).to.be.equal(9);
expect(4 + 5).to.be.not.equal(10);
expect(foo).to.be.deep.equal({ bar: 'baz' });

// 布尔值为true
expect('everthing').to.be.ok;
expect(false).to.not.be.ok;

// typeof
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(foo).to.be.an.instanceof(Foo);

// include
expect([1,2,3]).to.include(2);
expect('foobar').to.contain('foo');
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');

// empty
expect([]).to.be.empty;
expect('').to.be.empty;
expect({}).to.be.empty;

// match
expect('foobar').to.match(/^foo/);

expect断言的优点是很接近自然语言

2.3 异步测试写法

如果要测试异步函数,我们要传入的函数需要带一个参数,通常命名为done:

it('test async function', function (done) {
    fs.readFile('filepath', function (err, data) {
        if (err) {
            done(err);
        } else {
            done();
        }
    });
});

测试异步函数需要在函数内部手动调用done()表示测试成功,done(err)表示测试出错。

2.4 supertest进行http测试

首先导入supertest模块,然后导入app模块

    request = require('supertest'),
    app = require('../app');
    //app = "http://52.79.113.238";也可以直接给地址

这样就会启动一个express实例 。
下面执行的是一个post请求测试(测试app 这个实例 /v2/devices/xxx API)

describe('devices test', function() {	
	it('/device api test',function(done) {
		request(app)
            .post('/v2/devices/xxx')
            .set('Content-Type','application/json')
            .set('Authorization', 'Bearer ' + accessToken)
            .send({
                id:targetDeviceId,
            })
            .expect(204) //断言希望得到返回http状态码
            .end(function(err, res) {
                console.info(res.body);//得到返回我们可以用2.2中的断言对返回结果进行判断。
                done();

            });
	});
	//..................
});

.post(‘api’)
.set 为header内容
.Send 为body 内容
当所有测试运行结束后,app实例会自动关闭,无需清理。
利用mocha的异步测试,配合supertest,我们可以用简单的代码编写端到端的HTTP自动化测试。

2.5 supertest进行https测试

如何使用自签名的证书,在使用Postman之类测试工具时,可以在浏览器中添加证书来解决警告问题。
但在supertest中,我们使用下列语句配置node环境变量,让node不去验证证书。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

2.6 执行测试

执行一个测试:
./node_modules/mocha/bin/mocha -t 4000 编写的测试程序.js
执行多个测试
./node_modules/mocha/bin/mocha 编写的测试程序.js 编写的测试程序2.js 编写的测试程序3.js

2.7测试输出

每一个it 测试项通过会
✓ xxx test (85ms)
这里写图片描述
不通过会用红色字体报错
这里写图片描述
所有测试执行完成后会有总结性输出
13 passing (5s)
3 failing
mocha测试restful API_第1张图片

3 参考链接

参考(廖学峰的博客):
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00147203593334596b366f3fe0b409fbc30ad81a0a91c4a000

参考(阮一峰的博客):
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html

你可能感兴趣的:(javascript,nodejs,测试)