在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导致性能下降的可能机制
- 沙箱隔离开销:Jest默认给每个测试用例创建独立的沙箱环境,包括重置全局对象、隔离模块作用域。Amplify初始化涉及大量模块加载和全局状态配置,重复的沙箱初始化会显著增加耗时,Jest v30可能对沙箱机制做了强化,导致开销进一步提升。
- 模块缓存差异:Jest的模块缓存策略与Node.js原生不同,每次测试可能重复加载Amplify相关模块,而生产环境中模块仅初始化一次。
- 异步调度冲突:Jest测试运行时需要处理断言、测试报告等后台逻辑,会与Amplify的
signIn(尤其是USER_SRP_AUTH流程涉及的多次加密计算和网络请求)抢占事件循环资源,导致异步操作延迟。 - 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
相关产品推荐
相关产品推荐

