You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Chutzpah运行Jasmine测试时随机出现超时等异常问题求助

解决Chutzpah + Jasmine 遗留项目中的随机测试错误

问题背景

维护基于Knockout、Durandel和RequireJS的遗留项目时,使用Chutzpah(搭配Jasmine 2.x)运行测试遇到两类随机虚假错误:

  • 同步测试触发异步超时:报错 Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.,涉事测试均为纯同步逻辑,未使用promise、async/await或done()回调,重新运行耗时不足100ms即可通过
  • 随机未定义对象错误:报错 Uncaught TypeError: Cannot read properties of undefined (reading '<object>') thrown,仅在大型测试套件的单个测试中随机出现,重新运行无任何异常

当前Chutzpah.json配置:

{
    "Framework": "jasmine",
    "FrameworkVersion": "2",
    "TestHarnessReferenceMode": "AMD",
    "TestHarnessLocationMode": "SettingsFileAdjacent",
    "References": [
        { "Path": "require.js" },
        { "Path": "config.js" }
    ],
    "Tests": [{ "Path": "specs" }],
    "CodeCoverageIncludes": ["*\\app\\*"],
    "CodeCoverageSuccessPercentage": 84, //currently our lowest completely tested file percentage
    "Engine": "Chrome",
    "EngineOptions": {
        "ChromeBrowserPath": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
    },
    "TestFileTimeout": 20000
}

针对性解决方案

1. 处理同步测试的随机超时问题

  • 调整Jasmine全局超时规则:在测试入口文件(如specs/boot.js)中显式配置超时,同时针对同步测试强制重置短超时,避免误判:
    // 全局基础超时设置
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
    // 同步测试单独缩短超时
    beforeEach(function() {
      if (!this.async) {
        this.originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
      }
    });
    afterEach(function() {
      if (this.originalTimeout) {
        jasmine.DEFAULT_TIMEOUT_INTERVAL = this.originalTimeout;
      }
    });
    
  • 禁用并行测试执行:在Chutzpah.json中添加"EnableParallelTestExecution": false,并行加载易引发RequireJS模块加载冲突,导致虚假超时
  • 优化RequireJS加载时机:在测试文件顶部添加依赖等待逻辑,确保Durandal、Knockout等核心模块初始化完成后再执行测试:
    define(['durandal/system', 'knockout'], function(system, ko) {
      return system.ready().then(function() {
        // 此处编写测试用例
        describe('示例测试', function() {
          // ...测试逻辑
        });
      });
    });
    

2. 解决随机未定义对象错误

  • 强制测试状态隔离:在每个测试的beforeEach中重置全局状态和模块实例,避免跨测试污染:
    beforeEach(function() {
      // 清理Knockout绑定和计算属性
      ko.cleanNode(document.body);
      // 清除RequireJS模块缓存
      delete require.s.contexts._.defined['目标模块路径'];
    });
    
  • 拆分大型测试套件:将包含大量测试的文件拆分为多个小文件,减少单文件内的模块加载冲突和状态干扰
  • 调整Chrome运行参数:在Chutzpah.json的EngineOptions中添加参数,避免无头模式下的DOM或模块加载异常:
    "EngineOptions": {
      "ChromeBrowserPath": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
      "Arguments": "--no-sandbox --disable-gpu --disable-background-timer-throttling"
    }
    
  • 升级Chutzpah版本:尝试更新到兼容Jasmine 2.x的最新Chutzpah版本,修复旧版本中的并发相关bug

额外配置优化建议

修改Chutzpah.json,补充以下配置项:

{
  // ...原有配置
  "EnableParallelTestExecution": false,
  "EnableTestFileBatching": false,
  "DisableCodeCoverage": false // 可临时关闭覆盖率测试,排查是否为覆盖率工具引发的性能问题
}

内容的提问来源于stack exchange,提问作者Isaac Corbrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:58:12