mocha测试简单使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/llmys/article/details/82562143

复制粘贴两位大佬的:
测试框架 Mocha 实例教程 【阮一峰】
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html
mocha 【廖雪峰】
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00147204317563462840426beb04a849ba813eb46bb347c000

mocha是JavaScript的一种单元测试框架,mocha主要支持的特点有:

1)既可以测试简单的JS函数,又可以测试异步代码,因为异步是JS的特性之一;
2)可以运行所有的测试,也可以运行特定的测试;
3)支持before、after、beforeEach、afterEach来编写代码。这个和Java里面的打桩(说错了勿怪)测试应该差不多。

安装mocha

$ npm install mocha -g
$ npm install chai -g

简单使用
比如我们测试一个add.js中的add函数

"use strict";
function add(a, b) {
    return a + b;
}
module.exports.add = add;

通常,测试脚本与所要测试的源码脚本同名,但是后缀名为.test.js(表示测试)或者.spec.js(表示规格)。比如,add.js的测试脚本名字就是add.test.js。
所以文件夹的结构如下:

mocha-test
    |------add.js
    |test
        |--------add.test.js

在test目录创建js文件add.test.js,编码如下:

"use strict";
var add = require("../add.js").add;
var expect = require("chai").expect;
describe("加法函数测试", function(){
    it("1+1=2",function(){
        expect(add(1,1)).to.be.equal(2);
     });
});

Mocha默认运行test子目录里面的测试脚本。所以,一般都会把测试脚本放在test目录里面,mocha-test目录,运行下面的命令。

C:\Users\administrator\Desktop\mocha-test>mocha


  加法函数测试
    √ 1+1=2


  1 passing (17ms)

说明:

describe块称为”测试套件”(test suite),表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称(”加法函数的测试”),第二个参数是一个实际执行的函数。
it块称为”测试用例”(test case),表示一个单独的测试,是测试的最小单位。它也是一个函数,第一个参数是测试用例的名称(”1 加 1 应该等于 2”),第二个参数是一个实际执行的函数。

异步测试
mocha默认每个测试最多2000毫秒,如果没有得到结果就报错,有时候这个时间不够,需要使用-t设置超时的门槛
如测试一个异步函数add.js中如下:

function sub(cb) {
    function func() {
        cb();
    }
    setTimeout(func, 4000);
}
module.exports.sub = sub;

测试则应该这样写:

var sub = require("../add.js").sub;
describe("减法函数测试", function(){
    it("sub测试", function(done){
        sub(function(){
            done();
        }); 
    });
});

it块执行的时候,传入一个done参数,当测试结束的时候,必须显式调用这个函数,告诉Mocha测试结束了。否则,Mocha就无法知道,测试是否结束,会一直等到超时报错。
使用命令测试:

$ mocha -t 5000

断言库chai.expect的使用
expect(add(1,1)).to.be.equal(2);
所谓”断言”,就是判断源码的实际执行结果与预期结果是否一致,如果不一致就抛出一个错误。上面这句断言的意思是,调用add(1, 1),结果应该等于2。
基本用法:

// 相等或不相等
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/);

构造假数据
有时候测试时,需要构造假数据,比如构造不存在的文件,当fs.readFileSync读取时能够顺利执行完成测试。当然有时候需要为http请求等构造假数据,这个可以参考廖雪峰大佬的文章。
测试需要用到mock-fs模块,npm安装如下:

$ npm install mock-fs -g

构造文件以及文件内容,当然还可以构造文件权限等属性:

mockfs({
                "文件名":"文件内容"
     });

使用fs.readFileSync读取测试,看看是否构造成功:

var fs = require("fs");
var mockfs = require("mock-fs");
var expect = require("chai").expect;

function func(cb) {
    setTimeout(cb, 1000);
}

describe("测试fs", function(){
    describe("测试函数:readFileSync", function(){
        beforeEach(function(){
            mockfs({
                "filename":"lend"
            });
        });
        afterEach(function(){
        //通过mock()方法可以创建多个文件的Mock并立即生效, 此后对fs的调用都会访问这些Mock文件。 调用mock.restore()可取消Mock并恢复fs。
            mockfs.restore();
        });
        it("should all cotent.", function(done){
            func(function(){
                var str = fs.readFileSync("filename", "utf-8");
                expect(str).to.equal("lend");
                done();
            });
        }); 
        it.skip("skip this test", function(){
            // 此函数尚未实现时,可使用skip跳过
        });
    });
});

执行命令运行如下:

C:\Users\administerator\Desktop\mocha-test>mocha -t 5000


  测试fs
    测试函数:readFileSync
      √ should all cotent. (1010ms)
      - skip this test


  1 passing (1s)
  1 pending

参考:
https://harttle.land/2016/08/01/javascript-mock-fs.html
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00147204317563462840426beb04a849ba813eb46bb347c000

猜你喜欢

转载自blog.csdn.net/llmys/article/details/82562143