Cypress递归函数问题:测试随时间逐渐变慢
诊断应用测试递归逻辑优化方案
问题根源
你用递归处理100+问题的问答循环,在Cypress里会导致异步命令队列爆炸——递归调用会同步往队列里塞大量未执行的命令,随着循环次数增加,内存占用飙升,测试速度越来越慢。而且原代码嵌套多层.then()、重复获取别名,进一步拖慢了执行效率。
具体优化方案
1. 用链式调用替代递归,控制命令执行顺序
把循环触发放到每轮命令的.then()回调里,确保当前所有异步操作完成后才启动下一轮,避免命令堆积。同时用cy.all()合并别名获取,减少嵌套层级:
Cypress.Commands.add('intro_Questions', (data) => { const processQuestion = () => { // 一次性获取两个别名,减少.then()嵌套 cy.all('@question_tree', '@link').then(([question_tree, link]) => { if (action === 'LAST') { return; } // 链式执行所有操作,完成后再启动下一轮 cy.Question({ q: link, qt: question_tree, question_log: data.fixture }) .then(() => cy.Answer({ q: link, qt: question_tree })) .then(() => cy.editAnswer({})) .then(processQuestion); }); }; processQuestion(); });
2. 缓存静态数据,减少重复查询
如果question_tree在循环过程中不会变化,直接在命令初始化时获取一次,避免每轮都查别名:
Cypress.Commands.add('intro_Questions', (data) => { cy.get('@question_tree').then((question_tree) => { const processQuestion = () => { cy.get('@link').then((link) => { if (action === 'LAST') { return; } cy.Question({ q: link, qt: question_tree, question_log: data.fixture }) .then(() => cy.Answer({ q: link, qt: question_tree })) .then(() => cy.editAnswer({})) .then(processQuestion); }); }; processQuestion(); }); });
3. 优化随机编辑逻辑
cy.editAnswer({})是随机执行的,可以提前判断是否需要执行,避免不必要的命令调用:
// 假设触发概率为30%,可根据实际配置调整 const shouldEdit = Math.random() < 0.3; if (shouldEdit) { cy.editAnswer({}); }
4. 清理无用别名(可选)
如果循环中不再需要某些别名,用cy.clearAlias()清理,减少内存占用:
// 在合适的时机清理 cy.clearAlias('link');
额外建议
- 跟踪每轮执行时间:用
cy.log(Date.now())记录每轮循环的开始/结束时间,定位具体哪一步拖慢了测试 - 拆分测试:如果100+问题的测试太长,拆分成多个小测试用例,避免单例测试内存占用过高
内容的提问来源于stack exchange,提问作者Rakesh Loi
相关产品推荐
相关产品推荐

