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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:55:21