前言

公司的项目马上要上线了,中间层在写单元测试,手头没啥别的事儿就也看看这方面的知识,学习一下哈哈。

没弄过这些,选择框架的时候挑了个mocha,打算上手后再试试Jasmine。

这边记录一下学习的过程和知识点,记性不给力,这样以便以后回顾。

安装

1
2
3
4
5
6
//安装mocha测试框架
npm install -g --dev-save mocha
//安装chai断言库
npm install -g --dev-save chai
//安装导出的模版
npm install --dev-save mochawesome

运行

运行这边我在执行的时候遇到个问题是在webstorm中直接执行会报错 describe is not defined ,在git bash或者cmd下都没问题。

执行的几种命令:

1
2
3
4
5
6
7
8
9
10
11
12
//在目录下执行测试文件
$ mocha a.test.js
//mocha会默认执行目录下的test子文件夹内的js
$ mocha
//上一条执行的是一层的,要遍历文件夹下所有层次的测试文件,则:
$ mocha --recursive
//执行指定文件夹demo下的test1.js test2.js
$ mocha demo/{test1,test2}.js
//执行指定文件下所有文件
$ mocha demo/ *.js
//执行导出模版(相对路径 按照自己情况来) 得到的导出文件夹在当前目录下
$ ../node_modules/.bin/mocha --reporter mochawesome

demo(同步)

describe 是测试套件,it 是测试用例,第一个参数都是名称,第二个参数是实际执行的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//add.js
function add(x,y){
return x+y
}
module.exports = add;
//add.spec.js
var add = require("./add.js");
var expect = require("chai").expect;
describe('test demo',function(){
it('1+1=2',function(){
expect(add(1,1)).to.be.equal(2);
})
})

demo(异步)

1
2
3
4
5
6
7
8
9
10
11
12
var expect = require("chai").expect;
var request = require("superagent");
decribe('anscy demo'function(){
it('get info',function(done){
request
.get('apiurl')
.end(function(err,res){
except(res).to.be.an('object');
done();
})
})
})

引入了superagent库来进行http操作,done() 代表该测试用例的结束

(superagent的使用详情看官方文档,http://visionmedia.github.io/superagent/)

模拟登录

在实际项目测试中,几乎所有api都是基于登录状态的,所以在执行前要先带上登录的session。

思路:在执行登录请求的时候,在header中有set-cookie的字段,得到cookie的值,在每次请求api的时候在header中带上这个cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var expect = require('chai').expect;
var request = require('superagent');
var webservice = require('./settings.js');
describe('mock login',function () {
var cookieserver;
beforeEach(function (done) {
request
.post(webservice+'/api/investManage/login')
.send('{"email":"123","pwd":"123"}')
.set('Content-Type','application/json')
.end(function (err, res) {
if(!err){
cookieserver = res.header['set-cookie'];
done()
}
})
});
it('investInfo',function (done) {
request
.get(webservice+'/api/investManage/invest_manage/profile')
.set('Cookie',cookieserver)
.end(function (err,res) {
done()
})
});
})

不是promise写法的异步请求,一定要带上done(),每次都忘坑了自己一把= =