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

在Jest测试中使用aws-amplify性能异常缓慢的问题排查

AWS Amplify signIn在Jest中性能急剧下降的排查思路

问题场景

生产环境中使用AWS Amplify的signIn接口完成OAuth令牌获取仅需不到1秒,但在Jest v29中执行相同逻辑耗时约6秒,升级到Jest v30后更是达到9-10秒。以下是简化的复现代码:

核心逻辑文件 signInTest.js

const {Amplify} = require('aws-amplify');
const {signIn} = require('aws-amplify/auth');

async function executeSignIn() {
    Amplify.configure({
        Auth: {
            Cognito: {
                userPoolId: 'someUserPoolId',
                userPoolClientId: 'someUserPoolClientId'
            }
        }
    });

    console.log(new Date())
    await signIn({
        username: 'someUsername',
        password: `somePassword`,
        options: {
            authFlowType: 'USER_SRP_AUTH'
        }
    });
    console.log(new Date())
}

exports.executeSignIn = executeSignIn

生产环境调用文件 test.js

import {executeSignIn} from "./signInTest.js";

await executeSignIn()

Jest测试文件

const signInTest = require("./signInTest.js");

describe('Amplify LogIn', () => {
    it('should log in', async () => {
        await signInTest.executeSignIn()
    });
})

环境信息:Node.js v22.13.1,Jest v29.7.0 / v30.0.0

已排查方向:通过NODE_DEBUG=net,tls确认AWS区域配置正确,内存消耗无泄漏,Amplify内部逻辑无异常。


Jest导致性能下降的可能机制

  1. 沙箱隔离开销:Jest默认给每个测试用例创建独立的沙箱环境,包括重置全局对象、隔离模块作用域。Amplify初始化涉及大量模块加载和全局状态配置,重复的沙箱初始化会显著增加耗时,Jest v30可能对沙箱机制做了强化,导致开销进一步提升。
  2. 模块缓存差异:Jest的模块缓存策略与Node.js原生不同,每次测试可能重复加载Amplify相关模块,而生产环境中模块仅初始化一次。
  3. 异步调度冲突:Jest测试运行时需要处理断言、测试报告等后台逻辑,会与Amplify的signIn(尤其是USER_SRP_AUTH流程涉及的多次加密计算和网络请求)抢占事件循环资源,导致异步操作延迟。
  4. Jest v30的运行时变化:Jest 30对测试运行器做了重构,可能引入了新的初始化 overhead,或者对异步任务的调度逻辑调整,影响了Amplify的认证流程效率。

进一步调试与优化方向

  • 禁用沙箱测试:在jest.config.js中添加配置testEnvironmentOptions: { customExportConditions: ['node'] },或者启动Jest时加上--no-sandbox参数,验证是否是沙箱导致的性能损耗。
  • 全局初始化Amplify:在Jest的setupFilesAfterEnv中提前配置Amplify,避免每个测试用例重复执行Amplify.configure,减少初始化开销。
  • CPU性能分析:使用node --inspect-brk node_modules/jest/bin/jest.js启动测试,在Chrome DevTools的Performance面板捕获CPU profile,定位signIn过程中耗时最长的函数(比如加密计算、网络请求等待)。
  • 对比网络请求时序:用NODE_DEBUG=http,https打印Jest环境下的网络请求细节,对比生产环境的请求耗时,确认是网络延迟还是本地处理逻辑变慢。
  • 隔离测试网络层:在测试中单独发起一个简单的HTTP请求(比如fetch('https://example.com')),看是否同样出现耗时增加,排查是Amplify自身问题还是Jest的网络层处理导致。
  • 版本兼容性排查:尝试在Jest v30中降级使用旧版的@jest/test-runtime,或者回退Amplify版本,确认是否是版本间的兼容性问题导致性能下降。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:34:50