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

Azure DevOps管道Angular测试通过后任务卡住超时解决方案

Azure DevOps 运行Angular单元测试跑完不退出超时解决方法

问题根因

这类测试全过但进程挂死不退出的问题,90%以上是两个原因:

  1. Karma默认开启watch监听模式,测试跑完后不会主动退出,持续等待文件变更重跑。之前能正常跑是因为旧版依赖默认在CI环境自动关了watch,上周不管是依赖小版本升级还是Azure管道基础镜像更新,这个默认行为变了,就会挂死。本地因为有全局Karma配置或者本地环境变量自动关了watch,所以不会复现。
  2. 无头Chrome在CI容器/虚拟机环境下缺少必要启动参数,测试跑完后Chrome进程残留,导致父Karma进程收不到退出信号一直挂着。

修复步骤

  • 第一步:给所有测试执行命令强制关闭监听模式,开启单次运行配置
    不管是直接写在管道yaml里的命令,还是package.json里的脚本命令,都追加--watch=false --single-run=true参数:
    1. 管道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代替隐式安装,保证依赖版本和锁文件完全一致。

    1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:03:32