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

如何根据运行时长判定单元测试的通过或失败

单元测试校验运行时长的实现方案

基础实现方案

核心逻辑是手动记录被测方法调用前后的时间戳,计算实际运行时长后断言是否符合阈值要求,针对你给出的RxJS异步场景,实现代码如下:

it('should run within 2 seconds', (done) => {
  // 记录调用前的时间戳
  const startTime = Date.now();
  // 自定义最大允许运行时长,单位为毫秒,此处示例为2秒
  const maxAllowedDuration = 2000;

  sut.someLongRunningMethod().subscribe({
    next: () => {
      // 计算实际运行时长
      const actualDuration = Date.now() - startTime;
      // 断言时长符合要求
      expect(actualDuration).toBeLessThan(maxAllowedDuration);
      done();
    },
    error: (err) => done.fail(err)
  });
});

自定义匹配器复用方案

如果需要频繁使用时长校验能力,可以把逻辑封装为自定义匹配器,和你提到的toHaveBeenCalled()、toHaveBeenCalledWith()这类内置匹配器的用法保持一致,便于复用:

// 全局注册自定义匹配器,可放在测试初始化文件中
expect.extend({
  async toCompleteWithin(received: () => Promise<any> | Observable<any>, maxDuration: number) {
    const startTime = Date.now();
    try {
      const target = received();
      // 兼容RxJS Observable和Promise两种异步场景
      if (target instanceof Observable) {
        await firstValueFrom(target);
      } else {
        await target;
      }
      const actualDuration = Date.now() - startTime;
      return actualDuration < maxDuration ? {
        pass: true,
        message: () => `预期执行时长超过${maxDuration}ms,实际为${actualDuration}ms`
      } : {
        pass: false,
        message: () => `预期执行时长不超过${maxDuration}ms,实际为${actualDuration}ms`
      };
    } catch (err) {
      return {
        pass: false,
        message: () => `被测方法执行报错:${String(err)}`
      }
    }
  }
});

// 业务测试用例中直接调用即可
it('should run within 2 seconds', async () => {
  await expect(() => sut.someLongRunningMethod()).toCompleteWithin(2000);
}, 10000); // 单独设置用例超时时间,按需配置

注意事项

  • 测试框架默认存在单用例超时限制(Jest默认5秒、Jasmine默认10秒),如果你的最大允许时长超过默认值,需要给用例单独指定超时参数。
  • 异步逻辑需要补充错误捕获处理,避免测试无响应卡死。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:15:04