使用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
相关产品推荐
相关产品推荐

