如何为Chai测试设置程序执行超时时间,实现类似Python timeout装饰器效果
核心说明
Chai 是专门的断言库,本身不提供测试超时控制能力,你需要的超时逻辑是测试运行器 Mocha 的原生能力,不需要手动封装 setTimeout 实现,有三种常用的自定义超时方案:
1. 单个测试用例单独设置超时
注意不要用箭头函数声明 it 的回调,否则无法获取 Mocha 绑定的上下文对象,调用 this.timeout(毫秒数) 即可指定当前用例的超时时间。比如你要限制用例必须在 500ms 内完成,修改后的代码如下:
context('if a = [0,1,2,3...,49999] and b = [0,1,2,3...,49999] ', () => { // 回调用普通function声明,不能用箭头函数 it("should return [0,1,2,3...,49999] ", function () { // 自定义超时为500ms,超过直接判定用例失败 this.timeout(500); const a = []; const b = []; for (let i = 0; i < 50000; i += 1) { a.push(i); b.push(i); } const result = intersection(a, b); expect(result).to.eql(a); }) })
2. 给一组测试用例批量设置超时
直接在 context/describe 块下配置超时规则,同一分组下的所有用例会自动继承这个超时设置:
// context的回调用普通function声明,不能用箭头函数 context('if a = [0,1,2,3...,49999] and b = [0,1,2,3...,49999] ', function () { // 该分组下所有测试用例统一用500ms超时 this.timeout(500); it("should return [0,1,2,3...,49999] ", () => { const a = []; const b = []; for (let i = 0; i < 50000; i += 1) { a.push(i); b.push(i); } const result = intersection(a, b); expect(result).to.eql(a); }) })
3. 全局设置所有测试用例默认超时
启动测试时加命令行参数即可全局生效:mocha --timeout 500
也可以在 Mocha 配置文件(如 .mocharc.js)中添加 timeout: 500 配置项。
注意事项
如果你的被测逻辑是同步阻塞代码(比如暴力实现的斐波那契、数组交集算法),受 JS 单线程执行特性限制,Mocha 的超时会等当前阻塞的同步代码执行完成后才会判定超时失败。如果需要强制打断运行中的阻塞逻辑,可以把被测代码放到 Worker 线程中执行,到时间直接终止 Worker 线程即可。
内容的提问来源于stack exchange,提问作者Adilson Jurado
相关产品推荐
相关产品推荐

