mocha学习(三)hook 机制 和 测试技巧

hook 机制

hook 就是在测试流程的不同时段触发,比如在整个测试流程之前,或在每个独立测试之前等。

hook也可以理解为是一些逻辑,通常表现为一个函数或者一些声明,当特定的事件触发时 hook 才执行。

提供方法有:before()、beforeEach() after() 和 afterEach()。

方法解析:

  • before():所有测试用例的统一前置动作
  • after():所有测试用例的统一后置动作
  • beforeEach():每个测试用例的前置动作
  • afterEach():每个测试用例的后置动作

用法:

复制代码
describe('hooks', function() {
  before(function() {
    //在执行本区块的所有测试之前执行
  });

  after(function() {
    //在执行本区块的所有测试之后执行
  });

  beforeEach(function() {
    //在执行本区块的每个测试之前都执行
  });

  afterEach(function() {
    //在执行本区块的每个测试之后都执行
  });

  //测试用例

});
复制代码

描述 hook

所有的 hook 都可以加上描述,这样可以更好地定位到测试用例中的错误。如果 hook 函数指定了名称,会在没有描述时使用函数名,例如:

复制代码
beforeEach(function() {
  //beforeEach hook
});

beforeEach(function needFun() {
  //beforeEach: namedFun
});

beforeEach('some description', function() {
  //beforeEach:some description
});
复制代码

补充:上述示例中 注释的内容就是对 hook 的描述。

测试占位

测试用例占位只要添加一个没有回调的 it() 方法即可:

复制代码
var assert = require('assert');

describe('Array', function() {

  describe('#indexOf()', function() {
    //同步测试
    it('当值不存在时应该返回 -1', function() {
      assert.equal(-1, [1,2,3].indexOf(5));
      assert.equal(-1, [1,2,3].indexOf(0));
    });
  });

  describe('Array', function() {
    describe('#indexOf()', function() {
      //下面是一个挂起的测试
      it('当值不存在时应该返回 -1');
    });
  });
});
复制代码
  1. 在tests文件夹中创建一个pending.js文件
  2. 再把上述中的示例写入到我们新创建的pending.js文件当中,然后点击保存文件。(不建议拷贝)
  3. 最后在右边linux环境中输入命令 mocha pending.js, 运行我们的示例。(要进入到tests文件夹中在运行命令)

仅执行指定测试

仅执行指定测试的特性可以让你通过添加 .only() 来指定唯一要执行的测试套件或测试用例:

describe('Array', function(){
  describe.only('#indexOf()', function(){
    ...
  })
})

 

或一个指定的测试用例:

复制代码
describe('Array', function(){
  describe('#indexOf()', function(){
    it.only('当值不存在时应该返回 -1', function(){

    })

    it('当值不存在时应该返回 -1', function(){

    })
  })
})
复制代码

 

PS:注意只能出现一个 .only()

 

忽略指定测试

该特性和 .only() 非常相似,通过添加 .skip() 你可以告诉 Mocha 忽略的测试套件或者测试用例(可以有多个)。该操作使得这些操作处于挂起的状态,这比使用注释来的要好,因为你可能会忘记把注释给取消掉。

describe('Array', function(){
  describe.skip('#indexOf()', function(){
    ...
  })
})

 

或一个指定的测试用例:

复制代码
describe('Array', function(){
  describe('#indexOf()', function(){
    it.skip('当值不存在时应该返回 -1', function(){

    })

    it('当值不存在时应该返回 -1', function(){

    })
  })
})
复制代码

动态生成测试

由于mocha 可以使用 function.prototype.call 和function 表达式定义测试套件和测试用例,所以可以动态生成测试用例。

复制代码
var assert = require('assert');

function add() {
  return Array.prototype.slice.call(arguments).reduce(function(prev, curr) {
    return prev + curr;
  }, 0);
}

describe('add()', function() {
  var tests = [
    {args: [1, 2],       expected: 3},
    {args: [1, 2, 3],    expected: 6},
    {args: [1, 2, 3, 4], expected: 10}
  ];

  tests.forEach(function(test) {
    it('correctly adds ' + test.args.length + ' args', function() {
      var res = add.apply(null, test.args);
      assert.equal(res, test.expected);
    });
  });
});
复制代码
  1. 在tests文件夹中创建一个dynamically.js文件
  2. 再把上述中的示例写入到我们新创建的dynamically.js文件当中,然后点击保存文件。(不建议拷贝)
  3. 最后在右边linux环境中输入命令 mocha dynamically.js, 运行我们的示例。(要进入到tests文件夹中在运行命令)

 

posted @   陈晓猛  阅读(386)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示