当前位置: 首页 > 工具软件 > Mocha JS > 使用案例 >

自动化测试(三)04-js测试框架Mocha——更多用法之默认超时2s、Mocha在describe块之中的钩子方法(生命周期函数)、Mocha支持异步测试

朱鸿畅
2023-12-01

自动化测试(三)04-js测试框架Mocha——更多用法之默认超时2s、Mocha在describe块之中的钩子方法(生命周期函数)、Mocha支持异步测试

更多用法

超时

  --timeout, -t, --timeouts  Specify test timeout threshold (in milliseconds)
                                                        [number] [default: 2000]

官方默认的超时是2000毫秒,即2s。

有三种方式来修改超时:

--no-timeout参数或者debug模式中,全局禁用了超时;

--timeout后面接时间(毫秒),全局修改了本次执行测试用例的超时时间;

在测试用例里面,使用this.timeout方法:

it('should take less than 500ms', function(done) {
  this.timeout(500);
  setTimeout(done, 300);
});

钩子方法里面使用:

describe('a suite of tests', function() {
  beforeEach(function(done) {
    this.timeout(3000); // A very long environment setup.
    setTimeout(done, 2500);
  });
});

同样,可以使用``this.timeout(0)去禁用超时。

钩子方法(生命周期函数)

Mocha在describe块之中,提供测试用例的四个钩子:before()、after()、beforeEach()和afterEach()。它们会在指定时间执行。

describe('测试index.js',()=> {
  before(()=>console.info("在本区块的所有测试用例之前执行"))

  after(()=>console.info("在本区块的所有测试用例之后执行"))

  beforeEach(()=>console.info("在本区块的每个测试用例之前执行"))

  afterEach(()=>console.info("在本区块的每个测试用例之后执行"))

  describe('测试addNum函数', ()=> {
    it('两数相加结果为两个数字的和', ()=> {
      assert.equal(addNum(1,2),3)
    })
  })
})

异步测试

Mocha本身是支持异步测试的。只需要为describe回调函数添加一个done参数, 成功时调用done(),失败时调用done(err)。例如:

var expect = require('chai').expect;
describe('db', function() {
    it('#get', function(done) {
        db.get('foo', function(err, foo){
            if(err) done(err);        
            expect(foo).to.equal('bar');
            done();
        });
    });
});
  • 如果未调用done函数,Mocha会一直等待直到超时。
  • 如果未添加done参数,Mocha会直接返回成功,不会捕获到异步的断言失败。例如:
it('#get', function(){
    setTimeout(function(){
        expect(1).to.equal(2);
    }, 100);
});

运行上述测试Mocha总会提示Passing。

Mocha怎么知道是否要等待异步断言呢?因为JavaScript中的Function有一个length属性, 通过它可以获得该函数的形参个数。Mocha通过传入回调的length来判断是否需要等待。

或者,done()您可以返回Promise,而不是使用回调。如果您正在测试的API返回promises而不是回调,可以这样进行使用:

beforeEach(function() {
  return db.clear().then(function() {
    return db.save([tobi, loki, jane]);
  });
});

describe('#find()', function() {
  it('respond with matching records', function() {
    return db.find({type: 'User'}).should.eventually.have.length(3);
  });
});

同样,可以使用async / await,您还可以编写如下的异步测试:

beforeEach(async function() {
  await db.clear();
  await db.save([tobi, loki, jane]);
});

describe('#find()', function() {
  it('responds with matching records', async function() {
    const users = await db.find({type: 'User'});
    users.should.have.length(3);
  });
});

需要Babel支持~~~

 类似资料: