Azure DevOps管道Angular测试通过后任务卡住超时解决方案
Azure DevOps 运行Angular单元测试跑完不退出超时解决方法
问题根因
这类测试全过但进程挂死不退出的问题,90%以上是两个原因:
- Karma默认开启watch监听模式,测试跑完后不会主动退出,持续等待文件变更重跑。之前能正常跑是因为旧版依赖默认在CI环境自动关了watch,上周不管是依赖小版本升级还是Azure管道基础镜像更新,这个默认行为变了,就会挂死。本地因为有全局Karma配置或者本地环境变量自动关了watch,所以不会复现。
- 无头Chrome在CI容器/虚拟机环境下缺少必要启动参数,测试跑完后Chrome进程残留,导致父Karma进程收不到退出信号一直挂着。
修复步骤
- 第一步:给所有测试执行命令强制关闭监听模式,开启单次运行配置
不管是直接写在管道yaml里的命令,还是package.json里的脚本命令,都追加--watch=false --single-run=true参数:- 管道script任务修改为:
- script: | cd '$(System.DefaultWorkingDirectory)/Test-App' npm ci npx ng test --browsers=Chrome_Max --watch=false --single-run=true displayName: 'test app'注:移除全局安装Angular CLI的步骤,改用项目本地依赖的CLI版本(通过
npx调用),避免全局版本和项目依赖不兼容;用npm ci代替隐式安装,保证依赖版本和锁文件完全一致。- package.json中
test-headless-coverage脚本修改为:
"test-headless-coverage": "ng test --browsers=Chrome_Max --code-coverage --watch=false --single-run=true" - 第二步:更新自定义ChromeHeadless启动器参数,解决CI环境下Chrome进程残留问题
修改karma.conf.js中的自定义启动器配置,追加CI环境必需的启动参数:customLaunchers: { Chrome_Max: { base: 'ChromeHeadless', flags: [ '--window-size=1600,800', '--no-sandbox', '--disable-gpu', '--disable-dev-shm-usage' ], }, }, - 第三步:硬编码Karma配置,避免依赖版本变动导致默认值漂移
在karma.conf.js的config配置块中,直接写入固定配置,不依赖默认值:config.set({ // 保留原有其他配置,比如frameworks、files、preprocessors等 singleRun: true, autoWatch: false, restartOnFileChange: false, browsers: ['Chrome_Max'] }) - 第四步:锁死依赖版本
确保package-lock.json或yarn.lock文件提交到代码仓库,CI环境安装依赖时优先使用npm ci或yarn install --frozen-lockfile,避免自动安装到存在进程退出bug的依赖版本(此前karma-chrome-launcher@3.1.x、karma@6.3.x均出现过跑完测试不杀子进程导致挂死的问题)。
内容的提问来源于stack exchange,提问作者prakashrajansakthivel
相关产品推荐
相关产品推荐

