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

如何在Azure Pipelines中运行.NET+Angular项目的Cypress测试

解决Azure Pipeline中.NET Angular应用的Cypress测试问题

核心问题分析

直接用dotnet run &会出现两类问题:

  • 流水线任务会等待后台进程结束,导致挂起
  • 即使后台启动了应用,Cypress可能在应用完全就绪前就发起请求,导致连接失败
  • Azure Pipeline的任务默认存在隔离性,后台进程可能在任务切换时被强制终止

可行的Pipeline YAML配置

以下是完整的流水线配置,包含应用启动、就绪等待、Cypress测试、失败终止的完整逻辑:

trigger:
- main

pool:
  vmImage: 'windows-latest' # 若使用Linux环境,替换为ubuntu-latest并调整脚本语法

steps:
- task: UseDotNet@2
  displayName: '安装.NET SDK'
  inputs:
    packageType: 'sdk'
    version: '6.x' # 替换为你的项目实际SDK版本

- task: NodeTool@0
  displayName: '安装Node.js'
  inputs:
    versionSpec: '18.x' # 匹配Cypress官方支持的Node版本

- script: dotnet restore
  displayName: '还原.NET依赖'

- script: dotnet build --configuration Release --no-restore
  displayName: '编译.NET项目'

- script: npm install
  workingDirectory: 'ClientApp'
  displayName: '安装Angular/Cypress依赖'

- powershell: |
    # 后台启动.NET应用,输出重定向到日志文件
    Start-Process dotnet -ArgumentList "run --configuration Release" -RedirectStandardOutput "app.log" -RedirectStandardError "app.err" -NoNewWindow

    # 等待应用就绪,轮询指定端口的监听状态
    $port = 44442
    $timeout = 300 # 超时时间(秒)
    $elapsed = 0
    while ($elapsed -lt $timeout) {
      $listener = Get-NetTCPConnection -LocalPort $port -ErrorAction SilentlyContinue
      if ($listener) {
        Write-Host "应用已在端口$port就绪"
        break
      }
      Start-Sleep -Seconds 5
      $elapsed += 5
    }

    if ($elapsed -ge $timeout) {
      Write-Error "应用启动超时,未在端口$port监听"
      exit 1
    }
  displayName: '启动.NET应用并等待就绪'

- script: npx cypress run
  workingDirectory: 'ClientApp'
  displayName: '运行Cypress测试'
  continueOnError: false # 测试失败则直接终止流水线

- powershell: |
    # 清理.NET应用进程
    $processes = Get-Process dotnet -ErrorAction SilentlyContinue
    foreach ($process in $processes) {
      try {
        Stop-Process -Id $process.Id -Force
      } catch {
        Write-Host "清理进程$($process.Id)失败: $_"
      }
    }
  displayName: '清理应用进程'
  condition: always() # 无论测试成功失败都执行清理

关键细节说明

  • 应用启动与就绪等待:用Start-Process后台启动应用避免挂起;通过轮询端口监听状态,确保应用完全启动后再执行Cypress测试
  • 端口问题排查:确认.NET项目launchSettings.json中指定的端口为44442,也可以在dotnet run时添加--urls "https://localhost:44442"强制指定端口,避免端口不一致
  • 任务隔离规避:所有操作放在同一个Job中,不同Job运行在独立虚拟机上,localhost无法跨Job互通
  • 失败终止逻辑:continueOnError: false确保Cypress测试失败时,流水线直接终止,不进入后续步骤

Docker备选方案(可选)

如果需要更隔离的测试环境,可以将.NET和Angular打包为Docker镜像:

  1. 编写Dockerfile构建包含应用的镜像
  2. 在Pipeline中启动容器并映射端口到主机
  3. 配置Cypress连接容器映射的端口
    该方案复杂度更高,适合复杂场景,简单场景使用上述直接启动方案即可解决问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:50:12